chmod 권한 계산기

Unix 파일 권한을 8진수(755), 기호(rwxr-xr-x), 체크박스로 상호 변환. setuid, setgid, sticky 비트 지원.

자주 쓰는 모드
클래스읽기쓰기실행
소유자
그룹
그 밖
8진수
기호
8진수 명령
chmod 644 file
기호 명령
chmod u=rw,g=r,o=r file
ls -l 형식
-rw-r--r--

이 도구가 하는 일

Unix 시스템의 모든 파일은 누가 그것을 읽고, 바꾸고, 실행할 수 있는지 정하는 한 벌의 권한을 지닙니다. chmod 명령이 그것을 설정하며, 그 권한을 사뭇 다른 두 표기 — 세 자리 8진수와 글자 나열 — 로 받습니다. 둘은 정확히 같은 것을 기술합니다. 이 도구는 두 표기와 체크박스 그리드를 동기화해 두므로, 가진 어느 것에서든 시작해 필요한 것을 복사할 수 있습니다.

전적으로 브라우저 안에서 돌고 순수한 산술입니다: 서버가 없고, 입력한 것이 어디로도 보내지지 않습니다. 이것은 계산기이자 참고이지 진짜 머신에서 권한을 바꾸는 방법이 아닙니다 — 그러려면 이 도구가 내는 chmod 명령을 복사해 직접 실행합니다.

세 그룹, 세 권한

권한은 세 개씩 세 그룹으로 정리됩니다. 세 그룹은 파일의 소유자, 그것을 소유한 그룹, 그리고 그 밖 모두 — "그 밖" — 입니다. 각 그룹 안에 세 권한이 있습니다: 읽기, 쓰기, 실행입니다.

  • 읽기(r) — 파일 내용을 보거나 디렉터리 항목을 나열합니다.
  • 쓰기(w) — 파일을 바꾸거나 디렉터리에서 항목을 더하고 뺍니다.
  • 실행(x) — 파일을 프로그램으로 실행하거나 디렉터리에 들어가 그 안의 파일에 닿습니다.

실행은 디렉터리와 파일에서 다른 것을 뜻하고, 그것이 사람을 걸립니다: 읽을 수는 있지만 실행할 수 없는 디렉터리는 안에 무엇이 있는지 이름은 보이지만 그중 아무것도 열지 못하게 합니다.

8진수는 어떻게 도는가

각 그룹의 세 권한이 고정값을 더해 8진수 한 자리에 담깁니다: 읽기는 4, 쓰기는 2, 실행은 1입니다. 읽기·쓰기·실행은 4+2+1 = 7, 읽기·실행은 4+1 = 5, 읽기·쓰기는 4+2 = 6입니다. 세 그룹이 세 자리를 냅니다.

755
7 = 4+2+1   # 소유자: 읽기 + 쓰기 + 실행
5 = 4+0+1   # 그룹: 읽기 + 실행
5 = 4+0+1   # 그 밖: 읽기 + 실행

그래서 755는 "소유자는 무엇이든 할 수 있고 그 밖 모두는 읽고 실행할 수 있지만 바꿀 수 없다"로, 프로그램이나 디렉터리의 보통 모드입니다. 644 — 소유자는 읽기·쓰기, 그 밖은 읽기 전용 — 는 보통 파일의 보통 모드입니다. 패턴에 익으면 흔한 모드가 한눈에 읽힙니다.

기호 나열

다른 표기는 ls -l이 표시하는 것입니다: 아홉 글자, 그룹당 셋, 각각 자기 글자 아니면 붙임표입니다. 755는 rwxr-xr-x, 644는 rw-r--r--입니다. 8진수와 정확히 같은 정보를 나르되, 머릿속으로 자릿수를 더하는 대신 각 권한이 보이게 배치되었습니다.

ls -l 줄은 앞에 열 번째 글자를 지닙니다 — 디렉터리의 d, 보통 파일의 붙임표, 심볼릭 링크의 l입니다. 그 앞 글자는 파일의 종류이지 권한이 아니고, chmod는 그것을 바꿀 수 없습니다. 여기에 ls -l 권한 필드 전체를 붙여넣을 수 있고 종류 글자는 그냥 무시됩니다.

특수 비트: setuid, setgid, sticky

아홉 개의 보통 비트 위에 세 개의 특수한 것이 있고, 앞에 붙는 선택적 네 번째 8진수 자리로 쓰입니다 — setuid(4), setgid(2), sticky 비트(1)입니다. 그것들은 자기 열을 갖지 않습니다. 대신 각각이 기호 나열의 실행 자리를 겹쳐 쓰고, 그것이 사람을 헷갈리게 하는 대문자의 근원입니다.

  • 실행 파일의 setuid는 그것을 시작한 사용자가 아니라 파일 소유자로 실행되게 합니다. 이것이 passwd가 직접 쓸 수 없는 시스템 파일을 갱신하는 방법이자 — 버그 있는 setuid 프로그램이 심각한 구멍인 이유입니다.
  • 실행 파일의 setgid는 그것을 파일 그룹으로 실행합니다. 디렉터리에서는 더 유용하고 안전한 일을 합니다: 안에 만들어지는 새 파일이 만든 이의 그룹이 아니라 그 디렉터리의 그룹을 물려받습니다.
  • 디렉터리의 sticky 비트는 모두가 디렉터리에 쓸 수 있어도 파일의 소유자만 그것을 삭제하거나 이름을 바꿀 수 있음을 뜻합니다. 이것이 /tmp를 공유하되 안전하게 지킵니다. 보통 파일에서는 아무것도 하지 않습니다.

기호 나열에서 켜진 특수 비트가 그 실행 자리를 글자로 바꿉니다: setuid는 소유자 자리의 s, setgid는 그룹 자리의 s, sticky는 그 밖 자리의 t입니다. 대소가 실행도 켜졌는지 알려 줍니다 — 소문자면 그렇고, 대문자면 아닙니다.

rwsr-xr-x  4755   # setuid, 소유자 실행함
rwSr-xr-x  4655   # setuid, 소유자 실행 안 함
rwxrwxrwt  1777   # sticky, 그 밖 실행함
rwxrwxrwT  1776   # sticky, 그 밖 실행 안 함

대문자 S나 T는 거의 늘 실수입니다: 실행할 수 없는 파일에 특수 비트가 켜졌다는 뜻이라 그 비트에 작용할 상대가 없습니다.

명령줄에서 8진수냐 기호냐

chmod은 두 형태를 다 받고, 이 도구는 둘 다 씁니다. 8진수 형태는 모든 비트를 한꺼번에 설정합니다: chmod 755 file. 기호 = 형태는 같은 것을 절대적으로 합니다 — chmod u=rwx,g=rx,o=rx file — 각 그룹을 나열해 결과가 파일이 무엇에서 시작했는지에 달리지 않게 합니다.

계산기에는 필요 없지만 만나게 될 세 번째 상대적 형태가 있습니다: chmod +x file은 모두에게 실행을 더하고, chmod g-w file은 그룹 쓰기를 빼고, chmod o= file은 그 밖의 모든 것을 지웁니다. 그 형태는 전체를 설정하는 것이 아니라 현재 모드에 대해 비트를 바꾸는 것으로, 명령줄에서는 편리하지만 표시할 단일 "결과"가 없습니다.

설정하지 않는 편이 나은 모드

권한 도구는 모드가 나쁜 생각일 때도 그렇게 말해야 합니다. 둘이 끊임없이 나옵니다:

  • 777은 모든 사용자에게 읽기, 쓰기, 실행을 줍니다. 무언가가 "안 될" 때의 반사적 수정이고, 거의 늘 작은 문제를 진짜 보안 구멍과 맞바꿉니다. 옳은 모드는 거의 늘 더 좁습니다 — 대개 755나 644입니다.
  • 누구나 쓸 수 있는 파일(마지막 자리에 2 포함)은 머신의 어느 계정이든 그 내용을 다시 쓰게 합니다. 실행되거나, 소싱되거나, 신뢰되는 것에는 무엇이든 그것이 들어오는 길입니다. 대신 그룹에 쓰기를 주거나 소유자에게만 두세요.

이 도구는 이것들을 일어날 때 짚습니다. 대상이 파일인지 디렉터리인지 알 수 없으므로 오류가 아니라 한 번 더 볼 만한 것으로 말합니다 — sticky 비트는 디렉터리에서 옳고 파일에서 무의미하며, 어느 것을 가졌는지는 당신만 압니다.

chmod 755의 뜻

거의 모든 스크립트, 프로그램, 디렉터리가 결국 갖는 모드이고, 그룹 하나씩 읽힙니다. 각 자리는 그 그룹의 세 권한을 더한 값입니다. 읽기는 4, 쓰기는 2, 실행은 1이므로 7은 셋 다이고 5는 쓰기를 뺀 읽기와 실행입니다.

  • 소유자 — 7 = 4+2+1. 읽기·쓰기·실행: 파일을 고치고 실행할 수 있습니다.
  • 그룹 — 5 = 4+0+1. 쓰기 없는 읽기와 실행: 파일 그룹의 구성원은 읽고 실행할 수 있고 바꿀 수 없습니다.
  • 그 밖 — 5 = 4+0+1. 다시 같습니다: 머신의 다른 모든 계정이 읽고 실행할 수 있고 그중 아무도 바꿀 수 없습니다.

풀어 쓰면 rwxr-xr-x이고, 명령은 chmod 755 file, 글자가 편하면 chmod u=rwx,g=rx,o=rx file입니다. 디렉터리에서는 같은 비트가 다르게 읽힙니다. 거기서 실행은 들어가 안의 것에 닿는다는 뜻이니까요: 755는 누구나 목록을 보고 걸어 들어갈 수 있으면서 항목을 더하거나 빼는 것은 소유자만 할 수 있는 디렉터리입니다. 이 도구는 755에 대해 아무 말도 하지 않는데, 그것은 일부러입니다 — 다른 계정이 당신이 쓴 것을 실행할 수 있는 가장 좁은 모드이기 때문입니다. 그룹도 파일을 고쳐야 한다면 그룹 쓰기를 더하는 모드는 775이고 777이 아닙니다.

chmod 644의 뜻과, 당신 파일이 이미 그것인 이유

644는 755에서 실행 비트를 모두 뺀 것입니다: 소유자에게 6 = 4+2, 그다음 그룹에 4 = 4+0+0, 그 밖에 다시 4, 곧 rw-r--r--입니다. 아무도 실행할 수 없고, 그것은 읽히기만 하는 것 — 문서, HTML 페이지, 설정 파일, 다른 프로그램이 컴파일하는 소스 파일 — 에 딱 맞습니다. 반면 디렉터리에서는 제한적인 것이 아니라 망가진 것입니다: 실행이 없으면 아무것도 들어갈 수 없으니 안의 이름은 나열되고 그중 하나도 열리지 않습니다.

이것은 아무도 손대지 않은 새 파일이 보통 갖는 모드이기도 하고, 그 이유가 umask입니다. 파일을 만드는 프로그램은 보통 666을 요청하고 디렉터리를 만드는 프로그램은 777을 요청합니다. 그다음 umask가 파일이 있기도 전에 자기가 가리키는 비트를 지웁니다. 흔한 umask 022 — 그룹과 그 밖에서 쓰기를 거둠 — 에서는 666이 644가 되고 777이 755가 됩니다. 그래서 이 둘이 어디에나 있고, 그래서 이 도구가 내놓는 첫 두 모드입니다. 자기 값을 보려면 셸에서 umask를 입력합니다.

  • umask 022, 흔한 기본값 — 새 파일은 644, 새 디렉터리는 755로 나옵니다.
  • umask 002, 사용자마다 자기 그룹이 있는 곳에서 설정하는 값 — 664와 775여서 그룹 구성원도 고칠 수 있습니다.
  • umask 077, 비공개 설정 — 600과 700이라 소유자 말고는 읽을 수조차 없습니다.

그 여섯 개 모두 여기 준비된 모드이고, 우연이 아닙니다: 사람들이 실제로 설정하는 세 umask를 파일에 한 번, 디렉터리에 한 번 적용한 것입니다. 여섯 값이 아니라 세 짝으로 읽는 것이 모드를 찾아보기를 그만두는 가장 빠른 길입니다.

chmod 711의 뜻: 들어가되 보지는 말라

711은 읽기 없이 실행을 주는 흔한 모드입니다: 소유자에게 7 = 4+2+1, 그다음 1 = 0+0+1이 두 번, 곧 rwx--x--x입니다. 디렉터리의 두 권한을 다시 떼어 놓아야 뜻이 통합니다 — 읽기는 이름을 나열하고 실행은 지나가게 합니다 — 그래서 711인 디렉터리는 원하는 것의 이름을 이미 아는 사람은 누구나 들어갈 수 있고 아무도 목록을 볼 수 없습니다.

  • 디렉터리에서 이것은 정말 쓸모가 있습니다. 711인 홈 디렉터리는 웹 서버나 공유 머신의 다른 계정이 /home/you/public/report.pdf를 열게 해 주는 한편 ls /home/you는 거부됩니다. 소유자에게 숨는 것은 없고, 다만 밖에서 이름을 열거할 수 없습니다.
  • 파일에서 이것은 거의 쓸모가 없습니다. 셸 스크립트를 돌리는 것은 해석기가 파일을 열어 읽는 일이라 읽기 없는 실행은 실패합니다. 커널이 스스로 싣는 컴파일된 바이너리만 여전히 돕니다. 남이 돌릴 스크립트를 뜻했다면 원한 것은 755였습니다.

도구는 711에 대해서도 아무 말을 하지 않습니다. 755보다 넓은 것이 아니라 좁기 때문입니다: 755가 주지 않는 것을 하나도 주지 않습니다. 이웃한 값들이 같은 이유로 나옵니다 — 751은 그 밖에게 거부된 목록 보기를 그룹에 주고, 700은 지나가기마저 거두는데, 그것이 한 계정을 위한 디렉터리가 원하는 것입니다.

777과 1777: 한 비트 차이이고, 같은 조언이 아니다

공유 디렉터리가 끌어당기기 쉬운 두 모드는 한 비트만 다르고, 이 도구는 일부러 둘에 다르게 답합니다. 777은 rwxrwxrwx이고 위험으로 표시되어 돌아옵니다. 1777은 rwxrwxrwt이고 보통 참고로 돌아오며 위 준비된 모드 가운데 하나입니다 — /tmp가 실제로 가진 모드입니다.

  • 777 — 모든 자리가 4+2+1입니다: 소유자, 그룹, 그 밖 모두에게 읽기·쓰기·실행. 무엇을 지킬 것이 남지 않습니다: 어느 계정이나 파일을 다시 쓸 수 있고, 어느 계정이나 그것을 가진 디렉터리의 항목을 지우거나 갈아치울 수 있습니다. 권한 문제에 대한 반사적 처방이고, 거의 늘 작은 문제를 진짜 문제로 바꿉니다.
  • 1777 — 같은 아홉 비트에 sticky 비트를 더한 것으로, 항목을 지우고 이름을 바꾸는 일을 그 항목의 소유자에게만 허용합니다. 그 한 가지 제약이 모두에게 쓰기를 열어 둔 디렉터리를 안전하게 만들고, 그것이 /tmp가 되는 이유입니다: 누구나 거기 파일을 만들 수 있고 아무도 남의 것을 치울 수 없습니다.

이 구별은 그 밖에도 실행이 있는 곳에서만 성립하고, 도구는 그 점에 엄격합니다. 1666은 rw-rw-rwT로, 어느 그룹에도 실행이 없는 곳에 켜진 sticky 비트입니다. 그런 꼴은 쓸 수 있는 디렉터리가 될 수 없으니 sticky 비트는 아무것도 지키지 못하고, 모드는 666과 똑같이 누구나 쓰기 가능으로 가장 무겁게 표시됩니다. 대문자 T가 같은 말을 한 글자로 합니다.

그러니 공유해야 하는 디렉터리가 원하는 것은 1777, 더 낫게는 올바른 그룹과 함께인 775입니다. 그리고 열리지 않는 파일은 거의 늘 777이 필요한 경우가 아니라 소유 관계 문제입니다.

자주 묻는 질문

644와 755의 차이는 무엇인가요?
644는 소유자에게 읽기·쓰기, 그 밖에게 읽기 전용으로 보통 파일의 보통 모드입니다. 755는 세 그룹 모두에 실행을 더하고, 이는 프로그램이 실행되는 데, 디렉터리가 들어가지는 데 필요한 것입니다. 문서와 소스 파일에는 644, 스크립트와 디렉터리에는 755를 쓰세요.
제 모드가 대문자 S나 T를 보인 이유는 무엇인가요?
실행 권한이 없는 그룹에 특수 비트가 켜졌기 때문입니다. 소문자 s나 t는 특수 비트와 실행이 둘 다 켜졌음을, 대문자 S나 T는 특수 비트는 켜졌지만 실행은 꺼졌음을 뜻하고, 대개 모드가 의도와 다름을 뜻합니다 — 예를 들어 4644(rwSr--r--)는 아무도 실행할 수 없는 파일의 setuid입니다.
chmod 777은 실제로 무엇을 하고 왜 권장되지 않나요?
소유자, 그룹, 그 밖 모두에게 읽기, 쓰기, 실행을 줍니다 — 시스템의 모든 계정에 완전한 접근입니다. 모든 보호를 한꺼번에 없애므로 권장되지 않습니다. 누구나 쓸 수 있는 파일은 누구나 변조할 수 있는 파일이고, 누구나 쓸 수 있는 디렉터리는 누구나 파일을 심을 수 있는 것입니다. 777에 손을 뻗는 거의 모든 경우는 755나 644에 올바른 소유권을 더하면 풀립니다.
앞자리가 반드시 있어야 하나요?
아니요. 특수 비트가 하나도 켜지지 않으면 모드는 그냥 세 자리 — 0755가 아니라 755 — 이고, 그것이 이 도구가 보이는 것입니다. 앞의 0은 받아들여지고 같은 것을 뜻합니다. 앞의 4, 2, 1은 각각 setuid, setgid, sticky 비트를 켭니다.
ls -l 줄을 그대로 붙여넣을 수 있나요?
네. -rwxr-xr-x나 drwxr-xr-x 같은 열 글자 권한 필드를 붙여넣으면 이 도구가 앞의 종류 글자를 벗기고 나머지를 읽습니다. 종류(파일, 디렉터리, 링크)는 권한이 아니고 chmod가 바꿀 수 없으므로 무시됩니다.
제가 입력한 것이 서버로 전송되나요?
아니요. 도구 전체가 브라우저 안에서 도는 산술입니다. 아무것도 업로드·기록·저장되지 않고, 그래서 네트워크 연결이 전혀 없어도 동작합니다.
chmod 711은 무엇을 합니까?
소유자에게는 모든 것을 주고 그룹과 그 밖 모두에게는 실행만 줍니다 — rwx--x--x입니다. 디렉터리에서는 이미 아는 경로로 지나갈 수는 있으나 안에 무엇이 있는지 나열할 수 없다는 뜻이고, 공유 머신의 홈 디렉터리가 보통 원하는 것입니다. 파일에서는 쓸모가 없습니다: 셸 스크립트는 돌기 위해 해석기가 읽어야 하므로 읽기 없는 실행은 그냥 실패합니다.
chmod 777과 chmod 1777의 차이는 무엇입니까?
한 비트 — 앞자리 1로 쓰이는 sticky 비트이고, 마지막 글자를 x에서 t로 바꿉니다. 둘 다 모든 계정에 읽기·쓰기·실행을 줍니다. 1777은 그에 더해 항목을 지우고 이름을 바꾸는 일을 그 소유자에게만 허용합니다. 그래서 이 도구는 777을 거의 옳지 않다고 표시하고, 1777은 /tmp 같은 공유 디렉터리의 표준 모드라고 부릅니다.
새 파일이 644, 새 디렉터리가 755로 나오는 까닭은 무엇입니까?
umask 때문입니다. 파일을 만드는 프로그램은 666을 요청하고 디렉터리를 만드는 프로그램은 777을 요청하는데, umask가 파일이 있기도 전에 거기서 비트를 지웁니다. 흔한 값 022는 그룹과 그 밖에서 쓰기를 거두므로 644와 755가 남습니다. 자기 값은 셸에서 umask를 실행해 보면 됩니다: 002는 664와 775를, 077은 600과 700을 줍니다.
rwxr-xr-x은 무슨 뜻입니까?
755를 풀어 쓴 것입니다. 세 글자씩 읽습니다: rwx는 소유자로 읽기·쓰기·실행이 있고, r-x는 그룹으로 읽기와 실행은 있으나 쓰기는 없고, 다시 r-x는 그 밖 모두입니다. 붙임표는 그 권한이 꺼졌다는 뜻입니다. 이 문자열을 여기 "기호" 칸에 붙여넣으면 "8진수" 칸에 755가 나옵니다.

관련 도구