본문 바로가기
교육

[25일 차] 21.08.24 : Linux Server 4

by ballena 2021. 8. 24.
  • 4장 : 환경/지역 변수 기억하기.

-> 사용자가 쉘을 변경할 때, 환경 변수는 유지되고, 지역변수는 확인할 수 없다.

-> 지역 변수를 환경 변수로 전환할 수는 있으나, 특정 사용자가 정의한 환경 변수는 해당 로그인 환경에만 한정된다.

-> 다른 사용자가 같이 사용하려면 사용자 환경설정 파일에 손을 대야 한다.

 

  • alias : 긴 명령을 매번 치기 번거로우니 별칭을 만들어 쓰는 것.

-> 여러 명령을 연결하거나, 특정 명령에 옵션을 기본값으로 붙일 때 사용

alias 별칭='명령' or alias 별칭='명령1;명령2;명령3;...'

 

alias를 치면 현재 로그인 사용자가 사용하는 alias 출력

명령어를 입력받으면, 명령을 실행하기 전에 alias 확인

 

alias 만들 때 주의할 점

-> 별칭='명령' 이 사이에 공백 X

-> 명령은 ' ' 로 묶을 것.

 

예시 1)

grep "^d" 입력값 -> ^는 첫번째 필드에서 d를 찾는다. 

ls -l | grep "^d" -> 현재 디렉터리에서 ls -l을 실행하고, 결과값을 grep "^d"의 입력값으로 넣는다. 현재 디렉터리의 파일 목록 중 첫 번째 필드가 d인 행을 출력한다.

 

예시 2)

alias cd='cd;pwd' -> cd를 입력하면 홈 디렉터리로 이동 후 절대 경로 출력

-> 이러면 cd로 홈 디렉터리 이외의 다른 디렉터리로 이동을 못함.

function cdpwd {

   cd $1;pwd

}

입력. $1은 파라미터 변수(위치 변수)다. 명령어가 쭉 있으면 각 필드?단어?의 위치를 나타내는 것.

예를 들면 cp -i /etc/hosts /root라는 명령어에서, $0은 cp, $1은 -i, $2는 /etc/hosts라고 보는 것이다.

그럼 cdpwd [경로값]을 실행하면, cd [경로값];pwd가 실행되는 것이다.

(함수에서 문제가 생기긴 했는데 대충 이렇게 하면 된다는 것.)

 

alias가 적용되는 것은 현재 로그인 상태에서만 가능. 로그아웃하고 다시 들어오면 사라진다는 것.

-> 새로운 bash shell이 열리기 때문이다.

 

  • 히스토리 : 사용자가 이전에 입력한 명령을 다시 불러 사용하는 것. 방향키 올리거나 내려서 이전에 실행한 명령어가 나오는데, 이게 기록들.

history를 입력하면 이전에 입력했던 명령어 목록이 쭉 나오는데, 최대 크기는 echo $HISTSIZE로 볼 수 있다(기본은 1000개)

-> 그럼 이 기록들은 어디에 저장되어 있는가? : 사용자 개인 환경 파일 중 .bash_history 파일이 홈 디렉터리에 있다. 

!! -> 직전에 실행한 명령 재실행

![번호] -> 히스토리 목록에서 해당 번호의 명령 재실행

![문자열] -> 히스토리 목록에서 해당 문자열로 시작하는 가장 최근의 명령 실행

!?[문자열]? -> 해당 문자열을 포함하는 가장 최근의 명령어 실행

 

명령어 쓰다가 수정할 때

-> 맨 앞으로 : Ctrl+a

-> 맨 뒤로 : Ctrl+e

 

로그아웃 시 홈 디렉터리에 있는 .bash_history에 히스토리 저장

-> 이 파일을 보면 이전 로그인 때 로그아웃 전에 사용한 명령어들이 저장되어 있다.

 

(중요한건 아님)

!-n -> 현재 명령행에서 n개를 뺀 명령어 출력

^문자열1^문자열2 -> 가장 최근의 명령어에서 문자열1을 문자열2로 치환해 실행

 

프롬프트 설정 변수 PS1 : 별로 안중요해서 넘어감

 

(외울 필요는 없다)

이스케이프 문자 : \로 시작하는 특별한 문자

-> 쉘에서 문자의 의미를 파악해서 실행

-> \a : 이래도 1글자로 취급된다.

-> \n : 이건 알아두기. 개행 문자

이스케이프 문자

  • 중요 : 환경 설정 파일

-> 사용자가 로그인할 때마다 자동으로 실행되는 명령을 저장한 파일

-> 시스템 환경 설정 파일과 사용자 환경 설정 파일이 있다.

-> 쉘마다 다른 이름의 파일을 사용한다.

-> 로그인 절차 이해하기

/etc/passwd 확인(아이디 정보값 확인) -> /etc/shadow 파일로 패스워드 확인 -> 로그인 쉘은 전체 사용자 환경 설정 파일을 확인 -> 사용자별 사용자 전용 환경 설정 파일 확인 -> 해당 환경 설정 파일을 적용하여 해당 사용자 로그인 완료

 

1. 시스템 환경 설정 파일 : 시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일

 

(일단 지금)기억할 것

/etc/profile : 환경 변수가 있다. 기본 접근 권한(umask)을 설정한다. 

-> 사용자 전체에 환경 변수를 적용하고 싶으면 여기에 export를 작성하면 된다.

/etc/bashrc : 전체에 적용되는 함수와 alias 설정, 기본 프롬프트 설정

 

사용자 홈 디렉터리에 이름이 비슷한 파일들이 있는데, 그건 해당 사용자에만 적용되는 환경 설정 파일.

 

2. 사용자 환경 설정 파일 : 각 사용자의 홈 디렉터리에 숨김 파일로 생성. 사용자가 내용을 수정하고 관리 가능.

관련 요소를 해당 사용자에게 영구적으로 적용하고자 한다면 이 파일들을 수정하면 된다.

수정 후 적용하려면 

사용자 환경 설정 파일 적용하기


  • 중요 : 파일 접근 권한 관리(5장)

중요한 파일에 아무나 접근하게 둘 수는 없다. 그래서 설정하는 것이 파일 접근 권한.

파일 접근 권한 보호 : 파일에 대한 무단 접근 방지/보호

사용자는 자신의 파일과 디렉터리 중에서 타인의 접근이 괜찮은 것과 아닌 것을 구분해서 접근 권한 제한

ls -l을 입력하면 나오는 형태
파일의 속성

접근 권한 표기를 보면 3개의 필드가 있는데

접근 권한 표기 방식
접근 권한의 종류

  • 접근 권한의 변경 명령 : 단, 일반 사용자는 자신의 홈 디렉터리에 있는 파일만 변경 가능

-> chmod [옵션] [권한 모드 파일 또는 디렉터리]

옵션 : -R -> 하위 디렉터리까지 모두 변경

 

1. 기호 모드 : chmod [사용자 카테고리 문자] [연산자 기호] [접근 권한 문자] 파일명

예시)

u+w -> 소유자에게 쓰기 권한 부여

u-r -> 소유자에게 읽기 권한 제거

g+wx -> 그룹에게 쓰기/실행 권한 부여

u+x,go+w -> 소유자에게 실행 권한, 그룹과 기타 사용자에게 쓰기 권한 부여

 

2. 숫자 모드

권한이 있다면 1, 없으면 0으로 표현한다. 그렇다면 한 필드의 권한이 모두 있다면 111, 모두 없다면 000으로 나타낼 수 있다. 이것을 2진수로 생각하면 숫자로 표현한 권한의 범위는 0~7이다. 각 필드는 2진수로 인지할 수 있지만, 8진수로 표현해 쉽게 볼 수 있게 한다.

rwx r-x r--를 숫자로 나타내면 754다.

각 숫자가 사용자 종류를 이미 나타내고 있어 명령어에서 따로 지정할 필요가 없다.

 

루트 사용자가 파일/디렉터리 첫 생성 시 기본 권한은 644/755

일반 사용자가 파일/디렉터리 생성 시 기본 권한은 664/775

 

기본 접근 권한 확인하기

umask값을 기본 풀 권한에서 빼는 것.

기본 풀 권한이 디렉터리는 777, 파일은 666

umask를 입력해보면 0022로 뜨는데, 맨 앞의 0은 무시하고 022만 본다.

디렉터리의 기본 풀 권한 777 - 022 = 755가 기본 권한

파일의 기본 풀 권한 666 - 022 = 644가 기본 권한

umask [옵션] [마스크 값]

옵션 : -S -> 마스크 값을 문자로 출력

* 문자로 출력되는 것은 '부여할 권한'의 의미고, 숫자로 출력되는 것은 '뺏을 권한'의 의미다.

 

위의 umask 값은 root 사용자의 경우고, 일반 사용자는 umask 숫자 값이 0002다.

/etc/profile에 기본 umask 설정 과정이 프로그래밍되어 있다.

-> UID가 특정 값 아래인가 위인가에 따라 결정한다.

-> root 사용자는 UID가 0, 일반 사용자인 user1은 1000이다.

 

umask [권한값] -> 현재 로그인 상태에서의 umask 값 변경.

설정해보고 파일/디렉터리를 만들어 보면 달라진 것을 알 수 있다.

 

umask 값은 신중히 설정해야 한다. -wx 처럼 말이 안되는 권한이 발생할 수 있기 때문.

 

umask에서 신경쓸 필요 없다던 숫자는 특수 접근 권한을 의미한다.

맨 앞자리가 0이면 일반 접근 권한이지만, 1, 2, 4면 특수 접근 권한이 설정된다.

1. SetUID(4)

해당 파일이 실행되는 동안에는 파일을 실행한 사용자의 권한이 아니라 소유자의 권한으로 실행.

-> 최소한 실행 권한은 있어야 한다. 이 방면으로 에러가 발생했다면 s가 아니라 S로 표시됨

chmod 4755 set.exe

설정되면 소유자의 실행 권한이 s로 표시된다.

어디에 쓰는가? 일반 사용자가 /bin/passwd(사용자 패스워드 변경용)로 패스워드를 변경할 때, root의 권한으로 실행되어 패스워드를 변경할 수 있게 한다.

 

SetUID가 설정된 파일을 실행하는 동안에는 root의 권한을 가지고 있기 때문에, 보안상 SetUID가 설정된 파일은 리스트화해서 관리하는 것이 좋다.

find / -user root -perm -4000 -exec ls -l {} \; > find.txt 2> /dev/null

-> SetUID가 설정된 파일을 찾아 목록을 파일에 저장

=> -4000은 4000이상을 찾으라는 의미. 그냥 4000이면 

 

2. SetGID(2)

설정된 파일을 실행하는 동안에는 파일 소유 그룹의 권한으로 실행.

마찬가지로 접근 권한에서 맨 앞에 2를 설정하면, 그룹 쪽 실행권한이 s로 표시된다.

 

3. Sticky bit(1)

디렉터리에 설정. 설정된 디렉터리에는 누구나 파일을 생성 가능.

파일을 생성한 계정으로 소유자가 설정되며, 다른 사용자가 생성한 파일은 삭제 불가.  /tmp 디렉터리가 대표적


  • 프로세스

->현재 시스템에서 실행 중인 프로그램

-> 메모리의 한계로 프로그램 전체를 통째로 메모리에 올려서 실행할 수는 없다.

-> 프로그램마다 대표 실행파일을 하나씩 메모리에 올려서 요청 사항을 처리

 

프로세스 생성 방식

1. fork() : 리눅스의 기본 방식

-> 기존 프로세스는 그대로 있고, 새로운 프로세스를 위한 새로운 메모리 할당

-> 부모 프로세스가 자식 프로세스를 리스트화해서 관리

-> 새로운 PID

2. exec()

-> 기존 프로세스는 그대로 있는데, 새로운 프로세스를 exec()에 의해 호출한 프로세스에 덮어씌운다.

-> 같은 PID

-> exec()에 의해 호출된 프로세스만 메모리에 남는다

 

pstree : 프로세스 형태를 트리 형식으로 확인

 

systemd : 시스템 관련 모든 프로세스의 조상

 

kthreadd : 커널 관련 모든 프로세스의 조상

 

PID : 각 프로세스가 가진 고유한 번호

 

프로세스의 종류 : 필요는 없지만 그냥 상식 수준. 

1. 데몬 프로세스

-> 일반적인 프로세스. 특정 서비스를 제공하기 위해 존재하며, 리눅스 커널에 의해 실행

-> 메모리에 계속 상주하며 정보 요청이 들어오면 그것을 처리하는 프로세스

-> 일반적으로 명칭 뒤에 d가 붙는다.

2. 고아 프로세스

-> 자식 프로세스가 실행 중인데 부모 프로세스가 먼저 종료되었을 경우, 자식 프로세스는 고아 프로세스가 된다.

-> systemd에 의해 처리된다

3. 좀비 프로세스

-> 자식 프로세스가 종료했는데도 프로세스 테이블 목록에 남아 있는 경우

-> 실체는 없으나 목록에 남아있는 것(defunct 프로세스). 프로세스 테이블의 용량이 부족해질 수 있다.

 

kill [시그널] [PID] : 지정한 시그널을 프로세스에 보낸다.

 

kill -l

-> signal의 종류 출력

(* 외에는 딱히 외울 필요는 없다)

1번 SIGHUP : (= Ctrl + d)프로세스 재시작

2번 SIGINT : (= Ctrl + c)실행 중지

3번 SIGQUIT : (= Ctrl + \)실행 중지(코어 덤프를 남김 = 비정상 종료)

*9번 SIGKILL : 강제 종료

*15번 SIGTERM : 정상 종료(할거 다 끝내고 기록하고 종료). kill 명령어의 기본 옵션

17번 SIGCHILD : 좀비 프로세스 종료(해당 PID 프로세스가 가지고 있는 테이블에 기록된 좀비 프로세스 삭제)

*20번 SIGTSTP : (= Ctrl + z)포그라운드 프로세스를 백그라운드 프로세스로 전환

 

프로세스 관리 명령 ps

ps [옵션]

옵션은 유닉스 옵션과 BSD 옵션만 알아두면 된다.

-e : 시스템에서 실행 중인 모든 프로세스의 정보 출력

-f : 프로세스의 자세한 정보 출력

-u uid : 특정 사용자에 대한 모든 프로세스의 정보 출력

-p pid : pid로 지정한 특정 프로세스의 정보 출력

=====

a : 터미널에서 실행한 프로세스의 정보 출력

u : 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보 출력

x : 시스템에서 실행 중인 모든 프로세스의 정보 출력

 

* 자격증 시험 보려면 ps -ef/ps au 출력 결과의 각 필드가 무엇을 의미하는지 알아둘 것.

 

포그라운드와 백그라운드

포그라운드 : 사용자와 입출력을 대화식으로 작업 수행. 사용자가 명령을 실행하는 방식. 입력한 명령어의 결과가 출력될 때까지 기다려야 한다.

백그라운드 : 명령의 처리가 끝나는 것과 관계없이 바로 프롬프트가 출력되어 다른 작업 진행 가능.

 

pgrep [옵션] [패턴] : 지정한 패턴과 일치하는 프로세스의 정보 출력

-x : 패턴과 정확히 일치하는 프로세스 정보 출력

-n : 패턴을 포함하고 있는 가장 최근의 프로세스 정보 출력

-u 사용자 이름 : 특정 사용자에 대한 모든 프로세스 출력

-l : PID와 프로세스 이름 출력

-t term : 특정 단말기와 관련된 프로세스의 정보 출력

 

Ctrl + Alt + F3, 4로 다른 터미널 진입 가능

 

pkill : 프로세스의 명령 이름으로 프로세스를 찾아 종료

-> 잘못 사용하면 대참사가 일어날 수 있으니 자제

 

top : 현재 실행 중인 프로세스에 대한 정보를 주기적으로 출력

PR(Priority) : 프로세스 우선순위. 0~39(기본값 20). 낮을수록 높은 우선순위

NI(Nice) : -20~19

PR(기본값 20) + NI가 0~39인 것. root 사용자만 NI 범위가 -20~19. 일반 사용자는 0~19

PR값 자체를 조정할 수는 없다. NI값을 조정해 PR값을 간접적으로 조정.

 

nice : 실행할 프로세스의 NI 설정

renice : 실행 중인 프로세스의 NI 설정

 

nice -n -20 top -> PR 0

nice -n +10 top -> PR 30

 

nice -19 top -> -19 아니다.

nice --19 top -> -19 맞다.

 

renice -20 -p PID -> PR 0

renice -20 -u UID -> 이 사용자가 실행시킨 모든 프로세스에 적용

 

데스크탑 환경

GNOME

 

작업 제어 : 포그라운드<->백그라운드 전환, 작업 일시 중지, 작업 종료

명령어 뒤에 &(앰퍼샌드)를 붙이면 백그라운드 프로세스로 실행된다.

 

jobs : 백그라운드 프로세스 목록을 보여준다.

jobs 명령어의 출력 정보

Ctrl + z : 포그라운드 작업을 중지

bg %작업번호 : 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환

fg % 작업번호 : 작업 번호가 지시하는 작업을 포그라운드 작업을 전환

-> 그냥 fg만 입력하면 가장 최근 작업을 전환

 

nohup 명령 & : 로그아웃 후에도 백그라운드 작업 계속 실행하기


5교시 다시 듣기

6교시 중반 프로세스

7교시 초중반 ps

 

빠르게 나가신다더니 속도는 둘째치고 분량이 장난이 아니다.

끼에에엑

댓글