우분투 · 리눅스 입문 — 9편

리눅스 권한과 chmod — permission denied 끝내기

"permission denied" — 리눅스 쓰다 보면 꼭 만나는 그 메시지. 사실 무서운 게 아니라, 그냥 "이 파일은 네 거 아니야"라는 안내예요.

2026년 5월 12일 · 약 8분 · 26편 입문 시리즈 9편

터미널에 ls -l 출력과 chmod 명령이 보이는 화면 — 리눅스 권한과 chmod를 상징하는 일러스트

리눅스를 좀 쓰다 보면 반드시 만납니다 — Permission denied. 스크립트를 실행하려는데, 파일을 고치려는데, 폴더에 들어가려는데 "권한 없음"이라고 거부당하는 그 순간. 처음엔 당황스럽지만, 사실 이건 리눅스가 "여러 사람이 같이 쓰는 컴퓨터"로 설계됐기 때문에 생기는, 아주 합리적인 장치예요.

이 글은 그 권한 시스템을 한 번에 정리합니다 — ls -l이 보여주는 drwxr-xr-x 같은 암호 해독, "누가 무엇을 할 수 있나"의 규칙, 그걸 바꾸는 chmod(기호 방식·숫자 방식), 소유자를 바꾸는 chown, 그리고 "permission denied" 떴을 때 체크 순서까지. 26편 입문 시리즈 9편이고, 끝나면 그 메시지가 더는 무섭지 않을 거예요.

준비물 — 우분투 + 터미널. 6편에서 만든 ~/linux-practice에서 실습합니다. 시스템 파일(/etc 등)의 권한은 구경만 하고, 바꾸는 실습은 연습 폴더 안에서만 하세요.

ls -l 한 줄 해독 — drwxr-xr-x가 뭔가

먼저 권한이 어떻게 표시되는지 봅니다. 연습 폴더에서:

$ cd ~/linux-practice $ touch report.txt $ mkdir mydir $ ls -l -rw-r--r-- 1 jspark jspark 0 May 12 21:50 report.txt drwxr-xr-x 2 jspark jspark 4096 May 12 21:50 mydir

맨 앞 그 10글자가 권한입니다. -rw-r--r--를 쪼개보면:

  • 1번째 글자 = 종류. -면 일반 파일, d면 디렉토리(폴더), l이면 링크. 그래서 폴더는 drwxr-xr-x처럼 d로 시작해요.
  • 나머지 9글자 = 3글자씩 3묶음. [소유자][그룹][기타] 순서. 각 묶음은 항상 r(읽기)·w(쓰기)·x(실행) 자리이고, 권한이 없으면 -.

그러니까 -rw-r--r--는 "일반 파일 / 소유자는 읽고+쓰기(rw-) / 그룹은 읽기만(r--) / 기타도 읽기만(r--)". drwxr-xr-x는 "폴더 / 소유자 rwx / 그룹 r-x / 기타 r-x". 그 뒤의 jspark jspark소유자 이름과 그룹 이름입니다(보통 사용자명과 같은 이름의 그룹이 자동 생김).

한 줄 요약: ls -l의 맨 앞 10글자 = [종류][소유자 rwx][그룹 rwx][기타 rwx]. r=읽기, w=쓰기, x=실행, -=없음. 이것만 읽을 줄 알면 절반 끝.

r·w·x가 파일과 폴더에서 각각 뭘 뜻하나

헷갈리는 지점 하나 — r·w·x파일일 때와 폴더일 때 의미가 살짝 다릅니다:

권한파일에서 / 폴더에서
r (읽기)파일: 내용을 볼 수 있음(cat·less). 폴더: 그 안에 뭐가 있는지 목록을 볼 수 있음(ls).
w (쓰기)파일: 내용을 고칠 수 있음(편집·저장). 폴더: 그 안에 파일을 만들거나 지우거나 이름 바꿀 수 있음.
x (실행)파일: 프로그램·스크립트로 실행할 수 있음. 폴더: 그 폴더 안으로 들어갈 수 있음(cd). — 폴더는 x 없으면 못 들어감!

그래서 폴더는 보통 rx가 세트로 다닙니다(r-x = 들어가서 목록 보기). 스크립트 파일은 x가 있어야 ./내스크립트.sh로 실행되고요 — 이게 "스크립트 만들었는데 실행이 안 돼요"의 99% 원인입니다(셸 스크립트는 시리즈 21편).

chmod — 권한 바꾸기 (기호 방식 · 숫자 방식)

chmod(change mode)가 권한을 바꾸는 명령입니다. 두 가지 표기법이 있어요 — 둘 다 결과는 같으니 편한 걸 쓰면 됩니다.

① 기호 방식 — "누구에게 무엇을 더하거나 빼라"

$ chmod u+x script.sh ← u(소유자)에게 x(실행) 권한 추가. 스크립트 실행되게 만드는 가장 흔한 명령 $ chmod g-w report.txt ← g(그룹)에서 w(쓰기) 권한 제거 $ chmod o-r secret.txt ← o(기타)에서 r(읽기) 제거 — "남들은 못 보게" $ chmod a+r public.txt ← a(모두: u+g+o)에게 r 추가

패턴: chmod [대상][+ 또는 -][권한] 파일. 대상은 u(소유자)·g(그룹)·o(기타)·a(전부), 권한은 r·w·x. +는 추가, -는 제거. 직관적이죠.

② 숫자 방식 — 한 번에 통째로 지정

이건 처음엔 암호 같지만 알고 나면 빠릅니다. r=4, w=2, x=1로 보고, 한 묶음의 권한을 더해서 한 자리 숫자로 만들어요. 그걸 [소유자][그룹][기타] 세 자리로 씁니다:

숫자의미 (r=4 w=2 x=1)
74+2+1 = rwx (다 됨)
64+2 = rw- (읽기+쓰기)
54+1 = r-x (읽기+실행 — 폴더에 흔함)
44 = r-- (읽기만)
0--- (아무것도 안 됨)
$ chmod 755 myscript.sh ← 소유자 rwx(7) / 그룹 r-x(5) / 기타 r-x(5). 스크립트·실행파일의 표준 $ chmod 644 notes.txt ← 소유자 rw-(6) / 그룹 r--(4) / 기타 r--(4). 일반 문서 파일의 표준 $ chmod 600 ~/.ssh/id_ed25519 ← 소유자만 rw-(6), 나머지 0. 비밀키처럼 "나만 봐야 하는" 파일 (18편 SSH에서 또 나옴) $ chmod -R 755 mydir ← -R: 폴더 안의 모든 것에 한꺼번에. 신중히 — 통째로 바뀜

외울 건 사실상 둘 — 755(실행되는 것: 스크립트·폴더)와 644(평범한 파일). 나머지는 필요할 때 위 표 보고 계산하면 됩니다.

chown — 소유자 바꾸기, 그리고 sudo와의 관계

chmod가 "권한"이라면 chown(change owner)은 "주인"을 바꿉니다. 보통 sudo가 필요해요(남의 파일을 내 거로 가져오는 거니까).

$ sudo chown jspark report.txt ← report.txt의 소유자를 jspark로 $ sudo chown jspark:devs project/ ← 소유자 jspark, 그룹 devs로 (콜론 뒤가 그룹). 그룹만이면 chgrp devs project/ $ sudo chown -R jspark:jspark ~/myapp ← -R: 폴더 안 전부. "이 폴더 통째로 내 거로" 할 때 자주 씀

여기서 중요한 연결고리 — 그동안 sudo를 "관리자 권한으로"라고만 알고 썼죠? 이제 그 의미가 명확해집니다: sudo는 "권한 검사를 건너뛰고 관리자(root)로 실행"입니다. 그래서 permission denied가 떴을 때 sudo를 붙이면 되는 거예요. 다만 — 함부로 sudo를 남발하지 마세요. "내 파일인데 권한이 꼬였나?"를 먼저 의심하는 게 순서고, sudo는 시스템 파일을 정말 건드려야 할 때만. (sudo를 누가 쓸 수 있는지는 다음 10편 "사용자·그룹"에서.)

실전 — "permission denied" 만났을 때 체크 순서

이 메시지를 만나면 당황 말고 순서대로:

  1. ls -l 그파일 — 권한과 소유자를 본다. 맨 앞 10글자, 그리고 소유자 이름.
  2. 내가 그 소유자인가? 맞으면 → 소유자 권한 자리(2~4번째 글자)를 본다. x가 없어서 실행이 안 되는 거면 chmod u+x 그파일. w가 없어서 못 고치는 거면 chmod u+w.
  3. 폴더에 못 들어가는 거면 → 그 폴더(와 위 폴더들)에 x 권한이 있는지 확인. chmod u+x 폴더.
  4. 내 파일이 아니거나 시스템 파일이면 → 정말 건드려야 하는 게 맞나 다시 생각. 맞으면 sudo를 붙이거나, 소유권 자체가 잘못된 거면 sudo chown으로 바로잡기.
흔한 함정: "안 되니까 sudo chmod -R 777 폴더" — 절대 하지 마세요. 777은 "아무나 읽고 쓰고 실행"이라 보안 구멍이 됩니다. 특히 ~/.ssh나 웹 서버 폴더에 777 주면 동작 자체가 거부되기도 해요(너무 열려 있어서). 권한 문제는 "딱 필요한 만큼만" 주는 게 정답입니다 — 755·644·600 중에서.
오늘의 정리: ls -l 맨 앞 10글자 = [종류][소유 rwx][그룹 rwx][기타 rwx]. r/w/x는 파일과 폴더에서 의미가 다름(폴더는 x=들어가기). chmod u+x(기호) 또는 chmod 755(숫자, r4 w2 x1)로 권한 바꾸기 — 외울 건 755·644·600. sudo chown 이름:그룹 파일로 주인 바꾸기. sudo=권한 검사 건너뛰기(남발 금지). chmod 777 절대 금지.

시리즈 흐름

  1. 1~5편 입문 묶음 ✔   6편 파일 명령어 ✔   7편 텍스트 명령어 ✔   8편 nano ✔
  2. 9편 — 권한과 chmod (이 글) ✔
  3. 10편 — 사용자·그룹 관리 (사용자 추가·그룹·sudo 권한 — 권한의 "누구" 쪽)
  4. 11편 — apt / 12편 — 파이프·리다이렉션 / 13편 — vim / 14편 — 프로세스 관리 …

오늘 할 일: ~/linux-practice에서 touch t.shls -l t.sh(권한 확인) → chmod u+x t.sh → 다시 ls -l(앞 글자가 바뀐 거 확인) → chmod 644 t.sh로 되돌리기. x가 붙고 빠지는 걸 눈으로 보면 머리에 박힙니다. 10편에서 만나요. (권한 표기 전체는 우분투 위키 File Permissions에도 정리돼 있어요.)

우분투·리눅스 입문 시리즈

이제 "permission denied"가 안 무섭습니다. 10편 "리눅스 사용자·그룹 관리"로 이어집니다.

다음 편은 JUNAI 블로그에서 이어 보세요.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 9편 · 본 글은 2026년 5월 12일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH