본문으로 바로가기
Lab

chmod 명령어 사용법, 숫자와 기호 권한을 파일과 폴더에 걸어 보니

chmod로 755, 644, 600과 u+x를 맥 터미널의 파일과 폴더에 직접 걸어 본 기록입니다. 실행 권한이 없을 때 막히는 모습, 폴더의 읽기와 실행 차이, 기본 권한, Claude Code가 제안한 명령과 실행 결과까지 출력 그대로 보여 줍니다.

·

주인·그룹·다른 사람을 뜻하는 세 개의 자물쇠 칸에 읽기·쓰기·실행 열쇠가 꽂혀 있는 개념 그림
chmod 명령어 사용법, 숫자와 기호 권한을 파일과 폴더에 걸어 보니 표지 삽화

연습용으로 만든 셸 스크립트를 ./run.sh로 돌렸더니 zsh:2: permission denied: ./run.sh가 뜨고 종료 코드 126으로 끝났습니다. 그런데 chmod +x 한 번이면 같은 스크립트가 '실행됨'을 찍었고, 권한을 바꾸고 확인하고 실행하기까지 한 단계 전체가 0.3초에 끝났죠. 이 글은 chmod의 숫자 방식과 기호 방식을 새 연습 폴더의 파일과 폴더에 차례로 걸어 보고 나온 출력을 그대로 옮긴 기록입니다.

755와 644는 무엇을 바꿀까요?

chmod는 파일과 폴더의 읽기(r)·쓰기(w)·실행(x) 권한을 주인·그룹·다른 사람별로 바꾸는 명령입니다. 숫자는 r=4, w=2, x=1을 더한 값을 세 자리로 적은 것이라 755는 rwxr-xr-x, 644는 rw-r--r--가 됩니다.

직접 실행해 보면 차이가 바로 드러나요. 실행 권한이 없는 스크립트는 permission denied로 막혔고, chmod +x 뒤에는 정상적으로 돌았습니다. 폴더는 x를 뺀 644로 두자 cd로 들어갈 수 없었고, 755로 돌리자 안으로 들어가 파일 목록을 볼 수 있었습니다.

자주 쓰는 chmod 숫자 755, 644, 600, 700, 777이 ls -l에서 어떤 권한 글자로 보이는지 정리한 표
r=4, w=2, x=1을 더한 숫자를 주인·그룹·다른 사람 순서로 세 자리 적는다
도식출처: 직접 실행한 순서

함께 읽을 글

권한 열 글자를 읽는 법

ls -l을 실행하면 맨 앞에 권한이 나옵니다. 방금 만든 스크립트를 찍어 보면 이렇습니다.

$ printf '#!/bin/sh\necho 실행됨\n' > run.sh && ls -l run.sh
-rw-r--r--@ 1 finn  wheel  25 Oct 27 17:29 run.sh

첫 글자는 종류를 나타내는데, 일반 파일은 -이고 뒤에서 볼 폴더 출력에는 d가 붙습니다. 나머지 아홉 글자는 세 글자씩 주인·그룹·다른 사람 몫이에요. 새로 만든 run.sh는 rw-r--r--라서 누구에게도 x가 없습니다. 끝의 @는 맥 출력에 붙은 표시인데, 이번 실행에서는 그 뜻을 따로 확인하지 않았습니다.

실행 권한이 없으면 왜 막힐까요?

x가 없는 상태에서 바로 실행하면 셸이 거부합니다.

$ ./run.sh
zsh:2: permission denied: ./run.sh

이 단계의 종료 코드는 126이었습니다. 이제 chmod +x로 실행 권한을 붙이고 다시 돌려 봅니다.

$ chmod +x run.sh && ls -l run.sh && ./run.sh
-rwxr-xr-x@ 1 finn  wheel  25 Oct 27 17:29 run.sh
실행됨

누구에게 줄지를 적지 않은 +x였는데, 이번 실행에서는 주인·그룹·다른 사람 세 자리 모두에 x가 붙었습니다. 에이전트가 만든 배포 스크립트나 훅 스크립트가 permission denied로 멈췄다면, 코드를 고치기 전에 ls -l로 x가 있는지부터 확인해 보세요.

숫자로 한 번에 정하는 방법

숫자 방식은 지금 상태와 상관없이 세 자리를 통째로 덮어씁니다. 같은 파일에 755, 644, 600을 차례로 걸어 보면 이렇습니다.

$ chmod 755 run.sh && ls -l run.sh && chmod 644 run.sh && ls -l run.sh && chmod 600 run.sh && ls -l run.sh
-rwxr-xr-x@ 1 finn  wheel  25 Oct 27 17:29 run.sh
-rw-r--r--@ 1 finn  wheel  25 Oct 27 17:29 run.sh
-rw-------@ 1 finn  wheel  25 Oct 27 17:29 run.sh
숫자결과이번 실행에서 본 뜻
755rwxr-xr-x주인은 모두, 나머지는 읽기·실행
644rw-r--r--주인은 읽기·쓰기, 나머지는 읽기만
600rw-------주인만 읽기·쓰기

그럼 600은 언제 쓸까요? API 키를 담은 설정 파일처럼 나만 읽고 써야 하는 파일이라면 600을 먼저 떠올려 볼 만합니다. GNU coreutils의 파일 권한 설명서도 권한을 기호 또는 8진수 숫자로 나타낼 수 있다고 설명합니다. chmod 설명서에는 같은 결과를 두 방식으로 적은 예시가 있어요.

chmod 644 foo
chmod a=r,u+w foo

기호로 하나씩 더하고 빼는 방법

기호 방식은 지금 권한에서 필요한 자리만 손댑니다. u는 주인, g는 그룹, o는 다른 사람이고 +는 더하기, -는 빼기, =는 그 값으로 정하기입니다. 644에서 시작해 하나씩 바꿔 보았습니다.

$ chmod 644 run.sh && chmod u+x run.sh && ls -l run.sh && chmod g+w run.sh && ls -l run.sh && chmod o= run.sh && ls -l run.sh
-rwxr--r--@ 1 finn  wheel  25 Oct 27 17:29 run.sh
-rwxrw-r--@ 1 finn  wheel  25 Oct 27 17:29 run.sh
-rwxrw----@ 1 finn  wheel  25 Oct 27 17:29 run.sh

o=처럼 등호 뒤를 비우면 그 자리의 권한이 모두 사라집니다. 반대로 그룹 쓰기를 빼고 싶다면 g-w처럼 -를 쓰면 되죠. 설명서는 모두의 쓰기를 뺄 때 chmod -w file보다 chmod a-w file처럼 대상을 적는 쪽을 권합니다.

644에서 시작해 u+x, g+w, o=를 걸 때마다 권한 글자가 어떻게 바뀌는지와 마지막 숫자 760을 보여 주는 표
기호 방식은 지정한 자리만 바꾸고, 마지막 상태는 숫자 760으로 확인됐습니다
도식출처: 근거를 바탕으로 코드가 그린 도식

지금 권한을 숫자로 확인하는 방법

기호를 여러 번 걸고 나면 지금 숫자가 얼마인지 헷갈립니다. 이럴 때는 맥에서 stat으로 숫자와 글자를 함께 볼 수 있어요.

$ stat -f '%A %Sp %N' run.sh
760 -rwxrw---- run.sh

앞 절의 마지막 상태가 760으로 나옵니다. 이 -f 형식은 맥의 stat 기준이고, 리눅스에서는 이번에 실행해 보지 않았습니다.

읽기 권한을 모두 없앤 파일

이번에는 메모 파일에 000을 걸어 아무 권한도 남기지 않았습니다.

$ echo '비밀 메모' > note.txt && chmod 000 note.txt && ls -l note.txt && cat note.txt
----------  1 finn  wheel  14 Oct 27 17:29 note.txt
cat: note.txt: Permission denied

주인이 직접 만든 파일인데도 cat이 거부했고 종료 코드는 1이었습니다. 다시 644로 돌리자 바로 읽혔어요.

$ chmod 644 note.txt && cat note.txt
비밀 메모

권한을 다시 바꿀 수 있었던 건 파일 주인이기 때문입니다. 설명서도 파일의 사용자 ID와 같은 프로세스나 적절한 권한을 가진 프로세스만 권한 비트를 바꿀 수 있다고 적고 있습니다.

폴더에서 읽기와 실행은 어떻게 다를까요?

파일에서는 x가 '실행'이지만 폴더에서는 결과가 다르게 나타납니다. 안에 파일 하나를 둔 폴더에 x가 없는 644를 걸어 보았습니다.

$ mkdir box && touch box/a.txt && chmod 644 box && ls -ld box && ls box; cd box
drw-r--r--@ 3 finn  wheel  96 Oct 27 17:29 box
ls: fts_read: Permission denied
a.txt
zsh:cd:2: permission denied: box

r이 남아 있어서인지 ls box는 오류와 함께 a.txt라는 이름까지는 보여 줬습니다. 하지만 cd는 막혔고 이 단계의 종료 코드는 1이었습니다. 폴더를 755로 바꾸면 들어가서 자세한 목록까지 볼 수 있었어요.

$ chmod 755 box && ls -ld box && cd box && ls -l
drwxr-xr-x@ 3 finn  wheel  96 Oct 27 17:29 box
total 0
-rw-r--r--@ 1 finn  wheel  0 Oct 27 17:29 a.txt
x가 빠진 폴더는 이름표만 보이고 문이 잠겨 있고, x가 있는 폴더는 문이 열려 있는 개념 그림
폴더에 x가 없으면 들어갈 수 없다는 점을 문에 빗댄 개념 그림입니다

정적 파일 폴더나 업로드 폴더를 서버에 올렸는데 접근이 안 된다면, 파일 권한보다 폴더에 x가 있는지를 먼저 확인해 보는 편이 빠릅니다.

폴더 안까지 한 번에 바꾸는 방법

-R을 붙이면 폴더와 그 안의 내용까지 같이 바뀝니다. 작은 사이트 구조를 만들고 700을 걸었습니다.

$ mkdir -p site/css site/js && touch site/index.html site/css/a.css site/js/b.js && chmod -R 700 site && ls -lR site | grep -v '^total'
drwx------@ 3 finn  wheel  96 Oct 27 17:29 css
-rwx------@ 1 finn  wheel   0 Oct 27 17:29 index.html
drwx------@ 3 finn  wheel  96 Oct 27 17:29 js

site/css:
-rwx------@ 1 finn  wheel  0 Oct 27 17:29 a.css

site/js:
-rwx------@ 1 finn  wheel  0 Oct 27 17:29 b.js

폴더뿐 아니라 index.html, a.css 같은 일반 파일에도 x가 붙었습니다. 숫자로 -R을 쓰면 폴더와 파일을 구분하지 않는다는 점을 이 출력에서 볼 수 있죠. GNU 설명서에는 대문자 X로 폴더와 이미 실행 가능한 파일에만 x를 주는 예시가 있지만, 이번 실행에서는 돌려 보지 않았습니다.

chmod -R a=,+rwX dir

설명서는 -R에 심볼릭 링크를 따라가는 -L 같은 옵션을 함께 쓰면 보안 위험이 생길 수 있다고도 경고합니다.

새 파일의 기본 권한은 어디서 정해질까요?

chmod를 한 번도 안 걸었는데 새 파일과 새 폴더에서 그룹과 다른 사람의 쓰기(w)가 빠진 이유는 umask에 있습니다.

$ umask && touch new.txt && mkdir newdir && ls -ld new.txt newdir
022
-rw-r--r--@ 1 finn  wheel   0 Oct 27 17:29 new.txt
drwxr-xr-x@ 2 finn  wheel  64 Oct 27 17:29 newdir

이 터미널의 umask는 022였고, 새 파일은 rw-r--r--, 새 폴더는 rwxr-xr-x로 만들어졌습니다. 022는 그룹과 다른 사람의 쓰기(w)를 빼는 값이라, 두 결과 모두 그룹과 다른 사람 자리에 w가 없습니다. 이번 환경에서 새로 만든 파일에는 x가 없었습니다. umask 022는 x를 빼는 값이 아니므로 파일에 x가 빠진 까닭은 umask로 설명되지 않으며, 이번 실행에서는 그 까닭을 따로 확인하지 않았습니다. 직접 실행하려면 앞에서처럼 chmod +x로 실행 권한을 따로 추가해야 했습니다.

모두에게 모든 권한을 주면

permission denied를 빨리 없애려고 777을 쓰는 경우가 많죠. 결과는 이렇습니다.

$ chmod 777 run.sh && ls -l run.sh && stat -f '%A %N' run.sh
-rwxrwxrwx@ 1 finn  wheel  25 Oct 27 17:29 run.sh
777 run.sh

실행은 되지만 그룹과 다른 사람에게까지 쓰기(w)가 열립니다. 막힌 원인이 실행 권한 하나라면 u+x처럼 필요한 자리만 여는 쪽이 의도에 맞습니다. AI 도구가 777을 제안하더라도 그대로 받기 전에 어느 자리가 실제로 필요한지 따져 보세요.

코딩 에이전트에 권한 명령을 맡기면

마지막으로 Claude Code(--model opus)에게 .sh 파일에만 주인 실행 권한을 주는 명령을 한 줄로 달라고 했습니다. 받은 답을 파일로 저장해 먼저 보고, 그대로 실행한 뒤 결과를 확인했습니다.

$ mkdir -p tools && touch tools/a.sh tools/b.sh tools/readme.md && claude --model opus -p "맥 터미널에서 tools 폴더 안의 .sh 파일에만 주인 실행 권한을 주는 명령 한 줄만 출력해. 설명이나 코드 블록 표시는 붙이지 마." > cmd.txt && cat cmd.txt && sh cmd.txt && ls -l tools
chmod u+x tools/*.sh
total 0
-rwxr--r--@ 1 finn  wheel  0 Oct 27 17:29 a.sh
-rwxr--r--@ 1 finn  wheel  0 Oct 27 17:29 b.sh
-rw-r--r--@ 1 finn  wheel  0 Oct 27 17:29 readme.md

답은 chmod u+x tools/*.sh였고, .sh 두 개에만 주인 x가 붙고 readme.md는 그대로였습니다. 요청부터 받은 명령을 실행해 확인하기까지 단계 전체가 7.8초 걸렸어요. 한 번 받아 본 답이라 매번 같은 명령이 나온다고 단정할 수는 없습니다. 또 위 실험은 cat cmd.txt 바로 뒤에 sh cmd.txt를 이어 붙여, 받은 명령을 사람이 검토하지 않고 그대로 실행한 기록입니다. 직접 따라 할 때는 명령을 받아 출력하는 단계와 실행하는 단계를 나누는 편이 좋습니다.

claude --model opus -p "맥 터미널에서 tools 폴더 안의 .sh 파일에만 주인 실행 권한을 주는 명령 한 줄만 출력해. 설명이나 코드 블록 표시는 붙이지 마." > cmd.txt && cat cmd.txt

출력된 명령이 어느 경로를 건드리는지, 누구에게 어떤 권한을 더하거나 빼는지 확인한 다음에만 실행하는 편이 좋습니다. 파일에 저장하거나 화면에 출력했다고 해서 명령이 안전해지지는 않습니다.

sh cmd.txt && ls -l tools

측정 조건과 한계

  • 환경: macOS(darwin arm64) 터미널의 zsh, 새 연습 폴더에서 단계마다 한 번씩 실행
  • 맥의 chmod는 BSD 계열입니다. GNU coreutils 설명서도 같은 숫자·기호 표기를 설명하지만, 이번에 리눅스에서 직접 돌려 보지는 않았습니다.
  • 대부분 단계는 0.0초로 기록돼 시간 차이를 비교할 의미는 없습니다.
  • Claude Code 2.1.309 단계는 이미 로그인된 상태에서 한 번만 요청했습니다.
  • 맥 ls의 @ 표시, 리눅스 stat 형식, X 옵션은 확인하지 않았습니다.

참고 자료