리눅스 chmod 명령어 사용법. (Linux chmod command) - 리눅스 파일 권한 변경.
1. 리눅스 파일 사용 권한
리눅스에서, 파일(File)을 사용해 할 수 있는 작업은 크게 세 가지로 나눌 수 있습니다.
- 파일에 저장된 데이터를 읽기. (r = read).
- 파일에 데이터를 쓰기. (w = write).
- 파일 실행. (x = execute)
그런데 만약 리눅스 시스템의 모든 파일이, 그 종류 또는 쓰임새와 관계없이 읽기, 쓰기, 실행 가능하게 만들어져 있다면 어떻게 될까요? 잘못된 명령어 사용으로 시스템 운영에 중요한 역할을 하는 파일의 내용이 변경되거나, 사용자의 사소한 실수 한번으로 리눅스 시스템의 모든 파일이 삭제되어 버릴 수도 있습니다.
이런 문제가 생기는 경우를 방지하기 위해, 리눅스에서는 각 파일 및 디렉토리에 대해 "읽기(r)", "쓰기(w)", "실행(x)" 권한(permission)을 파일 개별적으로 지정할 수 있도록 만들어 놓았습니다. 그리고 이 세 가지 권한을 "파일을 소유한 사용자(user)", "특정 그룹(group)에 소속된 사용자", "그 외 사용자(others)"에 대해 각각 지정할 수 있게 만들었습니다.
chmod 명령은 바로 이러한 파일의 권한을 변경할 수 있게 만들어주는 명령입니다. "change"와 "mode"의 앞 글자들을 조합한 이름이죠. (chmod = ch + mod)
여기서 "모드(mode)"란, 앞서 소개한 세 가지 권한(읽기, 쓰기, 실행)과 각각의 권한을 지정할 대상(파일 소유자, 그룹, 그외 사용자)을 포함한 파일의 속성을 말합니다. 즉, chmod 명령에서 지정하는 읽기(r), 쓰기(w), 실행(x) 권한 및 소유자(user), 그룹(group), 그 외 사용자(others)에 대한 설정 값을 통틀어 "모드(mode)"라고 지칭합니다. 그러므로 chmod 명령을 사용하여 파일의 모드(mode)를 변경한다는 것은 파일의 권한을 변경한다는 것과 동일한 의미를 가집니다.
2. chmod 명령
앞서 설명했듯이 chmod 명령은 파일의 모드(mode)를 변경하는 명령입니다. chmod 다음에 "선택 옵션"과 "모드를 나타내는 문자열", 그리고 "대상 파일(또는 디렉토리)"을 순서대로 입력하여 파일의 모드를 변경할 수 있습니다.
chmod [OPTION] [MODE] [FILE] OPTION -v : 모든 파일에 대해 모드가 적용되는 진단(diagnostic) 메시지 출력. -f : 에러 메시지 출력하지 않음. -c : 기존 파일 모드가 변경되는 경우만 진단(diagnostic) 메시지 출력. -R : 지정한 모드를 파일과 디렉토리에 대해 재귀적으로(recursively) 적용. MODE 파일에 적용할 모드(mode) 문자열 조합. u,g,o,a : 소유자(u), 그룹(g), 그 외 사용자(o), 모든 사용자(a) 지정. +,-,= : 현재 모드에 권한 추가(+), 현재 모드에서 권한 제거(-), 현재 모드로 권한 지정(=) r,w,x : 읽기 권한(r), 쓰기 권한(w), 실행 권한(x) X : "디렉토리" 또는 "실행 권한(x)이 있는 파일"에 실행 권한(x) 적용. s : 실행 시 사용자 또는 그룹 ID 지정(s). "setuid", "setgid". t : 공유모드에서의 제한된 삭제 플래그를 나타내는 sticky(t) bit. 0~7 : 8진수(octet) 형식 모드 설정 값.
위에서 볼 수 있듯이, chmod에서 제공되는 OPTION의 종류는 그리 많지 않습니다. 지정 디렉토리 하위의 모든 디렉토리와 파일의 모드를 변경하는 "-R" 외에는 거의 사용하지 않기 때문에 크게 신경쓰지 않아도 되는데요. 하지만 MODE로 전달되는 파라미터에는 조금(?) 복잡한 문자열 조합이 적용됩니다. 그리고 MODE에 전달되는 이 문자열 조합이, chmod 명령의 동작을 이해하는 핵심이 되는 내용이죠.
2.1 chmod 명령의 MODE 파라미터.
언뜻 보기에, MODE 파라미터에 적용되는 문자열이 꽤 복잡해 보일 수 있지만, 사실, 알고보면 매우 직관적입니다. MODE 파라미터로 조합되는 문자 조합을 생각하기 전에, 파일에 지정하고자 하는 권한을 먼저 서술형 문장으로 표현해보면 chmod 명령 작성을 좀 더 쉽게 할 수 있습니다. 한번 문장으로 표현해볼까요?
- 파일을 소유한 사용자에 대해 읽고 쓸 수있는 권한 지정.
- 파일이 속한 그룹이 실행할 수 있는 권한 추가.
- 시스템의 모든 사용자가 읽을 수만 있는 권한 지정.
- 파일을 소유한 그룹과 그 외 사용자의 모든 권한 제거.
자, 이제 할 일은, 저 문장에 들어 있는 단어들을 "MODE 파라미터의 문자"들로 바꾸기만 하면 됩니다. 앞서 chmod 명령의 MODE 파라미터에 적어놨지만, 아래 그림을 참고하면 조금 더 직관적으로 이해하실 수 있을거라 생각합니다.
위의 첫 번째 문장을 chmod 명령으로 바꾸면, MODE 파라미터는 아래 그림과 같이 조합될 수 있습니다.
이 규칙대로 변환하면 나머지 문장들에 대한 MODE 파라미터 조합도 그리 어렵지 않게 하실 수 있을거라 생각합니다.
- 파일이 속한 그룹이 실행할 수 있는 권한 추가.
$ chmod g+x FILE
- 시스템의 모든 사용자가 읽을 수만 있는 권한 지정.
$ chmod a=r FILE
- 파일을 소유한 그룹과 그 외 사용자의 모든 권한 제거.
$ chmod go-rwx FILE
그런데 권한 "지정(=)"은 전달된 권한으로 온전히 설정되지만, "추가(+)"와 "제거(-)"는 파일이 기존에 가지고 있던 권한을 기준으로, 새로운 권한이 추가되거나 지정된 권한이 제거됩니다. 그렇다면 파일이 기존에 가지고 있던 권한을 확인할 수 있어야 겠죠? 간단하게 "ls -l" 명령을 사용하면 파일의 현재 권한을 확인할 수 있습니다.
2.2 파일 또는 디렉토리 권한 확인.
리눅스에서 파일 또는 디렉토리에 지정된 권한을 확인하려면 "ls -l" 명령을 사용하면 됩니다.
$ ls -l
-rw-r--r-- 1 ppotta manager 17 Mar 24 03:17 FILE
"ls -l" 명령을 실행하면, 현재 디렉토리 내 파일 리스트(ls=list)가 하나의 파일 단위로 한줄로 길게(-l=long) 표시되는데요. 공백 기준으로 가장 첫 번째 항목(-rw-r--r--)이 파일 소유자 별 권한, 세 번째(ppotta)와 네 번째(manager) 항목이 각각 파일 소유자와 그룹을 나타냅니다.
앞서 실행한 "ls -l" 명령의 실행 결과를 해석하면, 그 결과는 아래와 같습니다.
-rw-r--r-- 1 ppotta manager 17 Mar 24 03:17 FILE
- 파일 소유 사용자 : ppotta
- 파일 소유 그룹 : manager
- 파일 소유 사용자(ppotta)의 권한 : "rw-" = 읽기(r), 쓰기(w) 가능.
- 파일 소유 그룹(manager)의 권한 : "r--" = 읽기(r) 가능.
- 그 외 사용자(others)의 권한 : "r--" = 읽기(r) 가능.
이제 "ls -l" 명령을 사용하여 파일에 설정된 권한을 확인하는 법을 알았으니, 추가(+)와 삭제(-)를 통해 파일에 권한을 추가하거나 제거하는 방법을 쉽게 쓸 수 있겠죠?
그런데 여기서 한 가지 의문이 생기네요. "파일"에 대한 읽기(r), 쓰기(w), 실행(x)은 그 의미가 명확한데, "디렉토리"에 대한 각각의 권한은 뭘 의미하는 걸까요? 음... 읽기(r)와 쓰기(w)는 어렴풋이 그 의미가 와닿는 것 같은데... 그런데 디렉토리는 "실행"이라는 개념을 적용할 수가 없으니, 애초부터 "실행(x)" 권한은 디렉토리에는 소용없는 걸까요?
2.3 디렉토리에 대한 권한.
디렉토리는 파일을 분류하기 위해 사용합니다. 그리고 디렉토리 내부에는 다른 파일 또는 디렉토리의 리스트가 존재합니다. 본문의 시작 부분에, 파일로 할 수 있는 세 가지 작업(데이터 읽기, 데이터 쓰기, 파일 실행)에 대해 소개했는데요. 마찬가지로, 디렉토리로 할 수 있는 작업도 크게 세 가지로 나뉩니다.
- 디렉토리에 있는 파일 및 디렉토리 리스트 읽기. (r = read)
- 디렉토리에 파일 추가, 이름 변경, 삭제. (w = write)
- 디렉토리에 접근. cd 명령으로 working directory 이동. (x = execute)
먼저, 읽기(r) 권한은 디렉토리에 있는 파일 리스트를 확인할 수 있는 권한을 의미합니다. 즉, "ls" 명령을 통해 디렉토리의 리스트를 확인할 때 "읽기(r)" 권한이 있어야 합니다. 만약 디렉토리에 읽기(r) 권한이 없다면, "ls" 명령을 수행할 때 "permission denied" 에러가 발생합니다. (참고로, 읽기(r) 권한만 있는 경우 "파일 이름"만 확인 가능하고, 파일의 모든 정보를 확인("ls -l")하기 위해서는 실행(x) 권한이 있어야 합니다.)
$ ls -l
total 4
d--------- 2 ppotta ppotta 4096 Mar 26 00:50 DIR
$ ls DIR
ls: cannot open directory 'DIR': Permission denied
다음, 쓰기(w) 권한은 디렉토리에 파일을 생성하거나, 복사, 이름 변경, 삭제 등의 작업을 하고자 할 때 필요한 권한입니다. 말 그대로 "디렉토리의 내용을 변경"하기 때문에 "쓰기(w)" 권한이 필요한 것인데요. 한 가지 주의할 점은, 쓰기(r) 권한만 있다고 해서 생성, 복사, 변경, 삭제 등의 작업이 수행되지는 않고, 실행(x) 권한도 같이 지정되어 있어야 원하는 작업이 정상적으로 수행됩니다.
마지막으로 실행(x) 권한은 디렉토리에 접근하고자 할 때 필요한 권한입니다. cd 명령을 사용해 디렉토리에 접근할 때 필요한 권한인데요. 하지만 단순히 cd 명령으로 working 디렉토리를 변경하는 경우에만 국한 된 것이 아니라, "접근" 권한이라는 이름이 내포하듯이, 디렉토리에 어떤 작업(읽기, 쓰기)을 할 때 디렉토리에 접근하기 위해 이 실행(x) 권한이 필요합니다. 즉, 실행(x) 권한 없이는 읽기(r)와 쓰기(w) 권한을 완전히 사용할 수 없습니다.
결론적으로, 아래와 같이 정리할 수 있겠네요.
- 디렉토리의 내용을 읽기 위해서는 읽기(r) 권한 필요.
- 디렉토리의 내용을 변경하기 위해서는 쓰기(w) 권한 필요.
- 디렉토리의 접근을 위해 실행(x) 권한 필요하며 가장 기본적인 접근 권한.
2.4 8진수(octal) 형식으로 파일 모드(mode) 지정 방법.
지금까지 다소 장황하게 MODE 파라미터 문자열을 조합하여 파일 모드(mode)를 변경하는 방법에 대해 설명했는데요. 앞서 설명한 내용보다 조금 더 간단하게 파일 모드(mode)를 지정하는 방법이 있습니다. 바로, MODE 파라미터에 파일 모드(mode)를 표현하는 8진수 값을 사용하는 것입니다.
앞서 "ls -l" 명령을 통해 현재 파일의 권한을 확인하는 방법에 대해 알아보았죠? 출력된 결과의 가장 첫 번째 항목을 통해 "사용자(u)", "그룹(g)", "그 외 사용자(o)"에 대한 "읽기(r)", "쓰기(w)", "실행(x)" 권한을 확인할 수 있는데요.
"8진수" 값을 사용하는 방법은 각 권한(rwx)을 8진수 형태의 숫자 값으로 변환하여 한번에 지정하는 방법입니다. 즉, 그림의 "rwxrwxrwx" 중 "rwx"를 하나의 8진수 값으로 변환한 다음, 이 값을 연속 세 개(사용자, 그룹, 그 외 사용자)로 나열하여 전달하는 것입니다. 이 때, 권한 없음(-)은 0, 읽기(r)는 4, 쓰기(w)는 2, 그리고 실행(x)은 1에 해당하는 값을 가지며, 이 값들을 모든 더한 값이 하나의 8진수 값으로 변환됩니다.
아래 그림을 보면 조금 더 쉽게 이해하실 수 있을거라 생각되네요.
어렵지 않죠? 몇 가지 예제를 통해 8진수 형식으로 파일 모드(mode)를 지정하는 방법을 살펴보겠습니다.
- 모든 사용자가 읽고 쓰고 실행할 수 없도록 지정.
$ chmod 000 FILE ---------- 1 ppotta manager 23 Mar 26 04:13 FILE
- 모든 사용자가 읽고 쓰고 실행할 수 있는 권한 지정.
$ chmod 777 FILE -rwxrwxrwx 1 ppotta manager 23 Mar 26 04:13 FILE
- 소유자는 모든 권한, 그룹 및 그 외 사용자는 읽기와 실행만 가능.
$ chmod 755 FILE -rwxr-xr-x 1 ppotta manager 23 Mar 26 04:13 FILE
- 소유자 및 그룹은 읽기 가능, 그외 사용자는 권한 없음.
$ chmod 440 FILE -r--r----- 1 ppotta manager 23 Mar 26 04:13 FILE
8진수 형식을 이용할 때는 MODE 파라미터로 전달되는 값이 파일의 권한에 그대로 적용되기 때문에 u, g, o, a 또는 =, +, - 등과 같이 사용할 수 없습니다.
3. chmod 명령 사용 예제.
그럼 이제, 다양한 예제를 통해 chmod 사용 방법을 알아보겠습니다.
$ chmod u+x FILE # 파일 소유 사용자에게 실행권한 추가.
$ chmod u+w FILE # 파일 소유 사용자에게 쓰기 권한 추가.
$ chmod u=rwx FILE # 파일 소유 사용자에게 읽기, 쓰기, 실행 권한 지정.
$ chmod u-x FILE # 파일 소유 사용자의 실행 권한 제거.
$ chmod g+w FILE # 파일 소유 그룹에 쓰기 권한 추가.
$ chmod g-x FILE # 파일 소유 그룹의 실행 권한 제거.
$ chmod o=r FILE # 파일 소유 사용자 및 그룹을 제외한 사용자는 읽기만 가능.
$ chmod a-x * # 현재 디렉토리의 모든 파일에서 모든 사용자의 읽기 권한 제거.
$ chmod a-w FILE # 모든 사용자에 대해 쓰기 권한 제거.
$ chmod u=rwx,g=r FILE # 파일 소유 사용자는 모든 권한, 그룹은 읽기만 가능.
$ chmod ug=rw FILE # 파일 소유 사용자와 그룹이 읽기, 쓰기 가능.
$ chmod g=rw,o=r FILE # 파일 소유 그룹은 읽기, 쓰기 가능, 그 외 사용자는 읽기만 가능.
$ chmod ug=rw,o=r FILE # 파일 소유 사용자 및 그룹은 일기, 쓰기 가능, 그외 사용자는 읽기만 가능.
$ chmod 000 FILE # 모든 사용자의 모든 권한 제거. = ---------
$ chmod 664 FILE # 사용자(읽기+쓰기), 그룹(읽기+쓰기), 그외 사용자(읽기) = rw-rw-r--
$ chmod 755 FILE # 사용자(읽기+쓰기+실행), 그룹(읽기+실행), 그외 사용자(읽기+실행) = rwxr-xr-x
$ chmod 777 FILE # 모든 사용자에 모든 권한 추가.
$ chmod -R g+x DIR # DIR 디렉토리 하위 모든 파일 및 디렉토리에 그룹 실행(x) 권한 추가.
$ chmod -R o-wx * # 현재 디렉토리의 모든 파일에서 그외 사용자의 쓰기, 실행 권한 제거
$ chmod -R a-x,a+X * # 현재 디렉토리 기준 모든 파일 읽기 권한 제거, 디렉토리 실행 권한 추가.
$ chmod -R a-x+X * # 위(chmod -R a-x,a+X *)와 동일.
$ chmod u=g FILE # FILE의 그룹 권한 값을 사용자 권한으로 적용.
$ ls -l
-rwxr--r-- 1 ppotta manager 23 Mar 26 04:13 FILE
$ chmod u=g FILE
-r--r--r-- 1 ppotta manager 23 Mar 26 04:13 FILE
$ chmod u+g FILE # FILE의 사용자 권한에 그룹 권한 값을 추가.
$ ls -l
-r-x-w--w- 1 ppotta manager 23 Mar 26 04:13 FILE
$ chmod u+g FILE
-rwx-w--w- 1 ppotta manager 23 Mar 26 04:13 FILE
4. 추가.
4.1 X (대문자 X) 가 가진 의미.
[chmod 명령에서 X (대문자 X)가 가지는 의미.] 내용을 참고하세요.
5. 참고.
- 개발자를 위한 레시피 - chmod 명령어 사용법.
- [chmod 명령에서 X (대문자 X)가 가지는 의미.] 내용을 참고하세요.
- Man7 Linux Manual Page - chmod
- [Man7. man. chmod] 내용을 참고하세요.
.END.
'LINUX 시스템 > 명령어 사용법' 카테고리의 다른 글
리눅스 cat 명령어 사용법. (Linux cat command) - 리눅스 파일 내용 출력. (7) | 2021.11.29 |
---|---|
chmod 명령에서 X (대문자 X)가 가지는 의미. (4) | 2021.04.02 |
리눅스 awk 명령어 사용법. (Linux awk command) - 리눅스 파일 텍스트 데이터 검사, 조작, 출력. (40) | 2019.07.03 |
리눅스 grep 명령어 사용법. (Linux grep command) - 리눅스 문자열 검색 (20) | 2019.04.02 |
리눅스 find 명령어 사용법. (Linux find command) - 리눅스 파일 검색. (29) | 2019.03.21 |