chmod
chmod 명령어는 특정 파일 또는 디렉토리의 퍼미션(permission)을 변경하는 명령어입니다.
가장 기본적인 리눅스 명령어로서 리눅스 사용자라면 누구나 알고 있어야하는 명령어입니다.
※ 명령어 위치 : /bin/chown
※ 퍼미션(permission) : 특정 파일이나 디렉토리에 대하여 읽기, 기록하기, 삭제하기 등의 권한을 설정해 놓은 것으로 다중 사용자 운영체제(Multi-User Operation System)에서 파일의 접근 권한과 보호 등을 위하여 필요한 것이다.
또한 퍼미션은 리눅스뿐아니라 UNIX, Solaris, AIX, FreeBSD 등의 운영체제에서도 같은 목적으로 사용할 수 있다. 특히, 웹(WWW)으로 홈페이지를 보여 줄 때에 웹문서 파일의 퍼미션 설정이 되어있지 않아서 “이 문서는 허용되지 않았습니다.”라는 웹페이지 에러를 자주 접하곤 한다.
이에 대한 원인은 거의 대부분 웹페이지 파일의 퍼미션이 허용되어있지 않기 때문입니다.
파일(디렉토리)의 펴미션(권한, permission) 종류에는 아래와 같이 5가지가 있다. 매우 중요한 사항이니 꼭 기억해 두시기 바라며 특히 동일한 퍼미션이 파일에 적용될 때와 디렉토리에 적용될 때의 의미가 다르다는 것을 정확하게 이해하기 바랍니다.
퍼미션
일반적인 의미
파일
디렉토리
r
읽기(read) 권한
파일을 읽을 수 있음
디렉토리의 내용을 볼수 있음(ls로 파일 리스트 확인 가능)
w
쓰기(write) 권한
파일에 저장, 삭제할 수 있음
디렉토리에 파일 저장, 변경, 삭제 등 가능
x
실행(execution) 권한
파일을 실행할 수 있음
디렉토리에 접근할 수 있음(cd로 접근 가능, ls로 리스트는 불가)
s
SetUID, SetGID 권한
파일 소유자(SetUID), 그룹 소유자(SetGID)의 권한으로 실행함
t
Sticky Bit 권한
공유 디렉토리로 사용됨
※ 사용 형식 : chmod [옵션] 8진수퍼미션설정 대상파일들
chmod [옵션] 퍼미션설정모드 대상파일들
※ 가능한 옵션들
- c : 올바르게 변경된 파일들만 –v 옵션을 적용하여 자세히 보여준다.
- f : 가능한 불필요한 메시지를 보여주지 않고 간략하게 보여준다.
- v : 실행 과정을 자세하게 보여준다.
- R : 디렉토리와 그 안에 존재하는 서브디렉토리까지 모두 적용한다.
파일의 퍼미션을 정확하게 공부하기 위해서는 2 진수, 8 진수, 10 진수의 관계를 정확하게 이해해야 한다. 꼭 필요한 것은 아니지만 정확한 공부를 위해서 익혀두기 바란다.
2 진수
8 진수
표시되는 퍼미션
의미하는 내용
000
0
---
아무런 권한이 없음
0001
1
--x
실행(eXecution) 권한만 있음
010
2
-w-
쓰기(Write) 권한만 있음
011
3
-wx
쓰기와 실행 권한만 있음
100
4
r--
읽기(Read) 권한만 있음
101
5
r-x
읽기와 실행 권한만 있음
110
6
rw-
읽기와 쓰기 권한만 있음
111
7
rwx
읽기, 쓰기, 실행 권한이 있음
위의 2 진수와 8 진수의 관계에 정확하게 알고 계셔야 chmod에서 퍼미션 설정을 정확하게 할수 있다.
# ls –al 결과를 보면서 이해하기 바란다.
위 그림에서 각 행들의 첫번째 부분(노란색 마크)에 펴미션(예: -rw-------) 설정이 되어 있는 것을 볼 수 있다.
이제 이 부분을 설정하기 위해사 chmod 라는 명령어를 사용한다.
먼저 위 dmesg 라는 파일의 정보를 살펴보자.
-rw-r-r-- 1 root root 15058 10? ? 14 14:57 dmesg
- 파일 퍼미션 : -rw-r-r—
- 파일 소유자 : root
- 파일 그룹 소유자 : root
- 파일 사이즈 : 15058
- 파일 최종 변경 일시 : 10? ? 14일 14시57분
- 파일명 : dmesg
위와 같은 정보에서 퍼미션 부분을 보면 다음과 같다.
- rw- r-- r--
A.파일 유형 B.소유자권한부분 C.그룹소속자권한부분 D.일반다른사용자권한부분
A.파일 유형
이 위치에는 다음과 같은 문자들이 설정될 수 있으며 문자들의 의미는 다음과 같습니다.
- : 일반 파일임을 의미함
b : 블럭구조의 특수파일(Block Special File)을 의미함(예: /dev/sda)
c : 입출력에 사용되는 특수파일(Character Special File)을 의미함(예: /dev/console)
d : 디렉토리(Directory)를 의미하며, 디렉토리도 하나의 특수 파일로 취급됨
l : 심벌릭 링크 파일(Link File)임을 의미함
p : 파이프 파일(Pipe)임을 의미함
s : 소켓 파일(Socket)임을 의미함
-rw-r-r-- 1 root root 15058 10? ? 14 14:57 dmesg
-rw-r-r-- 1 root root 15058 10? ? 14 14:57 dmesg
위와 같은 정보에서 퍼미션 부분을 보면 다음과 같다.
- rw- r-- r--
A.파일 유형 B.소유자권한부분 C.그룹소속자권한부분 D.일반다른사용자권한부분
B.소유자권한부분
이 위치에서는 8가지의 경우로 설정될 수 있으며 각각의 의미는 아래와 같다.
--- : 파일의 소유자에게 아무런 권한이 없음(8진수 표시: 0 , 2진수 표시: 000)
--x : 파일의 소유자에게 실행(eXecution) 권한만 있음(8진수 표시: 1 , 2진수 표시: 001)
-w- : 파일의 소유자에게 쓰기(write) 권한만 있음(8진수 표시: 2 , 2진수 표시: 010)
-wx : 파일의 소유자에게 쓰기와 실행 권한만 있음(8진수 표시: 3, 2진수 표시: 011)
r-- : 파일의 소유자에게 읽기(read) 권한만 있음(8진수 표시: 4 , 2진수 표시: 100)
r-x : 파일의 소유자에게 읽기와 실행 권한만 있음(8진수 표시: 5 , 2진수 표시: 101)
rw- : 파일의 소유자에게 읽기와 쓰기 권한만 있음(8진수 표시: 6 , 2진수 표시: 110)
rwx : 파일의 소유자에게 읽기,쓰기,실행 권한만 있음(8진수 표시: 7 , 2진수 표시: 1110
위의 예에서는 이 부분의 설정이 rw-로 되어 있으므로 root 라는 파일 소유자에게 읽기와 쓰기 권한이 있음을 알 수 있다.
C.그룹소속자권한부분
위 B.의 경우의 예와 같습니다.
위의 예에서 r--로 설정되어 있으므로 root라는 그룹에 소속된 사용자들에게 읽기 권한만 주어진 것이다.
D.일반다른사용자권한부분
위 B.의 경우의 예와 같습니다.
위의 예에서 r--로 설정되어 있으므로 일반 다른 사용자들에게 읽기와 실행 권한이 있음을 알수 있다.
※ 즉, 파일의 퍼미션을 설정하는 방법에는 두가지 방법이 있다.
<예제> # chmod 755 파일이름
- 파일소유자에게 7 (2진수로는 111)의 권한 즉, rwx의 권한을 부여함
- 파일그룹소속자에게 5 (2진수로는 101)의 권한 즉, r-x의 권한을 부여함
- 다른사용자들에게 5 (2진수로는 101)의 권한 즉, r-x의 권한을 부여함
이렇게 숫자로 지정을 하면
첫번째 숫자는 파일의 소유자권한
두번째 숫자는 그룹소속자권한
세번째 숫자는 다른사용자에 대한 권한을 각각 표시하게 된다.
<예제> # chmod o+rw 파일이름
- 파일이름에 대해 일반다른사용자들(other)에게 읽기(r, Read) 권한과 쓰기(w, Write)권한을 부여한다.
특정문자로 사용하는 종류에는 다음과 같은 것들이 있다.
u : 소유자(user)를 의미함
g : 그룹(group)을 의미함
o : 다른사용자(other)들을 의미함
a : 모두(all)을 의미함(default)
그리고 이 문자와 함께 + 기호가 사용되면 “권한을 부여한다”라는 의미이며,
- 기호가 사용되면 “권한을 제거한다”라는 의미가 된다.
<실습> 8진수로 파일의 퍼미션 설정하기
# tocuh rick // touch로 rick 파일을 만든다.
# ls –al rick
-rw-r--r-- 1 root root 0 10월 16 00:09 rick
# chmod 755 rick
# ls –al
-rwxr-xr-x 1 root root 0 10월 16 00:11 rick
즉, 파일의 소유자에게는 모든 권한(읽기,쓰기,실행)을 부여(7)하고
그룹소속자에게는 읽기와 실행권한을 부여(5) 하였으며
다른사용자들에게는 읽기와 실행권한을 부여(5) 했다는 뜻이다.
<실습> 특정 문자로 퍼미션 설정하기
# ls -al
-rwxr-xr-x 1 root root 0 10월 16 00:11 rick
# chmod a+w rick
-rwxrwxrwx 1 root root 0 10월 16 00:11 rick
즉, a+w는 a(모든 사용자)에 대해서 w(쓰기 권한)을 부여한 것이다.
# ls -al
-rwxr-xr-x 1 root root 0 10월 16 00:11 rick
# chmod a-w rick
-r-xr-xr-x 1 root root 0 10월 16 00:11 rick
즉, a(모든 사용자)에 대해서 –(제거)를 하는데 w(쓰기 권한)을 제거한 것이다.
<실습> 여러 개의 파일과 디렉토리의 퍼미션 동시에 설정하기
위의 그림에서 zeep로 시작하는 모든 파일의 퍼미션을 755로 수정하고 한다.
# chmod 755 zeep*
<실습> 모든 파일과 디렉토리의 퍼미션 한번에 설정하기
# chmod 700 *
<실습> 특정 디렉토리내의 모든 파일과 서브 디렉토리 펴미션 한번에 설정하기
# chmod –R 755 sysdir // sysdir은 디렉토리이다.
<실습> 특정 파일에 SetUID Bit 설정하기
[참고] SetUID : 특정 파일에 SetUID Bit가 설정되어 있다면 다른 사용자들이 그 파일을 실행하였을 경우 실행되는 동안에는 실행시킨 사용자의 권한(아이디의 권한)이 아닌, 파일의 소유자권한으로 실행이 된다.
-r-xr-xr-x 1 root root 0 10월 16 00:11 rick
# chmod 4755 rick
-rwsr-xr-x 1 root root 0 10월 16 00:11 rick
SetGID는 일반 퍼미션 앞에 2를 붙이면 되고, Sticky Bit는 1을 붙이면 된다.(chown 시간에 자세하게 배운다.)
<실습> 특정 파일에 SetGID Bit 설정하기
-rwsr-xr-x 1 root root 0 10월 16 00:11 rick
# chmod 2755 rick
-rwxr-sr-x 1 root root 0 10월 16 00:11 rick
<실습> 특정 디렉토리에 Sticky Bit 설정하는 퍼미션 설정하기
-rwxr-sr-x 1 root root 0 10월 16 00:11 rick
# chmod 1755 rick
-rwxr-xr-t 1 root root 0 10월 16 00:11 rick
리눅스에서는 흔히 /tmp 디렉토리를 Sticky Bit로 설정 합니다. 이 /tmp 디렉토리내에서 특정 파일을 생성하면 생성한 사용자의 소유자로 파일이 생성된다.
그리고 다른 사용자가 /tmp 디렉토리에 다른 파일을 생성하면 역시 생성한 소유자의 소유로 파일이 생성된다. 파일을 삭제할 때에도 생성한 사람만이 삭제를 할 수가 있다.
Linux/Commands Part