ls -l의 맨 앞 열 글자를 다시 본다. 첫 글자는 파일 종류 이고, 나머지 아홉 글자가 권한이다.
- rwx r-x r--
│ │ │ │
│ │ │ └── other 기타 사용자
│ │ └─────── group 소유 그룹
│ └──────────── user 소유자
└──────────────── 파일 종류 (- 파일, d 디렉터리, l 링크)
세 칸씩 끊어 읽는다. 소유자 → 그룹 → 기타 순서다.
권한이 없으면 그 자리에 - 가 들어간다. r-x는 읽기와 실행은 되지만 쓰기는 안 된다는 뜻이다.
상황 적용되는 칸 내가 그 파일의 소유자 다 user 칸만내가 소유 그룹 에 속한다 group 칸만둘 다 아니다 other 칸만
위에서부터 하나만 적용된다. 소유자라면 group·other 칸이 아무리 넓어도 user 칸만 본다. 그래서 소유자에게 권한을 좁게 주면 오히려 소유자가 못 읽는 상황이 생긴다.
판정은 다음 순서로 한 번만 일어난다. 앞에서 걸리면 뒤는 보지 않는다.
① root 인가? → 예: rwx 검사를 거의 받지 않는다
② 파일의 소유자인가? → 예: user 칸으로 결정. 끝
③ 소유 그룹에 속하는가? → 예: group 칸으로 결정. 끝
④ 그 밖의 사용자 → other 칸으로 결정
예를 하나 놓고 따져 본다. alice는 dev 그룹, bob도 dev 그룹, carol은 어느 쪽도 아니다.
-rw-r----- 1 alice dev 120 Sep 3 09:00 plan.txt
사용자 적용 칸 읽기 쓰기 alice (소유자) rw-O O bob (dev 그룹) r--O X carol (기타) ---X X root — O O
이번에는 권한이 ----rw-rw-(066)라고 가정한다. alice는 소유자이므로 user 칸 ---만 적용받아 읽지 못한다. 같은 그룹의 bob과 남인 carol은 읽고 쓸 수 있는데도 그렇다.
다만 alice는 소유자이므로 chmod로 권한을 다시 고칠 수는 있다. 권한을 바꿀 자격은 rwx가 아니라 소유 여부 가 정한다.
root는 읽기·쓰기 검사를 받지 않는다. 그래서 000 파일도 root는 읽는다.
권한 파일 에서디렉터리 에서r (read)내용을 읽는다 목록을 본다 (ls)w (write)내용을 고친다 안에 만들고 지운다 x (execute)실행한다 들어간다 (cd)
디렉터리의 x가 없으면 cd 로 들어갈 수 없다. 안에 무엇이 있는지 알아도 접근이 막힌다.
디렉터리의 w는 그 안의 파일을 만들고 지우는 권한 이다. 파일 자체의 권한과는 별개다. 즉 읽기 전용 파일이라도 디렉터리에 w가 있으면 지울 수 있다.
r만 있고 x가 없는 디렉터리는 이름만 보이고 상세 정보는 볼 수 없다.
디렉터리는 이름 목록을 적어 둔 표 라고 생각하면 풀린다. r은 그 표를 읽는 권한, w는 표에 줄을 넣고 빼는 권한, x는 표에 적힌 이름을 따라 실제 파일에 닿는 권한이다.
디렉터리 권한 lscd안의 파일 읽기 파일 만들기·지우기 r-xO O O X rwxO O O O --xX O 이름을 알면 O X r--이름만 X X X rw-이름만 X X X (x가 없어 w가 무력)-wxX O 이름을 알면 O O
w는 x와 함께 있어야 쓸모가 있다. 파일을 만들거나 지우려면 그 디렉터리에 닿을 수 있어야 하기 때문이다.
x는 경로 전체에 필요하다. /home/alice/docs/a.txt를 읽으려면 /, /home, /home/alice, /home/alice/docs 모두에 x 가 있어야 한다. 파일 권한이 644여도 중간 디렉터리 하나가 막히면 읽지 못한다.
$ chmod a-x docs
$ cd docs
bash: cd: docs: Permission denied
$ ls -l docs
ls: cannot access 'docs/a.txt': Permission denied
total 0
-????????? ? ? ? ? ? a.txt
$ cat docs/a.txt
cat: docs/a.txt: Permission denied
r만 남은 디렉터리에서 ls -l은 이름(a.txt)은 알아내지만 그 파일의 정보에는 닿지 못해, 권한·소유자·크기 자리가 전부 ?로 나온다.
파일을 지우는 권한은 파일에 없다. rm은 디렉터리의 목록에서 이름을 빼는 일이므로 디렉터리의 w·x 가 정한다. 파일의 w는 내용을 고치는 권한일 뿐이다.
스크립트는 x만으로는 실행되지 않는다. 셸이 내용을 읽어야 하므로 r도 있어야 한다.
심볼릭 링크는 항상 lrwxrwxrwx 로 보인다. 실제 접근은 링크가 아니라 가리키는 원본의 권한 이 정한다.
각 권한에 값을 정해 두고 더한다.
표기 계산 숫자 rwx4+2+1 7 rw-4+2 6 r-x4+1 5 r--4 4 -wx2+1 3 -w-2 2 --x1 1 ---0 0
세 부류를 이어 붙이면 세 자리 숫자가 된다.
rwx r-x r-x
7 5 5 → 755
rw- r-- r--
6 4 4 → 644
값 표기 쓰이는 곳 644 rw-r--r--일반 파일 의 기본값755 rwxr-xr-x디렉터리 ·실행 파일의 기본값600 rw-------비밀 키, 설정 파일 — 소유자만 700 rwx------개인 디렉터리 666 rw-rw-rw-누구나 수정 — 위험 777 rwxrwxrwx모두에게 전부 — 매우 위험
777은 답이 아니다. 권한 문제가 생겼을 때 777을 주면 당장은 되지만 누구나 지우고 고칠 수 있는 상태가 된다. 시험에서도 실무에서도 "권장하지 않는 설정"으로 다뤄진다.
숫자 → 기호 는 각 자리를 4·2·1로 쪼갠다.
640 → 6 = 4+2 4 = 4 0 = 0
rw- r-- --- → rw-r-----
751 → 7 = 4+2+1 5 = 4+1 1 = 1
rwx r-x --x → rwxr-x--x
기호 → 숫자 는 세 칸씩 끊어 더한다.
rw-rw-r-- → (4+2) (4+2) (4) → 664
rwxr-x--- → (4+2+1) (4+1) (0) → 750
r-------- → (4) (0) (0) → 400
값 표기 읽는 법 640 rw-r-----소유자는 읽고 쓰고, 그룹은 읽기만, 기타는 차단 750 rwxr-x---그룹까지만 들어올 수 있는 디렉터리 664 rw-rw-r--그룹도 수정할 수 있는 파일 775 rwxrwxr-x그룹이 함께 쓰는 디렉터리 400 r--------소유자도 읽기만 711 rwx--x--x남은 목록을 못 보지만 지나갈 수는 있는 디렉터리
홀수면 x가 있다. 1이 더해져야 홀수가 되기 때문이다. 5·7은 실행 가능, 4·6은 실행 불가다.
2·3·6·7에는 w가 있다. "기타 사용자가 쓸 수 있는가"는 마지막 자리가 이 넷 중 하나인지로 본다.
한 자리의 최댓값은 7이다. chmod 855처럼 8·9가 들어간 값은 존재하지 않는다.
chmod 755 script.sh # rwxr-xr-x
chmod 644 note.txt # rw-r--r--
chmod 600 id_rsa # rw-------
chmod -R 755 /var/www # 하위까지 재귀적으로
세 자리를 한 번에 통째로 덮어쓴다. 기존 권한은 남지 않는다.
chmod u+x script.sh # 소유자에게 실행 권한 추가
chmod g-w note.txt # 그룹의 쓰기 권한 제거
chmod o=r note.txt # 기타 사용자를 읽기만으로 지정
chmod a+r note.txt # 모두에게 읽기 추가
chmod u+x,g+w file # 여러 개를 쉼표로
대상 뜻 u user — 소유자 g group — 그룹 o other — 기타 a all — 전부 (u+g+o)
연산자 뜻 +권한 추가 -권한 제거 =그 권한으로 지정 (나머지는 없앰)
두 방식의 차이. 8진수는 전체를 새로 쓰고, 기호는 지금 상태에서 더하고 뺀다. "실행 권한만 추가하라"는 문제에는 chmod u+x가 맞고, "권한을 rwxr-xr-x로 만들라"는 문제에는 chmod 755가 맞다.
같은 파일에 차례로 적용해 보면 세 연산자의 차이가 드러난다.
순서 실행한 명령 실행 뒤 권한 일어난 일 시작 — rw-r--r-- (644)1 chmod g+w note.txtrw-rw-r-- (664)그룹에 w만 더해짐 2 chmod o-r note.txtrw-rw---- (660)기타의 r만 빠짐 3 chmod u=r note.txtr--rw---- (460)소유자는 r만 남음 4 chmod a=rw note.txtrw-rw-rw- (666)셋 다 rw로 지정 5 chmod go= note.txtrw------- (600)그룹·기타 권한을 전부 비움
+와 -는 적은 것만 건드리고 나머지는 그대로 둔다. =는 그 대상의 세 칸을 통째로 다시 쓴다.
대상은 붙여 쓸 수 있다 — ug+x(소유자와 그룹), go-w(그룹과 기타). = 뒤를 비우면 권한을 모두 없앤다.
같은 결과를 두 방식으로 쓸 수 있어야 한다 — chmod 755 f = chmod u=rwx,go=rx f, chmod 600 f = chmod u=rw,go= f.
chmod 옵션뜻 -R디렉터리 하위 전체 에 적용 (대문자) -v처리한 파일마다 결과를 출력 -c실제로 바뀐 것만 출력
⚠️ chmod -R 755 디렉터리는 안의 일반 파일까지 전부 실행 가능하게 만든다. 디렉터리에는 755가 맞지만 문서 파일에는 644가 맞다. 재귀 옵션은 디렉터리와 파일에 같은 값이 들어간다는 점을 기억하고 쓴다. 그리고 chmod의 재귀는 -r이 아니라 대문자 -R 이다.
chmod를 쓸 수 있는 사람은 그 파일의 소유자와 root뿐 이다. 그룹 구성원이나 쓰기 권한이 있는 다른 사용자는 권한을 바꾸지 못한다.
ls -l note.txt # -rw-r--r-- 1 user group ...
ls -ld /var/www # 디렉터리 자신의 권한 (-d 가 핵심)
stat note.txt # 8진수와 기호 표기를 함께 보여준다
ls -ld 의 -d는 "디렉터리 안이 아니라 디렉터리 자체 를 보라"는 옵션이다. -d 없이 디렉터리에 ls -l을 하면 내용물 목록이 나온다.
$ stat note.txt
File: note.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
stat의 Access: 줄에 8진수와 기호 표기가 나란히 나온다. 변환이 맞는지 확인할 때 쓴다. 맨 앞의 0은 모레 다룰 특수 권한 자리다.
내일은 이 권한이 누구의 것인지 정하는 소유권과 그룹, 그리고 기본 권한을 깎는 umask를 다룬다.
소유자(owner/user) : 파일을 만든 사용자. 권한의 첫 세 칸이 여기에 적용된다.
그룹(group) : 파일에 붙은 그룹. 그 그룹에 속한 사용자가 가운데 세 칸을 적용받는다.
기타(other) : 소유자도 그룹도 아닌 나머지 모든 사용자.
rwx : 읽기·쓰기·실행 권한. 디렉터리에서는 목록·생성삭제·진입을 뜻한다.
8진수 표기 : r=4, w=2, x=1을 더해 부류마다 한 자리로 나타낸 권한 표기법.
chmod : 권한을 바꾸는 명령. 8진수 방식과 기호 방식이 있다.
ls -ld : 디렉터리 내용이 아니라 디렉터리 자체의 정보를 보는 옵션.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 rwxr-xr-- 권한을 8진수로 바르게 나타낸 것은?
다음 중 디렉터리에 부여된 x 권한의 의미로 알맞은 것은?
A 디렉터리 안으로 이동할 수 있다 B 디렉터리를 프로그램으로 실행한다 C 디렉터리 안에 파일을 만들 수 있다 D 디렉터리의 목록을 볼 수 있다 다음 중 파일의 소유자에게만 실행 권한을 추가하는 명령으로 알맞은 것은?
A chmod 700 script.sh B chmod a+x script.sh C chmod o+x script.sh D chmod u+x script.sh 다음 중 일반 텍스트 파일에 흔히 사용하는 기본 권한값으로 알맞은 것은?
다음 중 소유자, 그룹, 기타 사용자 모두에게 읽기·쓰기·실행 권한을 부여하는 명령으로 알맞은 것은?
A chmod 644 file B chmod 755 file C chmod 700 file D chmod 777 file