Chapter 05. 파일 및 디렉토리 검색
- grep
- 파일이나 디렉터리에서 특정 단어를 검색하거나 조회
- grep -i root /etc/passwd → 안에 있는 파일에서 대소문자 구별 없이 root가 포함된 글자를 조회한다. 옵션을 넣지 않으면 대소문자를 구별하여 조회한다.
- grep -v root /etc/passwd → root를 제외하고 나온다.
- grep -w root /etc/passwd → root를 단어 단위로 검색해준다. 중간에 껴있는 것은 제외한다.
- 정규 표현식 메타문자
- grep ^root /etc/passwd→ 해당 단어로 시작하는 줄을 찾아 보여준다.
- grep root$ /etc/passwd → 해당 단어로 끝나는 줄을 찾아 보여준다.
- grep r..t /etc/passwd → r로 시작하고 t로 끝나는 4글자를 보여준다.
- grep ro*t /etc/passwd → 0개 이상 반복되는 패턴을 찾는다.
- grep [Ss]ystem /etc/passwd → 대문자 시스템과 소문자 시스템을 모두 찾는다.
- grep [^a-q]ocky /etc/passwd → 첫글자가 a부터 q가 아닌 ocky 을 찾는다. 제외하는 방법
- grep “s\{3\}d” /etc/passwd → s가 세번 오고 d로 끝나는 패턴(크게 쓰지 않는다.)
- egrep
- grep의 확장 버전
- 확장된 정규표현식을 지원한다.
- man grep을 통해 확인해보면 grep에서 확장 정규표현식을 지원하는 옵션이 있다.
- grep -E == egrep (같은 명령어다. 동일하게 동작한다.)
- egrep ‘s(s|h)’ /etc/passwd → s 뒤에 s 또는 h가 포함된 라인을 찾기
- egrep “ftp|lib” /etc/passwd → ftp 혹은 lib가 포함된 것을 찾기
- fgrep
- f는 fixed, 고정의 의미다. 정규표현식이 아니라 문자열 그대로 찾는다는 것이다.
- fgrep "root$" /etc/passwd → $표시를 정규표현식으로 인식하는 것이 아니라 문자열 그대로 $로 찾는다.
- find
- 조건에 맞는 파일이나 디렉토리를 찾아주는 도구이다.
- find 경로 조건 동작
- find /etc/ -name hosts → 해당 경로에서 이름이 hosts인 것을 찾아줘
- find /etc/ -name “*.conf” → .conf 확장자를 가진 파일 찾기
- find /etc/systemd/ -name “*socket*” -type d → 디렉토리 타입에 socket 포함된 것 찾기
- find /home/ -user nobreak → 특정 사용자가 소유한 파일이나 디렉터리를 찾기
- find /user/bin/ -size +1M → 1MB보다 큰 파일들을 찾는다. +1M은 아규먼트다.
- find /var/log/ -mtime -7 → 7일 이내의 수정된 파일만 찾는다.
- find /etc/system/ -name “*socket*” -ls → 찾은 파일의 정보를 상세하게 보여준다.
- find ~ -name fileB -type f -exec rm {} \; → 홈디렉토리에서 fileB인 파일을 찾고, rm을 실행한다.
- exec를 기준으로 앞부분은 조회하는 부분이다.
- 조회를 통해 찾은 부분이 {}에 들어간다. fileB가 들어가게 된다.
- \;을 통해 해당 명령을 끝낸다. 백슬래시를 쓰는 이유는 세미콜론은 셸에서 특별한 의미가 있기 때문에 그대로 쓰지 않고 이스케이프를 해서 find에 전달한다.
- find ~ -name “file*” -ok rm {} \; → 삭제하기 전에 사용자에게 확인 요청을 한다.
Chapter 06. vi 편집기 사용
- vi 편집기 → 명령어 기반의 텍스트 편집기
- vim
- vi의 개선 버전이 vim이다. 현대 리눅스는 vim을 기본 편집기로 사용한다.
- vim은 30년 넘게 발전했고, 거의 모든 리눅스에서 사용된다.
- 높은 확장성이 있다.
- vi 편집기 키 조합
- h : 왼쪽 키
- j : 아래쪽 키
- k : 위쪽 키
- l : 오른쪽 키
- w : 다음 단어 단위로 이동
- e : 다음 단어 끝으로 이동
- b : 이전 단어 단위로 이동
- g : 파일의 맨 처음으로
- G : 파일의 맨 마지막으로
- 모드
- Command 모드(일반 모드) → 입력 모드 (Insert 모드)
- Edit 모드
- Last Line 모드 (저장 등 가능) → Command 모드에서 :기호 입력 시 사용 가능
- Visual 모드 → vim에서 추가된 것. 블록 단위 선택(드래그) 가능
- :q! : 를 입력해서 나가기
- :wq! : 를 통해서 저장 및 나가기
- i : insert mode로 입력할 수 있는 상태가 된다.
- vi test → 일반 모드 → i로 입력 → esc로 다시 일반모드 → :q로 나가거나 :wq로 저장 후 나가기
- insert시 I와 A를 활용하여 맨앞, 맨뒤로 쉽게 가도록 하자
- 커서 위치 뒤쪽에 문자를 삭제 → x, 커서 위치 앞쪽에 문자를 삭제 → X
- dd → 라인 삭제, 5dd → 5줄 삭제, dw로 단어 단위 삭제
- D → 커서의 시작부터 줄 끝까지 삭제
- yy 또는 Y → 현재 라인 복사
- p, P → 복사한 라인 붙여넣기
- 5y → 복사
- yw → 단어복사
- 컨트롤 z → 해당 작업을 백그라운드로 돌리기, 리눅스에서 쓰면 안된다.
- 이전 작업으로 돌아가기 → u, 컨트롤 U → 다시 돌아가기(?)
- 특정 단어를 찾은 뒤 다른 단어로 치환
- :%s/old/new/ gc → 전체(g)에 대해 물어보면서(c) 단어 변경
- :1,10s/old/new → 1~10번째 줄에 대해서만 치환하기
- :set nu → 넘버링 → 이 설정을 저장해두지 않으면 매번 일일히 넣어줘야 함.
- vi ~/.vimrc → syntax on(다음 줄)set number → :wq
- vi qq
- echo “alias vi=’vim’” >> ~/.bashrc
Chapter 07. 퍼미션 이해 및 사용
- 리눅스는 여러 사용자들이 다중 작업이 가능하다.(다중 사용자 시스템) → 커미션이 필요하다.
- 사용자 구분
- 루트 사용자 → 슈퍼 유저, 시스템의 모든 권한을 갖는다. 관리자 권한
- 시스템 사용자 → 특정 서비스를 운영하기 위해 존재한다. 예) Apache 사용자, MySQL 사용자
- 일반 사용자 → 보통의 실제 사람들이 사용하는 계정, 고유한 ID를 갖는다.
- 예) nobreak (사람이 보는 용) - UID (시스템 내부, 이것으로 사용자를 구별한다.)
- 992:992 → UID:GROUPID
- 201 ~999 → 시스템 사용자
- 1000 ~ 60000 → 일반 사용자
- id -u 1000 → uid가 1000인 유저 id가 나온다.
- group
- 하나의 사용자는 하나의 주그룹(primary group)을 갖는다. 여러개의 보조 그룹을 가질 수 있다.
- gid → 사용자의 주그룹 ID
- 보조그룹은 여러개를 추가해서 사용할 수 있다.
- su, sudo
- su → 다른 사용자로 변경하는 명령어
- sudo → 자신의 비밀번호를 통해서 일시적으로 루트 권한을 얻는 방법
- 일시적이기 때문에 안전한 방식이다. 모두가 쓸 수 있는 것은 아니고 먼저 등록해놓은 사용자만 루트를 쓸 수 있다.
- 일반 사용자는 $, 루트 사용자는 #으로 구별한다.
- 퍼미션
- 맨처음은 파일 타입, 9개는 권한
- 세글자씩 나눠서 본다.
- 권한
- r → 읽기 권한, w → 쓰기 및 수정 권한, x → 실행 권한
- 퍼미션 결정 로직
- 디렉터리를 조회 및 이동하기 위해서 필요한 권한이 무엇인가요?
- 조회 → 읽기 권한
- 실행 권한이 없다면 해당 디렉토리에 이동할 수 없음
- 디렉터리 읽기 권한이 없다면 안에 파일을 볼 수 없다.
- w, x가 있고 r이 없다면, 파일을 만들고 이동할 수 있으나 확인할 수 없다.
- 퍼미션 모드
- 심볼릭 모드와 8진수 모드로 나눠진다.
- 심볼릭 모드의 변경
- chmod mode filename → 권한 변경 명령어
- chmod u+x testA, chmod u-x testA → 소유주에 실행권한 추가, 삭제
- nobreak@rocky-node1:~$ chmod u+rwx,go+r-wx myfile → 소유자에게 모든 권한, 그룹과 기타 사용자에게 읽기 권한만 설정
- 8진수 모드의 변경
- R → 4, W → 2, E → 1
- 4(2^2)+2(2^1)+1(2^0) = 7
- 더해서 표현한다.
- chmod 777 testfileA → 모든 권한이 다 들어간다.
- chmod 666 testfileA → 모든 사용자가 읽기와 쓰기
- 8진수 방식을 좀 더 쓴다.
- 755, 644, 700 → 보통 많이 쓴다.
- 700 → 자기 자신에만 모든 권한이 있으므로 보안에 민감한 파일이다.
- umask
- user mask의 약자로 새롭게 생성되는 파일과 디렉토리의 권한에서 무엇을 설정할지 지정한다.
- umask에 의해서 기본 권한이 설정되고, umask 명령어로 추후에 변경도 가능하다.
- 보안상의 이유로 불필요한 권한을 제거해야 한다. 매번 일일이 권한을 제거하는 것이 아니라 기본 권한을 설정해 두면 그 권한이 기본적으로 적용되게 한다.
- 0022 → 그룹과 기타 사용자에서 쓰기 권한을 제거
- 777 → 755, 666 → 644
- 0027로 설정 시 666 - 027 ⇒ 647, 777 - 027 = 750
- 현재의 쉘에서만 유효하다.
- vi .bachrc, vi .bask_profile → 자동으로 쓰기 위해 쉘에서 기록한 것을 파일 안에다가 적어둔다.
- chown → 소유주 혹은 소유그룹 변경
- sudo chown root:root ub_dir/ (둘다 변경, :B → 그룹만 변경)
- sudo chown nobreak (소유주만 변경) nb_dir/
- sudo chown :testuser (그룹만 변경)
nobreak@rocky-node1:~$ umask
0022
# 666 - 022 = 기본 파일 권한
# 777 - 022 = 기본 dir 권한
nobreak@rocky-node1:~$ umask 027
nobreak@rocky-node1:~$ umask
0027
# umask를 027로 변경함
# 666 - 027 = 기본 파일 권한
# 777 - 027 = 기본 dir 권한
nobreak@rocky-node1:~$ mkdir qwer3 && touch qwer4
nobreak@rocky-node1:~$ ll
total 8
drwxr-x---. 2 nobreak nobreak 6 Sep 22 14:35 qwer3
-rw-r-----. 1 nobreak nobreak 0 Sep 22 14:37 qwer4
Chapter 08. 쉘 명령어 사용
- 쉘 → 리눅스 시스템과 소통하는 인터페이스
- 쉘 메타문자 → 쉘에서 특별한 의미를 갖고 특정한 기능을 수행하는 신호이다.
- $ → 환경 변수 출력 시 사용. 예) $HOME
- ; → 여러 명령어 사용 시 예) ls; pwd; date
- ~ (틸드) : 사용자의 홈 디렉토리로 넘어가는 문자
- -(대시) : 이전 경로로 되돌아가기
- 파일 이름 대체 메타문자
- *(별표) 문자: 0개 이상의 문자를 대체하는 문자 예) ls fi*
- ?(물음표) 문자: 하나의 문자를 대체하는 문자
- [](대괄호) 문자: 범위를 지정할 수 있음
- 예) ls dir[AB]
- touch file[af] → 안됨 → 조회 시만 가능한 것임.
- 쉘의 환경변수 (중요)
- 시스템 동작 및 쉘의 환경을 정의, 중요한 역할을 한다.
- Key-Value 형식을 띄고 있다.
- $HOME, $PATH, $USER
- 메모장에 중요한 것을 적어두고 꺼내오는 것과 같다.
- $PATH → ls 등 명령어를 경로에서 찾는다. ls 등 파일이 있고 그 파일에 대한 경로를 $PATH로 찾는다.
- 콜론을 기준으로 찾을 때까지 계속 다음 것을 보면서 찾는다.
- /usr/bin → 이런 곳에 대부분 있다.
- 경로가 안맞으면 파일을 찾을 수 없고 실행할 수 없다.
- pwcat이 있음에도 안 나왔던 것은 경로로 지정이 안되어서 그렇다.
- find ~ \ -name “*” … → 역슬래시로 개행을 할 수 있다. 리눅스는 알아서 연달아 파악한다.
- AND(&&), OR(||) → 명령 실행 결과에 따라서 다음 실행 여부를 결정한다.
- && → 성공하면 다음 명령 실행
- || → 실패하면 다음 명령 실행
- ls fileA && echo “File X” → 파일이 있는 경우(성공했을 때만) echo 실행
- ls 없는 파일 || echo “file not found” → ls 없는파일이 실패하면 file not found를 출력해라.
- 입출력 리다이렉션
- 재지정(리다이렉션)
- 표준 입력(stdin) → 키보드
- 표준 출력(stdout) → 터미널 화면
- 표준 오류(stderr) → 터미널 화면
- date > date.txt
- cat date.txt
- 한번 더 하면 덮어써진다.
- date >> date.txt
- 덮어써지는 것이 아니고 새롭게 뒤에 추가된다. 대부분 사용한다.
- 파이프(|)
- ls -l /etc/passwd | grep r
- 파이프를 사용하여 하나의 명령어의 출력 결과를 다음 명령어의 입력값으로 사용한다.
- 인용부호 메타문자
- echo “Hello, $USER” → 쌍따옴표는 변수의 값을 출력한다.
- echo ‘Hello, $USER’ → 홑따옴표 변수(메타문자)의 값이 아니라 평문 그대로 출력한다.
- history
- 지금까지 입력한 명령어 목록을 볼 수 있다.
- 쉘의 기능, 어딘가에서 이 내용들을 저장하고 있다.
- !140 → 140번째 히스토리 명령어를 가져와서 실행한다.
- !ls → 가장 최근에 실행한 ls로 시작하는 명령어를 실행한다.
- 컨트롤 + R → 히스토리를 검색해서 탭 키로 뽑아서 쓴다.
- alias
- 별칭
- alias 설정을 세션 뿐 아니라 영구적으로 하고 싶다.
- alias cls='clear' 을 vi ~/.bashrc 로 저장 후 (영구적인 설정 파일에 넣어줘야 한다.)
- source ~/.bashrc 하여 불러오면 cls를 해도 clear가 동작하여 설정이 적용된 것을 볼 수 있다.
Chapter 09. 쉘 프로그래밍
- 리눅스에서 반복적인 작업을 자동화하기 위해서 사용하는 스크립트 언어
- 반복적인 명령어들을 스크립트로 작성해놓으면 자동화할 수 있다.
- 쉘 스크립트 → 프로그래밍 언어와 차이가 있다.
- 프로그래밍 언어는 컴파일 과정을 거친다.
- 쉘 스크립트는 인터프리터가 한줄 씩 읽으면서 실행을 한다.
- 확장자 → .sh
- 셔뱅 → #!
- 셔뱅으로 스크립트를 시작한다.
- #! /bin/bash → bash 쉘로 실행하라.
- #! /usr/bin/python3 → 파이썬 스크립트를 찾아서 실행해라.
- #! /usr/bin/ruby
- sh [sample.sh](<http://sample.sh>) (간단히 실행)
- chmod +x [sample.sh](<http://sample.sh>) → ./sample.sh (일반적인 실행)
- 스크립트에 변수를 만들어서 쓸 수 있다. 쉘도 마찬가지.
- 그러나 현재 쉘에서만 적용되는 것이다.
- 로그인할 때마다 쓰고 싶다면 또 저장해야 한다.
- nobreak@rocky-node1:~$ export MYVAR="share var"
→ 종속적인 자식 쉘에서만 사용 가능 → 어딘가에 또 적어놓아야 한다.
- vi .bashrc로 접근하여 가장 아래에 export MYVAR="share var"을 적고 저장한뒤 sudo su - nobreak로 재로그인 하여 echo $MYVAR로 확인해보면 확인 가능하다.
- bash를 쓰니 bashrc, zshell을 쓰면 zshrc일 것이다.
- $0 → 스크립트 이름
- $1 ~ → 인수
- $@ → 인수를 for문 반복하여 돌린다.
nobreak@rocky-node1:~$ vi arg.sh
nobreak@rocky-node1:~$ cat arg.sh
#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "second arg: $2"
echo "Number of arg: $#"
for arg in "$@"
do
echo "Argument: $arg"
done
nobreak@rocky-node1:~$ chmod +x arg.sh
nobreak@rocky-node1:~$ ./arg.sh
Script name: ./arg.sh
First argument:
second arg:
Number of arg: 0
nobreak@rocky-node1:~$
nobreak@rocky-node1:~$ ./arg.sh hello world
Script name: ./arg.sh
First argument: hello # 첫 번째 argument
second arg: world # 두 번째 argument
Number of arg: 2 # 인수의 개수 출력
Argument: hello # for문으로 반복하여 인수 출력
Argument: world
nobreak@rocky-node1:~$ vi name.sh
nobreak@rocky-node1:~$ cat name.sh
#!/bin/bash
echo "what is your name?:"
read name # name 변수에 입력되는 값을 대입
echo "hello, $name" # name 변수를 넣어서 문자열 출력
nobreak@rocky-node1:~$ chmod +x name.sh
nobreak@rocky-node1:~$ ./name.sh
what is your name?:
hyuk
hello, hyuk # 굿~!
nobreak@rocky-node1:~$