9/120

김건호·2022년 2월 17일
0

Special Permissions

stickybit

자신의 소유가 아닌 파일을 삭제 또는 이동 또는 덮어쓰기 등을 할 때, 자신의 소유가 아닌 파일일 경우 실행하지 못 하게(삭제, 파일의 구조 수정 불가, 변화가 생기지 않도록) 하는 보호 기능을 부여하는 비트

예시 tmp

tmp 디렉토리는 임시 파일을 저장하는 디렉토리이다. 목적상 other영역에 write권한이 있다. other영역의 write는 생성 뿐 아니라 삭제, 복사, 이동에도 영향을 줄 수 있는데, 이 영향은 프로그램의 무결성에 손상을 주고, 프로그램의 동작을 손상시킬 수 있다. 따라서, stickybit로 보호되어 있다.

sticky bit의 설정

  • 심볼릭 : chmod o+t
  • 넘버릭 : chmod 1xxx

other의 실행권한이 있다면 소문자 t, 없다면 대문자 T로 표시
stickybit other의 write 권한, 실행권한이 필수적이기 때문에 최소필요조건은 1000비트가 아니라 1003비트이다

[root@localhost tmp]# chmod o+t /tmp/kbs
[root@localhost tmp]# chmod 1777 /tmp/kbs
[root@localhost tmp]# ls -ld /tmp/kbs
drwxrwxrwt. 3 root root 17  2월 17 05:25 /tmp/kbs

확인

[user@localhost kbs]$ rm -f aaa
rm: cannot remove 'aaa': 명령을 허용하지 않음

special permission을 찾기

find 명령어를 사용해 찾을 수 있다.

// user가 root인 루트 디렉토리내에 파일 중에서 권한에 4000, 2000을 포함하는 파일 필터링 하기 (-o == or)
[root@localhost tmp]# find / -type f -user 0 \( -perm -4000 -o -perm -2000 \) -ls

umask

파일과 디렉토리 생성 시 선언되는 기본권한을 주기 위해 설정된 마스크
기본적으로 0022로 설정되어 있다.

파일의 Permission의 최대 값은 666

  • why❓ : 파일의 기본 존재 이유는 데이터를 저장(w)하고 읽기(r) 위함.
  • 실행권한이 없는 이유 : 모든 파일이 실행파일이 되는 것을 막기 위해
    따라서, umask를 통해서 default 생성되는 파일은 절대로 실행권한을 받을 수 없다
// 666 - 023 = 643이 되었지만 파일에 실행권한은 부여되지 않음
[root@localhost ~]# umask 023
[root@localhost ~]# touch cc
[root@localhost ~]# mkdir sb
[root@localhost ~]# ls -ld cc sb
-rw-r--r--. 1 root root 0  2월 17 06:21 cc

디렉토리의 Permission 값은 최대 777

  • why❓ : 디렉토리의 실행 권한이 없다는 뜻은 접근이 불가능하다(cd 명령어 사용 불가능)이라는 뜻이기 때문에 기본적인 목적인 이동을 할 수 없기때문에

최대 Permission값에서 umask값을 뺀 값이 해당 파일, 디렉토리의 Permission이 된다. 단, 음수가 되는 경우 0으로 처리된다.


[root@localhost ~]# umask
0022
[root@localhost ~]# touch aa
[root@localhost ~]# ls -l aa
-rw-r--r--. 1 root root 0  2월 17 06:08 aa // 644
drwxr-xr-x. 2 root root 6  2월 17 06:08 kb // 755

umask의 이해

umask는 언제 적용될까❓

umask는 profile(환경설정 파일)에 선언되는데, 로그인 시 적용된다.

/etc/(시스템 전체에) 아래에도 있고, $HOME/.bash_profile(사용자 개인에게)도 있다.
우선순위는 $HOME/.bash_profile가 /etc/보다 먼저다.

shell script

script의 이해

ui ---> 해석기 ---> kernel
ui <--- 해석기 <--- kernel 의 구조로 동작

  1. 컴파일을 하지 않아도 된다 -> exe (binary)파일이 아니다
  2. 시스템 명령어를 그대로 이해한다
  3. 컴파일 언어가 아니기 때문에 길어지면 느려짐 -> 짧게 사용하는 것이 목표

shell script 실행

[root@localhost ~]# file /usr/bin/alias
/usr/bin/alias: POSIX shell script, ASCII text executable
[root@localhost ~]# head -5 /usr/bin/alias
#!/bin/sh

#<--- 보통 주석처리라는 뜻
하지만, #!/bin/sh에 있는 #은 주석이 아니라 일종의 헤더.
1. 해당 셸로 해석하라
2. 해당 셸 포맷으로 작성되었다

셸 실행

[root@localhost ~]# echo 'echo hi' >> test1.sh
[root@localhost ~]# cat test1.sh
#!/bin/bash
echo hi

// 실행권한이 없을 때 실행하는 법1 (현재파일을 배시로 해석하라)
[root@localhost ~]# bash test1.sh
hi
// 실행권한이 없을 때 실행하는 법2(이 파일을 해석하라)
[root@localhost ~]# . ./test1.sh
hi
[root@localhost ~]# ./test1.sh
-bash: ./test1.sh: 허가 거부
[root@localhost ~]# ls -l test1.sh
-rw-r--r--. 1 root root 20  2월 17 07:27 test1.sh

[root@localhost ~]# chmod u+x test1.sh     <----- 보통 쉘을 실행한다고 한다면 이것이 기준이다.
[root@localhost ~]# ./test1.sh
hi
		echo $SHELL -> ./test1.sh 해석
[실행]
[user@localhost ~]$ echo $$
7776


[실행]
[root@localhost ~]# strace -p 7776
strace: Process 7776 attached

[확인]
[user@localhost ~]$ ls   <---  명령어를 입력
aaa  bbb  공개  다운로드  문서  바탕화면  비디오  사진  서식  음악
[user@localhost ~]$

[확인]      <---  ls 문자를 받아서 처리 하는 과정을 볼수 있다.
pselect6(1, [0], NULL, NULL, NULL, {[], 8}) = 1 (in [0])
read(0, "l", 1)                         = 1
select(1, [0], NULL, [0], {tv_sec=0, tv_usec=0}) = 0 (Timeout)
write(2, "l", 1)                        = 1
pselect6(1, [0], NULL, NULL, NULL, {[], 8}) = 1 (in [0])
read(0, "s", 1)                         = 1
select(1, [0], NULL, [0], {tv_sec=0, tv_usec=0}) = 0 (Timeout)
write(2, "s", 1)                        = 1
pselect6(1, [0], NULL, NULL, NULL, {[], 8}) = 1 (in [0])
read(0, "\r", 1)                        = 1
write(2, "\n", 1)

strace 명령어 : 프로그램의 문제 해결을 도와주는 디버깅 툴. 위의 실습에서는 셸을 실행시키고, user가 명령어를 치면 명령의 처리 과정을 디버깅하는 실습입니다.

[strace]

파일 출력 파싱

[root@localhost ~]# A=10
[root@localhost ~]# echo $A
10
// "는 변수로 
[root@localhost ~]# echo "$A"
10
// '는 문자로
[root@localhost ~]# echo '$A'
$A

파일 입출력 관련 명령어

cut

file이나 표준 입력에서 받은 문자열을 잘라내서 새로운 문자열을 만드는 명령어
필드가 일정한 데이터에서는 좋지만 일정하지 않으면 사용할 수 없음
1,3이나 3,1이나 같은 결과를 나타냄

옵션

[root@localhost ~]# cat data
hong 28 011-222-2222 seoul
park 34 017-333-3333 kyunggi
im 23 019-444-4444 chungnam
son 49 016-555-5555 us
gil 19 018-666-6666 korea
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
sa 45 017-9999-9999 canada
hwang 32 015-555-5555 kwangju

cat > 파일이름 : 입력을 vi 없이 바로 할 수 있음. 종료는 CTRL + D

  • -b(bytes): 바이트 기준으로 잘라냄
  • -c(characters): 문자열을 기준으로 잘라냄
[root@localhost ~]# cut -c 2-4 data
ong
ark
m 2
on
il
ang
ee
a 4
wan
  • -d(delimiter): 지정한 문자를 구분자로 사용(기본은 TAB)
[root@localhost ~]# cut -d " " -f 1,3 data
hong 011-222-2222
park 017-333-3333
im 019-444-4444
son 016-555-5555
gil 018-666-6666
jang 011-7777-7777
lee 016-8888-8888
sa 017-9999-9999
hwang 015-555-5555
  • -f(fields): 필드를 기준으로 잘라냄
  • -z(zero-terminated): 라인의 구분자를 개행문자가 아닌 NULL로 사용

문제 1) /etc/passwd 파일에서 첫 번째 필드와, 세 번째부터 다섯 번째 필드를 : 구분자를 기준으로 나누어서 마지막 5줄만 출력해보세요.

[root@localhost ~]# cut -d ":" -f 1,3-5 /etc/passwd | tail -5
gdm:42:42:
gnome-initial-setup:976:975:
sshd:74:74:Privilege-separated SSH
tcpdump:72:72:
user:1000:1000:user

paste

파일들을 서로 병합하는 명령어

[root@localhost ~]# cat exam1
red
blue
white
[root@localhost ~]# cat exam2
yellow
green
gray
black
[root@localhost ~]# paste exam1 exam2
red     yellow
blue    green
white   gray
        black

옵션

  • -s : 수직으로 값을 읽어 수평으로 출력
[root@localhost ~]# paste -s -d "|" exam1 exam2
red|blue|white
yellow|green|gray|black
  • -d : 지정한 문자를 구분자로 사용
[root@localhost ~]# paste -d : exam1 exam2
red:yellow
blue:green
white:gray
:black
[root@localhost ~]# paste -s -d "|" exam1 exam2
red|blue|white
yellow|green|gray|black

diff

두 파일 사이의 내용을 비교하는 명령어

[root@localhost ~]# cat exam1
red
blue
white
[root@localhost ~]# cat exam3
red
green
blue
white

옵션

  • -c : 두 파일간의 차이점 출력
[root@localhost ~]# diff -c exam1 exam3
*** exam1       2022-02-17 01:26:18.349681227 -0500
--- exam3       2022-02-17 01:27:03.125921713 -0500
***************
*** 1,3 ****
--- 1,4 ----
  red
+ green
  blue
  white
  • -d : 두 파일간의 차이점을 상세하게 출력
[root@localhost ~]# diff -d exam1 exam3
1a2
> green
  • -r : 두 디렉토리간의 차이점 출력, 서브디렉토리까지 비교
[root@localhost ~]# diff -r kbs mc
Only in kbs: aaa
Only in kbs: mbc
  • -i : 대소문자 구분 무시
  • -w : 모든 공백 차이무시
  • -s : 두 파일이 같을 때, 알림
  • -u : 두 파일의 변경되는 부분의 근처의 내용도 출력
  • -b : space를 무시하고 비교

    sha256sum : 무결성(데이터의 정확성과 일관성을 유지하고 보증하는 것)을 체크하는 명령어

grep

예시

정규식을 사용한 예

[root@localhost ~]# grep -n '[dD]on₩'t' tasks

tasks 파일에서 don't 나 Don't 문자열을 포함하는 각 줄을 그 줄 번호와 함께(-n 옵션) 출력
[,] 같은 문자들을 포함하여, 하나 이상의 정규식으로 사용되었기 때문에 '로 묶어줌
"를 사용하한다면 '도 하나의 패턴임을 지시

파이프를 이용한 예

[root@localhost ~]# ls -l | grep '^d........x'

현재 디렉토리 내용 중에 다른 사용자에게 실행 권한이 부여된 하위 디렉토리가 어떤것이 있는지 알아보는 경우
^는 그 줄의 처음을 의미함

원하는 파일 삭제하는 예

[root@localhost ~]# rm -f $(grep -l "패턴")

sort

파일의 내용을 정렬하거나 정렬된 파일의 내용을 병합하는 명령어

[root@localhost ~]# cat data
hong 28 011-222-2222 seoul
park 34 017-333-3333 kyunggi
im 23 019-444-4444 chungnam
son 49 016-555-5555 us
gil 19 018-666-6666 korea
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
sa 45 017-9999-9999 canada
hwang 32 015-555-5555 kwangju

[root@localhost ~]# sort data
gil 19 018-666-6666 korea
hong 28 011-222-2222 seoul
hwang 32 015-555-5555 kwangju
im 23 019-444-4444 chungnam
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
park 34 017-333-3333 kyunggi
sa 45 017-9999-9999 canada
son 49 016-555-5555 us

옵션

  • -r(reverse) : 내림차순
[root@localhost ~]# sort -r data
son 49 016-555-5555 us
sa 45 017-9999-9999 canada
park 34 017-333-3333 kyunggi
lee 16 016-8888-8888 china
jang 21 011-7777-7777 japan
im 23 019-444-4444 chungnam
hwang 32 015-555-5555 kwangju
hong 28 011-222-2222 seoul
gil 19 018-666-6666 korea
  • -k : 필드 번호를 나타냄
[root@localhost ~]# sort -k3 data
hong 28 011-222-2222 seoul
jang 21 011-7777-7777 japan
hwang 32 015-555-5555 kwangju
son 49 016-555-5555 us
lee 16 016-8888-8888 china
park 34 017-333-3333 kyunggi
sa 45 017-9999-9999 canada
gil 19 018-666-6666 korea
im 23 019-444-4444 chungnam
  • -u(unique) : 정렬 후, 중복 제거
  • -t : 구분자를 사용
  • -f : 대소문자 구분무시
  • -n : 숫자 순서로 정렬

문제2) /etcpasswd 파일을 : 구분자로 : 로 분류하여 4번째 필드인 그룹아이디로 정렬하여 출력해보세요

[root@localhost ~]# sort -t ":" -n -r -k 4 /etc/passwd | head -5
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
user:x:1000:1000:user:/home/user:/bin/bash
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin

-n 옵션을 사용하지 않으면 문자로 인식하여 맨 앞이 9이기만하면 더 큰 데이터로 인식하여 원하지 않는 결과가 나올 수 있으므로, 숫자를 기준으로 정렬할 땐 반드시 사용해야함

sed

파일을 인자로 받아 명령어를 통해 수정, 치환, 삭제 등을 작업한 후 결과로 출력하는 명령어
vi는 다르게 원본을 손상시키지 않음

옵션

[root@localhost ~]# cat data
hong 28 011-222-2222 seoul
park 34 017-333-3333 kyunggi
im 23 019-444-4444 chungnam
son 49 016-555-5555 us
gil 19 018-666-6666 korea
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
sa 45 017-9999-9999 canada
hwang 32 015-555-5555 kwangju
  • -p : 행을 출력(-n과 함께 사용 시, 선택된 행만 출력)
[root@localhost ~]# sed '/011/p' data
hong 28 011-222-2222 seoul
hong 28 011-222-2222 seoul
park 34 017-333-3333 kyunggi
im 23 019-444-4444 chungnam
son 49 016-555-5555 us
gil 19 018-666-6666 korea
jang 21 011-7777-7777 japan
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
sa 45 017-9999-9999 canada
hwang 32 015-555-5555 kwangju

같은 내용이 두번 반복되어 나옴

[root@localhost ~]# sed -n '/011/p' data
hong 28 011-222-2222 seoul
jang 21 011-7777-7777 japan

해당하는 부분만 보기 위해 -n과 함께 사용한 모습

  • -d : 선택한 행 삭제
// 1번 라인 ~ 3 번 라인 삭제 후, 출력
[root@localhost ~]# sed '1,3d' data
son 49 016-555-5555 us
gil 19 018-666-6666 korea
jang 21 011-7777-7777 japan
lee 16 016-8888-8888 china
sa 45 017-9999-9999 canada
hwang 32 015-555-5555 kwangju
  • -f : 파일 안의 내용을 실행
  • 's/가/나/g' : 가 문자열을 나 문자열로 대치
[root@localhost ~]# cat data
...
lee 16 016-8888-8888 china
...

[root@localhost ~]# sed 's/china/bosung/g' data
...
lee 16 016-8888-8888 bosung
...
  • -e : 다중편집
[root@localhost ~]# sed -e '/japan/d' -e 's/china/bosung/g' data
  • -q : sed 종료
// 4번 라인까지 출력 후, 종료
[root@localhost ~]# sed '4q' data
hong 28 011-222-2222 seoul
park 34 017-333-3333 kyunggi
im 23 019-444-4444 chungnam
son 49 016-555-5555 us
profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글