chmod 명령에서 X (대문자 X)가 가지는 의미.

2021. 4. 2. 16:04

1. 리눅스 파일 사용 권한

지난 글, [리눅스 chmod 명령어 사용법. (Linux chmod command) - 리눅스 파일 권한 변경.]에서, 리눅스 chmod 명령의 기본 사용법에 대해 설명하였습니다. 파일 및 디렉토리의 권한에 대해 설명하고, chmod에 전달되는 MODE 파라미터를 적용하는 방법 및 예제를 소개했는데요.

이번 글에서는 [리눅스 chmod 명령어 사용법. (Linux chmod command) - 리눅스 파일 권한 변경.]에서 다 소개하지 못한 MODE 파라미터 중, X (대문자 X)에 대한 내용을 살펴보도록 하겠습니다.

  • X : "디렉토리" 또는 "실행(x) 권한이 있는 파일"에 실행(x) 권한 적용.

chmod X (대문자 X)

2. X (대문자 X) : "디렉토리" 또는 "실행(x) 권한이 있는 파일"에 실행(x) 권한 적용.

chmod 명령의 MODE 파라미터에 사용할 수 있는 X(대문자 X)는 "디렉토리 및 실행(x) 권한이 있는 파일에 실행(x) 권한을 적용"하고자 할 때 사용합니다. 음... 적어놓고도 그 의미가 이상하게 보이네요. 실행(x) 권한이 있는 파일에 실행(x) 권한을 적용한다니... 아무런 의미가 없는 작업인 것 같은데... 뭔가 이상합니다.

그럼, 살짝 다르게 표현해볼게요.

X(대문자 X)는 권한 지정 대상이 "실행(x) 권한을 가져도 괜찮은 경우에만 실행 권한을 지정"하고자 할 때 사용합니다.


조금은 더 그 의미가 와닿나요? 조금 더 설명해볼게요.

2.1 리눅스에서의 실행 가능 파일.

리눅스에서, 파일이 실행 가능한지 여부는 확장자 또는 파일 형식에 의해 결정되지 않습니다. 파일이 실행(x) 권한을 가지고 있는지에 따라 결정되죠. 이러한 특징은, 시스템 관리와 사용 측면에서 많은 이점을 가져다주지만, 사용자의 사소한 실수 하나에 큰 위험이 발생할 수 있는 단점 또한 가지고 있습니다.

예를 들어, 아래와 같은 내용을 가진 "test"라는 텍스트 파일이 있을 때,

echo 'TEST'

파일 "test"가 실행(x) 권한을 가지면 쉘에서 "test"를 실행하고 그 결과(echo 명령 실행)를 확인할 수 있습니다.

$ ls -l
-rwxr-xr-x 1 ppotta ppotta 11 Mar 31 23:09 test
$ cat test
echo 'TEST'
$ ./test
TEST

즉, 텍스트 파일에 실행할 명령을 나열해 두고 실행(x) 권한을 준 다음 파일을 실행하면, 파일에 나열된 명령(예제의 echo 명령)들을 한번에 실행할 수 있는 것이죠. 매우 간편해 보이네요. 한번에 실행할 명령들을 쭉 나열해두고, 실행(x) 권한을 준 다음 실행하면 정말 편하게 사용할 수 있을 것 같습니다. (물론, 리눅스에는 그런 용도를 위한 쉘스크립트(shell script)라는게 있지요.)

그런데 만약 어떤 파일에 실행 목적이 아닌 기록 목적으로 "rm -rf *"라는 문장을 적어두었는데, 그 파일이 실행 권한을 가지게 되고 실행될 수 있다면 어떻게 될까요? 으.. 생각만 해도 끔찍하네요.

물론 이런 파일에 실행(x) 권한을 주지 않으면 전혀 문제될 게 없습니다. 일부러 실행(x) 권한을 줄 이유도 없고요. 하지만 시스템을 사용하다보면 의도치 않게 파일의 속성을 변경해버리는 경우가 가끔 생깁니다.

음, 하나의 경우를 가정해볼까요? 어느 날 우연히, 어떤 디렉토리 하위의 몇 개의 디렉토리들에 실행(x) 옵션이 빠져 있는 걸 발견했습니다. 파일을 일일이 찾아서 실행(x) 옵션을 추가하려니 번거롭게 느껴지네요. 그래서, 간단하게 "+x"를 적용하여 실행 권한을 추가하기로 결정합니다. 물론 하위 디렉토리를 모두 바꿔야 하니 "-R" 옵션을 적용하겠죠. (chmod -R +x *)

$ ls -l
drw-r--r-- 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rw-r--r-- 1 ppotta ppotta   12 Mar 31 23:37 test
$ chmod -R +x *
$ ls -l
drwxr-xr-x 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rwxr-xr-x 1 ppotta ppotta   12 Mar 31 23:37 test

실행 결과를 확인해보면 디렉토리(DIR)에 실행(x) 권한이 정상적으로 적용된 것을 확인할 수 있는데요. 하지만 디렉토리가 아닌, "test" 파일("rm -rf *"가 기록된)에도 실행(x) 권한이 적용되어 버렸네요. 아주 위험한 파일이 실행(x) 권한을 가지게 되어 버렸습니다.

2.2 안전하게 실행(x) 권한 지정.

자, 이제 X (대문자 X)의 설명으로 다시 돌아가 볼까요? 이제 그 의미가 이해되실거라 생각되네요.

chmod에서 X(대문자 X)는 "대상이 실행(x) 권한을 가져도 괜찮은 경우에만 실행 권한을 지정"할 때 사용하며, 이 때 실행(x) 권한을 가져도 괜찮은 대상은 "디렉토리" 또는 "이미 실행(x) 권한을 가진 파일"을 말합니다. 즉, 기존에 실행(x) 권한이 없던 파일에는 실행(x) 권한을 주고 싶지 않을 때, x (소문자 x) 대신 X (대문자 X)를 사용하는 것이죠.

$ ls -l
drw-r--r-- 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rw-r--r-- 1 ppotta ppotta   12 Mar 31 23:37 test
$ chmod -R a+X *
$ ls -l
drwxr-xr-x 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rw-r--r-- 1 ppotta ppotta   12 Mar 31 23:37 test

2.3 -X

X(대문자 X)와 -(제거)를 같이 사용하면, x(소문자 x)를 사용하는 것과 동일한 결과가 나옵니다. 참고로 "-X"는 "a-X"와 동일한 표현입니다. "chmod -R -X *"에서 "-X"를 보고 "-R"처럼 chmod 명령에 사용할 수 있는 OPTION 중 하나라는 오해를 하지는 않길 바랍니다. "chmod -R -X *"는 "chmod -R a-X *"와 같은 의미입니다.

$ ls -l
drwxr-xr-x 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rwxr-xr-x 1 ppotta ppotta   12 Mar 31 23:37 test
$ chmod -R -X *
$ ls -l
drw-r--r-- 2 ppotta ppotta 4096 Mar 31 23:59 DIR
-rw-r--r-- 1 ppotta ppotta   12 Mar 31 23:37 test

3. chmod 명령 사용 예제.

아래 정리한 내용에서 X(대문자 X)를 사용하는 예제를 참고하시기 바랍니다.

$ chmod u+X FILE                    # FILE이 실행 권한을 가진 경우에만 파일 소유 사용자에게 실행 권한 추가.

$ chmod -R a-x,a+X *                # 현재 디렉토리 아래 모든 파일의 실행 권한 제거, 디렉토리 실행 권한 추가.

$ chmod -R a-x+X *                  # 위(chmod -R a-x,a+X *)와 동일.

4. 참고.

.END.

LINUX 시스템/명령어 사용법