SECURITY ::/Security Academy

6일차 - 리눅스 기초실습 04

bbombi 2024. 3. 10. 00:07

 

 

 

 


 

 

* 프로세스(Process) : 현재 실행중인 프로그램

 - 프로세스의 부모-자식 관계를 가짐

 - 스케줄러가 실행한 프로세스인 init와 kthreadd 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가짐

 

* 프로세스 구성요소

 - process ID (PID)

 - priority

 - nice value

 - memory

 - environmenrt

 - file handles

 - exit status

 

* 프로세스의 상태

 - running

 - stopped

 - sleeping

 - un-interruptable

 - zombie

 

 

* ps : 프로세스 보기

 

* pgrep : 특정 프로세스 정보 검색

 기본 형식 ) pgrep <옵션><패턴>

 옵션 ) -x : 패턴과 정확히 일치하느 ㄴ프로세스 정보를 출력

           -n : 

           -u user

 

* top : 실시간 프로세스의 상태 보기

 - 현재 시스템의 상태에 대한 요약 정보 및 통계 제공. 실시간 방식으로 처리(3초마다). cpu사용량, 메모리, uid 등과 같은 다양한 기준에 따라 프로세스 정렬. 프로세스로 신호를 보낼 수 있음.

 

* 프로세스의 종류

 - background process : command &

 - foreground process : command

 

* 시그널(Signal) : 동작 중인 프로세스에게 전달하는 특정 메시지

 - foreground process 에게 시그널 전달

  • Ctrl + c
  • Ctrl + z
  • Ctrl + d

 - background process 에게 시그널 전달

  • kill 명령

 

* swp : vi 편집기에서 작업 중 비정상적인 종료시 swp 확장자 파일이 생겨남. 사용자가 예기치 못한 파일의 손상이나 유실을 막기 위해 생기는 백업 성질의 파일로, 유사시에 유용함.

 

* kill : 동작 중인 프로세스에게 시그널 전달

 

 

* 시스템 제어 명령어

* systemctl : 리눅스 서비스의 시작, 종료, 상태 확인 등을 수행. 

기본 형식 ) systemctl <명령><서비스명>

 

ex)

root@ubuntu:~# sudo systemctl status apache2

root@ubuntu:/var/www/html# cat index.html
<h5>hi ho</h5>

 

 

 

* Shell : 사용자 명령어 해석기

 - 사용자가 명령어 해석기

 - 사용자가 프롬프트에 입력한 명령을 해석해서 운영체제에게 전달

 

* 사용 가능한 shell 리스트 확인

root@ubuntu:~# cat /etc/shells

 

 

* 현재 작업 shell  확인

root@ubuntu:~# echo $SHELL
/bin/bash

 

 

* 다른 종류의 shell 쓰는 방법

ex)

 //  1) apt 명령으로 사용하고 싶은 shell 설치
$ sudo apt install <SHELL-PACHAGE>
 //  2) default shell 을 변경
$ sudo chsh <USERNAME>
//  3) 확인
$ sudo grep <USERNAME> /etc/passwd

 

 

* Shell의 변수란

 - 데이터를 넣는 그릇

 - 선언할 필요 없이 사용 가능

 - 변수명 : 문자, 숫자, _(언더바)로 구성될 수 있지만, 시작은 반드시 문자나 _로 시작

 

ex) 

// 변수선언 : varname =value
 $ fname=username
 $ score=90

// 변수확인 : echo, set
$ echo $fname
$ set

// 변수제거 : unset varname
 $ unset fname
 
// 예시
root@ubuntu:~# fname=ho
root@ubuntu:~# echo $fname
ho
root@ubuntu:~# set
BASH=/bin/bash
...

root@ubuntu:~# set | grep fname
fname=ho
root@ubuntu:~# unset fname
root@ubuntu:~# set | grep fname
_=fname

 

 

 

* Shell 환경 변수란?

 - 동작되는 프로그램에게 영향을 주는 변수

 

* 환경 변수 선언 : export varName=value

 $ export NAME=lee

 $ echo $NAME

root@ubuntu:~# export $PATH=$PATH:/실행경로추가

// 1. 환경 변수 설정하기 (변수명=값)
vboxbibi@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
vboxbibi@ubuntu:~$ PATH=$PATH:/home/vboxbibi/bin
vboxbibi@ubuntu:~$ echo $PATH // 환경변수 조회
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vboxbibi/bin

// 2. 위의 방법은 리부팅 시 환경 변수 값이 사라짐
// 환경 변수를 영구적으로 설정하려면!

// ~/.bashrc 파일을 열고 파일 마지막에 환경 변수를 추가
vboxbibi@ubuntu:~$ vi ~/.bashrc
// 파일 저장 후 닫기
export PATH=$PATH:/home/vboxbibi/bin
// 터미널 재실행 하거나 source 명령어를 사용하여 실행 후 유지되는지 확인해보기

 

cf ) bashrc 파일에서 alias(별칭)을 설정할 수 있음

 - ex) alias ll='ls -l' -> 이후 터미널에서 ll을 입력하면 ls -l 명령어가 실행됨.

 

 

* 시스템에 적용된 환경 변수 확인 : echo

$ env

 

* 기억해야 할 환경변수

  • PATH : 명령어 탐색 경로
  • HOME : 홈 디렉토리의 경로. cd 명
  • USER : 로그인 사용자 이름
  • SHELL : 로그인 shell의 이름

 

* Shell의 Quoting Rull

 - Metacharacters : 

Shell에서 특별히 의미를 정해 놓은 문자들

 

* Command 치환

 - 명령어의 실행 결과를 치환하여 명령을 실행

* Nesting Commands

 $(command)

 'command'

// 출력 확인
vboxbibi@ubuntu:~$ echo "Today is $(date)"
Today is 2024. 02. 29. (목) 11:49:32 KST
vboxbibi@ubuntu:~$ echo "Today is 'date'"
Today is 'date'

 

 

* Shell의 alias 

 - Shell의 명령에 새로운 이름을 부여

 - 명령들을 조합하여 새로운 이름의 명령을 생성

* alias 관리 명령

 - 등록 : alias name='command'

 - 확인 : alias or alias name

 - 삭제 : unalias name

// alias 확인
vboxbibi@ubuntu:~$ alias 
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
// alias 등록
vboxbibi@ubuntu:~$ alias rm='rm -i'
vboxbibi@ubuntu:~$ rm test02
rm: remove regular empty file 'test02'? n
// alias 삭제
vboxbibi@ubuntu:~$ unalias rm

 

 

* Shell의 prompt

 

cf) $ vi ~/.bashrc  명령어로

ps1 변수 부분에서, ANSI Color를 참고하면 색상 바꾸기 할 수 있음.

 

 

* Shell 의 Redirection

vboxbibi@ubuntu:~$ cat a 2 > error
vboxbibi@ubuntu:~$ cat error
cat: a: No such file or directory
vboxbibi@ubuntu:~$ ls
error

 

 

 

* Shell의 Pipeline

* Pipeline

  • 명령의 실행결과를 다음 명령의 입력으로 전달
  • 리눅스의 명령어를 조합하여 사용
  • 기호 : command1 | command2 | command3

// 1.
vboxbibi@ubuntu:~$ ls -l | more
vboxbibi@ubuntu:~$ ls -l / | less
// 2.
vboxbibi@ubuntu:~$ history | more
// 3.
vboxbibi@ubuntu:~$ ls -al | cat -n | more
// 4.
vboxbibi@ubuntu:~$ du -h /bin/* | sort | more		// abc 정렬
vboxbibi@ubuntu:~$ du -h /bin/* | sort -n | more	// 크기정렬
// 5.
vboxbibi@ubuntu:~$ du -h /bin/* | sort -rh | head -n 7
// 6.
vboxbibi@ubuntu:~$ env | grep USER	// 확인
USER=vboxbibi
vboxbibi@ubuntu:~$ cat /etc/passwd | grep $users
// 7-1. 현재 사용자로 실행된 모든 프로세스를 출력
vboxbibi@ubuntu:~$ ps -u $vboxbibi
// 7-2. 모든 프로세스를 출력하되, 특정 사용자에 대한 프로세스만 필터링
vboxbibi@ubuntu:~$ ps -e $vboxbibi

 

 

* Linux Shell Script란?

 - 리눅스 command들을 모아 놓은 ASCII Text 파일

 - 실행 퍼미션을 할당해야 실행 가능

// 실습1.
// 파일 작성
vboxbibi@ubuntu:~/bin$ vi sample.sh
#!/bin/bash
# Version       : 1.0
# Description   : Print hello world! for Linux
echo "Today: $(date +%Y-%m-%d)"
echo "Hello, Linux World"

// 실행
vboxbibi@ubuntu:~/bin$ sample.sh
Today: 2024-02-29
Hello, Linux World
// 실습2.
// 파일 작성
vboxbibi@ubuntu:~/bin$ vi var-usage.sh
#!/bin/bash
# Description   : Print /var directory usage
echo "[/var Directory]"
echo "=================================================="
date +%Y-%m-%d
echo "=================================================="
du -sh /var 2> /dev/null
echo

// 실행
vboxbibi@ubuntu:~/bin$ chmod +x var-usage.sh
vboxbibi@ubuntu:~/bin$ var-usage.sh
[/var Directory]
==================================================
2024-02-29
==================================================
2.7G	/var

 

 

* 위치 매개변수

// 실습1.
// 파일 작성
vboxbibi@ubuntu:~/bin$ cat parameter-exam1.sh 
#!/bin/bash
#Usage : parameters-exam1.sh arg1 arg2 arg3
echo "THe script name: $0"
echo "THe first argument: $1"
echo "THe second argument: $2"
echo "THe number of arguments: $#"
echo "THe list of arguments: $@"
echo "THe list of arguments: $*"

// 파일 실행 결과 보기
vboxbibi@ubuntu:~/bin$ chmod +x parameter-exam1.sh 
vboxbibi@ubuntu:~/bin$ parameter-exam1.sh red green blue
THe script name: /home/vboxbibi/bin/parameter-exam1.sh
THe first argument: red
THe second argument: green
THe number of arguments: 3
THe list of arguments: red green blue
THe list of arguments: red green blue
실습2.
// 파일 작성
vboxbibi@ubuntu:~/bin$ cat directory-usage.sh 
echo "[$1 Directory]"
echo "======================================================="
date +%Y-%m-%d
echo "======================================================="
du -sh $q 2> /dev/null
echo

// 실행
vboxbibi@ubuntu:~/bin$ chmod +x directory-usage.sh 
vboxbibi@ubuntu:~/bin$ directory-usage.sh /var
[/var Directory]
=======================================================
2024-02-29
=======================================================
20K	.

 

 

* Prints text to standard output

형식 ) echo <옵션><메시지>

 

* read : 변수명 생략 시 기본 REPLY 변수에 채워짐

 

* print : 서식 format에 맞춰서 출력할 수 있음.

형식 ) printf format <메시지>

옵션 ) %d or %i : 숫자

          %s : 문자열

          %f : 실수형 숫자

vboxbibi@ubuntu:~/bin$ printf "hello linux shell\n"
hello linux shell

vboxbibi@ubuntu:~/bin$ today=$(date +%Y-%m-%d)
vboxbibi@ubuntu:~/bin$ printf "date is %s\n" "$today"
date is 2024-02-29

 

 

* 실습

// 실행 파일 만들기
vboxbibi@ubuntu:~/bin$ cat temp.sh 
echo -n "Enter the Celsius: "
read celsius
fahrenheit=$(echo "scale=2; $celsius * 9 / 5 + 32" | bc)
echo "Fahrenheit is $fahrenheit"

// 실행
vboxbibi@ubuntu:~/bin$ chmod +x temp.sh
vboxbibi@ubuntu:~/bin$ temp.sh
Enter the Celsius: 20
Fahrenheit is 68.00

 

 

* exit : 실행된 프로그램이 종료된 상태를 전달

// ex)
vboxbibi@ubuntu:~/bin$ cp file1
cp: missing destination file operand after 'file1'
Try 'cp --help' for more information.
vboxbibi@ubuntu:~/bin$ echo $?
1
vboxbibi@ubuntu:~/bin$ sleep 100
^C
vboxbibi@ubuntu:~/bin$ echo $?
130

 

 

* test 연산자

 - 비교연산자 test <명령어> or [명령어]

* 명령어 실행결과를 true 또는 false로 리턴함

* test 명령어는 다양한 연산자를 지원함

********* -f file -> 파일이 일반 파일이면 true를 리턴 으로 수정해야함!

             -x file -> 실행 파일이고, 실행 권한이 있으면 true를 리턴 으로 수정해야함!

 

 

* if-then-fi

* 조건 명령어. command 실행 결과에 따라 서로 다른 command를 실행

 

// 실습1.
vboxbibi@ubuntu:~/bin$ cat number.sh
// 작성
echo -n "Input the number : "
read number
if [ "$number" -gt 5 ]; then
    echo "It is greater than 5."
else
    echo "It is less than or equal to 5."
fi

// 실행
vboxbibi@ubuntu:~/bin$ number.sh
Input the number : 4
It is less than or equal to 5.

 

 

 

* case .. in

 - $var의 값에 따라 선택해서 명령어를 실행

// 실습
// 작성
vboxbibi@ubuntu:~/bin$ cat case-exam.sh 

cat << END
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
END

echo -n "number: "
read number
case $number in
	1) df -h;;
	2) who;;
	*) echo "Bad choice!"
		exit 1;;
	esac
	exit 0

// 실행
vboxbibi@ubuntu:~/bin$ chmod +x case-exam.sh 

vboxbibi@ubuntu:~/bin$ case-exam.sh 
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 1
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           775M  1.4M  773M   1% /run
/dev/sda3        34G   13G   20G  40% /
...

vboxbibi@ubuntu:~/bin$ case-exam.sh
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 2
vboxbibi tty2         2024-02-29 14:07 (tty2)

vboxbibi@ubuntu:~/bin$ case-exam.sh
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 425
Bad choice!

 

 

cf) cat >> END : 터미널에서 여러 줄의 텍스트를 입력할 때 사용함.

이 명령어를 사용하면 텍스트를 입력하고 'END' 라는 특정 문자열을 입력하는 것으로 입력을 끝낼 수 있음.

 

 

vboxbibi@ubuntu:~/bin$ cat /etc/lsb-release 

vboxbibi@ubuntu:~/bin$ date +"%F %T"
2024-02-29 16:45:15

 

 

 

* expr : 정수형 산술연산(+, -, *, /, %), 논리연산(|, &), 관계연산(=, !=, >, >=, <, <=)

* let : 정수형 산술연산, bit 연산(<<, >>, &, |), 논리연산(&&, ||), 단항연산(++, +=, -=)

* bc : 실수연산. 강력한 계산기 도구로서 다양한 수식을 계산하고 변수를 사용하여 작업할 수 있음.

 cf) scale=2 -> 소수 2번째 자리까지 계산

vboxbibi@ubuntu:~/bin$ echo "scale=2; 10/3" | bc
3.33

 

 

* 조건부 loop

* while : while 다음의 command가 성공하는 동안 do~done 사이의 명령어를 반복 실행

* until : untile 다음의 command가 성공할 때 까지 do~done 사이의 명령어를 반복 실행

 

* for-loop : 주어진 list 만큼 do ~ done 사이의 명령어를 반복 실행

 for item in [LIST]
 do
  [COMMAND]
 done