파일 권한은 파일마다 누가(소유자·그룹·기타 사용자) 무엇을(읽기·쓰기·실행) 할 수 있는지 아홉 칸으로 정한 것입니다. chmod로 권한을, chown으로 소유자를 바꾸고, 새로 만드는 파일의 권한은 umask가 정합니다. 링크(link)는 한 파일을 다른 이름으로도 부르게 하는 것으로, 하드 링크와 심볼릭 링크가 있습니다.
Linux 서버는 여러 사람이 함께 씁니다. 급여 파일을 아무나 고칠 수 있으면 안 되고, 배포 스크립트는 담당자만 실행해야 합니다. 그래서 파일마다 권한을 매기고, 시험은 그 권한을 글자와 숫자로 오가며 읽게 합니다. 아래 그림은 권한 아홉 칸이 숫자가 되는 과정과, 원본을 지웠을 때 두 링크가 어떻게 갈리는지 보입니다.
1권한 아홉 칸과 숫자
리눅스 기본 명령어에서 본 ls -l로 목록을 보면 줄 맨 앞에 열 글자가 나옵니다. 첫 글자는 종류(- 파일 · d 디렉터리 · l 심볼릭 링크)이고, 나머지 아홉 칸이 권한입니다. 세 칸씩 소유자(user)·그룹(group)·기타 사용자(others)의 몫이고, 차례로 읽기(r)·쓰기(w)·실행(x)입니다. 꺼진 칸은 -입니다.
숫자로 쓸 때는 r을 4, w를 2, x를 1로 보고 켜진 칸을 묶음마다 더합니다.
| 묶음 | 소유자 | 그룹 | 기타 |
|---|---|---|---|
| 칸 | rwx | r-x | --x |
| 더하기 | 4+2+1 | 4+0+1 | 0+0+1 |
| 숫자 | 7 | 5 | 1 |
그래서 -rwxr-x--x는 751입니다.
2chmod와 chown
chmod는 권한을 바꿉니다. 숫자 세 자리로 한꺼번에 주거나(chmod 640 a.sh), 기호로 한 묶음의 칸만 켜고 끕니다(chmod g+x a.sh). 기호는 u(소유자)·g(그룹)·o(기타)·a(모두)에 +(켜기)·-(끄기)·=(적은 칸만 켜고 나머지는 끄기)를 붙입니다.
chown은 소유자와 그룹을 바꿉니다(chown kim:dev a.sh). 파일을 남에게 넘기는 일이라, 소유자를 바꾸는 것은 관리자(root)만 할 수 있습니다.
3umask — 새 파일의 권한을 정하는 값
새로 만드는 파일은 기본 권한 666(rw-rw-rw-), 디렉터리는 777(rwxrwxrwx)에서 시작합니다. umask는 그 가운데 끌 칸을 적은 값입니다. 흔히 쓰는 022는 그룹·기타의 w를 꺼서, 파일은 644, 디렉터리는 755가 됩니다.
umask는 빼기가 아니라 끄기입니다. 이미 꺼진 칸은 그대로입니다. umask 027이면 파일은 640입니다. 자리마다 빼려 하면 마지막 자리가 6−7이 되어 맞지 않습니다. 파일의 x 칸은 처음부터 꺼져 있어 끌 것이 없기 때문입니다.
4하드 링크와 심볼릭 링크
ln 원본 새이름은 하드 링크(hard link)를 만듭니다. 원본과 같은 아이노드(inode — 파일의 권한·크기와 내용이 있는 자리를 적어 둔 칸)를 가리키는 이름이 하나 더 생깁니다. ls -l의 둘째 칸은 한 아이노드를 가리키는 이름의 수(링크 수)라, 하드 링크를 걸면 2가 됩니다. ln -s 원본 새이름은 심볼릭 링크(symbolic link)를 만듭니다. 원본의 경로를 글자로 담은 작은 파일로, Windows의 바로 가기와 비슷합니다. 자료에 따라 소프트 링크(soft link)라고도 부릅니다.
| 가르는 기준 | 하드 링크 | 심볼릭 링크 |
|---|---|---|
| 가리키는 것 | 원본과 같은 아이노드 | 원본의 경로 |
| 원본 이름을 지우면 | 내용을 그대로 읽는다 | 끊긴다 |
ls -l 첫 글자 | - | l |
| 디렉터리·다른 파일 시스템 | 가리킬 수 없다 | 가리킬 수 있다 |
예제
umask를 027로 정하고 파일과 디렉터리를 하나씩 만듭니다. touch는 빈 파일을 만들고, Linux의 stat -c '%A %a %n'은 권한 글자·숫자·이름을 찍습니다.
umask 027
touch b.txt
mkdir d
stat -c '%A %a %n' b.txt d
-rw-r----- 640 b.txt
drwxr-x--- 750 d
이번에는 내용이 hello 한 줄인 memo.txt에 링크 둘을 걸고 원본 이름을 지웁니다.
ln memo.txt hard.txt
ln -s memo.txt sym.txt
rm memo.txt
cat hard.txt
hello
hard.txt는 같은 아이노드를 가리켜 내용을 그대로 읽습니다. 같은 자리에서 cat sym.txt를 치면, 가리키던 이름이 사라져 No such file or directory 오류가 납니다.
시험 포인트
- 필기: 권한 글자와 숫자를 오가는 문제가 나옵니다 — r 4 · w 2 · x 1을 세 칸씩 더합니다(
rwxr-x--x= 751). umask는 파일 666 · 디렉터리 777에서 umask의 칸을 끄는 계산입니다(022 → 644 · 755, 027 → 640 · 750). 원본 이름을 지웠을 때 하드 링크는 내용을 읽고 심볼릭 링크는 끊긴다는 차이도 묻습니다. - 실기: 명령과 권한을 그대로 씁니다 — 권한 바꾸기
chmod(예:chmod 751 a.sh), 소유자 바꾸기chown, 새 파일의 권한을 정하는 값umask. 링크 이름은 하드 링크(Hard Link), 심볼릭 링크(Symbolic Link)로 씁니다.
확인 문제
1. chmod 604 report.txt를 친 뒤 ls -l이 찍는 줄의 첫 열 글자로 알맞은 것을 고르세요.
- ①
-rw----r-- - ②
--wx-----x - ③
-r-----rw- - ④
-rw-r--r--
정답
①입니다. 6은 4+2라 rw-, 0은 ---, 4는 r--이고, 소유자·그룹·기타 차례로 놓습니다.
- ② r을 1, x를 4로 거꾸로 읽은 꼴입니다. r이 4이고 x가 1입니다.
- ③ 묶음의 차례를 기타·그룹·소유자로 거꾸로 놓은 꼴입니다.
- ④ 644입니다. 가운데 자리 0은 그룹에게 아무 권한도 주지 않습니다.
2. 다음 일을 하는 명령을 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가)
deploy.sh를 소유자는 읽기·쓰기·실행, 그룹은 읽기·실행, 기타는 아무것도 못 하게 숫자로 정합니다. - (나)
deploy.sh의 소유자를lee로, 그룹을ops로 넘깁니다. - (다) 앞으로 만들 파일이 600, 디렉터리가 700이 되도록 끌 칸을 정합니다.
정답
받는 답: (가) chmod 750 deploy.sh · (나) chown lee:ops deploy.sh · (다) umask 077
(가)는 4+2+1, 4+0+1, 0을 더한 750입니다. (나)의 실마리는 '소유자를 넘긴다', (다)는 '앞으로 만들 파일의 권한'입니다.
- 틀리는 꼴
chmod 751 deploy.sh— (가)에: 마지막 1은 기타에게 실행을 줍니다. - 틀리는 꼴
chmod lee:ops deploy.sh— (나)에:chmod는 권한을 바꿉니다. 소유자는chown으로 바꿉니다. - 틀리는 꼴
umask 600— (다)에: umask에는 끌 칸을 적습니다. 666에서 그룹·기타를 모두 끄는 값은 077입니다.
3. 다음 (가)·(나)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가)
data.csv를 지운 뒤에도copy.csv로 같은 내용을 읽습니다.ls -l로 보면copy.csv의 첫 글자는-이고, 원본을 지우기 전에는 둘째 칸의 수가 2였습니다. - (나)
last.log를 지우자now.log를 열 때No such file or directory가 납니다.now.log의 첫 글자는l이고, 다른 디스크의 파일도 이렇게 가리킬 수 있습니다.
정답
받는 답: (가) 하드 링크(Hard Link) · (나) 심볼릭 링크(Symbolic Link) 또는 소프트 링크(Soft Link)
(가)의 실마리는 '지운 뒤에도 같은 내용을 읽는다'와 '링크 수 2', (나)는 '지우자 끊긴다'와 '첫 글자 l'입니다. 소프트 링크는 자료에 따라 부르는 이름이라 함께 받습니다.
- 같은 이름의 다른 꼴: 한글 이름만, 또는 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다.
- 틀리는 꼴 심볼릭 링크 — (가)에: 원본의 경로만 담아 원본이 지워지면 끊깁니다.
- 틀리는 꼴 복사 — (가)에:
cp로 만든 복사본은 다른 파일이라 링크 수가 1입니다. - 틀리는 꼴 하드 링크 — (나)에: 같은 아이노드를 가리켜 원본 이름을 지워도 끊기지 않고, 다른 파일 시스템의 파일은 가리키지 못합니다.
4. 예제의 umask를 007로 바꿨습니다. touch로 만든 파일과 mkdir로 만든 디렉터리의 권한을 숫자와 아홉 칸 글자로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 파일 660 rw-rw---- · 디렉터리 770 rwxrwx---
007은 기타의 r·w·x만 끕니다. 소유자와 그룹은 기본 권한 그대로입니다.
- 틀리는 꼴 파일 659: 666에서 7을 십진수로 뺀 꼴입니다. 권한 숫자는 세 자리를 따로 보는 칸 묶음이고, umask는 칸을 끄기만 합니다.
- 틀리는 꼴 디렉터리 660: 디렉터리는 777에서 시작해 소유자·그룹의 x가 남습니다.
5. umask를 033으로 정한 뒤 만든 파일과 디렉터리의 권한을 숫자로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 파일 644 · 디렉터리 744
033은 그룹과 기타의 w·x를 끕니다. 파일은 666(rw-rw-rw-)에 x가 처음부터 없어 w만 꺼져 rw-r--r--, 디렉터리는 777에서 w·x가 꺼져 rwxr--r--입니다.
- 틀리는 꼴 파일 633: 666에서 자리마다 뺀 꼴입니다. umask는 빼기가 아니라 끄기라, 꺼져 있던 x 칸에서 더 뺄 것이 없습니다.