동작하는 코드
예제 1: 파일 권한 읽기
ls -la
출력 예시:
drwxr-xr-x 5 dale staff 160 Jan 15 10:30 Documents
-rw-r--r-- 1 dale staff 1.2K Jan 14 09:00 README.md
-rwxr-xr-x 1 dale staff 245 Jan 13 08:00 script.sh
lrwxr-xr-x 1 dale staff 35 Jan 12 09:00 link -> /path/to/target
첫 번째 컬럼이 권한 정보입니다. 10글자로 구성됩니다:
d rwx r-x r-x
↑ ↑ ↑ ↑
│ │ │ └── others (기타 사용자) 권한
│ │ └────── group (그룹) 권한
│ └────────── user/owner (소유자) 권한
└────────────── 파일 타입 (d=디렉토리, -=파일, l=링크)
예제 2: 권한 문자 이해하기
각 3글자는 rwx로 구성됩니다:
| 문자 | 의미 | 파일 | 디렉토리 |
| ---- | -------------- | -------------- | ---------------- |
| r | read (읽기) | 내용 읽기 | 파일 목록 보기 |
| w | write (쓰기) | 내용 수정 | 파일 생성/삭제 |
| x | execute (실행) | 실행 가능 | cd로 진입 가능 |
| - | 없음 | 해당 권한 없음 | 해당 권한 없음 |
예제 3: 실제 권한 해석
-rw-r--r--
- 파일(
-) - 소유자:
rw-(읽기 O, 쓰기 O, 실행 X) - 그룹:
r--(읽기 O, 쓰기 X, 실행 X) - 기타:
r--(읽기 O, 쓰기 X, 실행 X)
-rwxr-xr-x
- 파일(
-) - 소유자:
rwx(모든 권한) - 그룹:
r-x(읽기 + 실행) - 기타:
r-x(읽기 + 실행)
직접 수정하기
chmod: 권한 변경 (기호 표기)
# 소유자에게 실행 권한 추가
chmod u+x script.sh
# 그룹과 기타 사용자의 쓰기 권한 제거
chmod go-w secret.txt
# 모든 사용자에게 읽기 권한 추가
chmod a+r document.txt
# 여러 권한 동시 설정
chmod u+rwx,go-w config.sh
기호 표기법:
u— user (소유자)g— group (그룹)o— others (기타)a— all (모두)+— 권한 추가-— 권한 제거=— 권한 지정 (나머지는 제거)
chmod: 숫자 표기
각 권한을 숫자로 표현합니다:
| 권한 | 이진수 | 10진수 |
| ----- | ------ | ------ |
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |
자주 쓰는 숫자 조합:
chmod 755 script.sh # rwxr-xr-x (실행 파일)
chmod 644 file.txt # rw-r--r-- (일반 텍스트)
chmod 600 secret.txt # rw------- (비밀 파일)
chmod 700 private/ # rwx------ (비공개 디렉토리)
# 확인
ls -la script.sh
# -rwxr-xr-x 1 dale staff ...
sudo: 관리자 권한으로 실행
# 시스템 파일 편집 (관리자 권한 필요)
sudo nano /etc/hosts
# 시스템 패키지 설치
sudo apt install package-name
# 현재 사용자로 전환하지 않고 관리자 셸 실행
sudo -s
sudo는 명령어 앞에 붙여 관리자(root) 권한으로 실행합니다. 비밀번호를 입력해야 합니다.
sudo를 쓸 때 주의사항:
# 위험: sudo로 rm -rf는 시스템 파일도 삭제
sudo rm -rf /
# 안전하게: sudo 전에 일반 권한으로 먼저 테스트
rm testfile # 일반 권한으로 먼저 확인
sudo rm systemfile # 필요한 경우에만 sudo
"왜?" — 권한 시스템이 중요한 이유
Unix 권한 모델은 멀티유저 환경의 보안 기초입니다.
실무 시나리오:
# 웹 서버가 읽어야 하는 파일 (world-readable)
chmod 644 /var/www/html/index.html
# 개인 SSH 키 (본인만 읽어야 함)
chmod 600 ~/.ssh/id_rsa
# 이 권한이 없으면 SSH가 키 사용을 거부합니다!
# 실행 가능한 스크립트
chmod 755 deploy.sh
# 설정 파일 (API 키 포함, 본인만)
chmod 600 .env
쉘 스크립트를 실행할 때 권한이 필요한 이유:
./script.sh
# zsh: permission denied: ./script.sh
ls -la script.sh
# -rw-r--r-- (실행 권한 없음)
chmod +x script.sh
./script.sh # 이제 실행 가능
흔한 실수
실수 1: 너무 넓은 권한 설정
# 나쁜 습관: 모든 권한 허용
chmod 777 myfile.sh # 누구나 수정 가능
# 좋은 습관: 필요한 최소 권한만
chmod 755 myfile.sh # 소유자만 수정, 나머지는 읽기+실행
실수 2: SSH 키 권한 실수
# SSH 키 권한이 너무 넓으면 SSH가 거부
ls -la ~/.ssh/
# -rw-r--r-- id_rsa (너무 넓음!)
# SSH 경고:
# WARNING: UNPROTECTED PRIVATE KEY FILE!
# 수정
chmod 600 ~/.ssh/id_rsa
실수 3: 디렉토리에 x 권한 빠뜨리기
# 읽기만 있고 실행 없으면 cd 불가
chmod 644 mydir/
cd mydir/
# zsh: permission denied: mydir
# 올바름
chmod 755 mydir/
디렉토리의 x 권한은 "그 디렉토리로 진입할 수 있음"을 의미합니다.
실수 4: sudo 무분별하게 사용
# 불필요한 sudo (자신의 홈 디렉토리)
sudo mkdir ~/projects # 잘못됨, 소유권이 root가 됨
mkdir ~/projects # 올바름
# 필요한 sudo (시스템 디렉토리)
sudo mkdir /opt/myapp # 올바름
심화 학습
chown: 소유자 변경
# 파일 소유자 변경
sudo chown newuser file.txt
# 소유자와 그룹 동시 변경
sudo chown newuser:newgroup file.txt
# 디렉토리 전체 재귀 변경
sudo chown -R newuser:newgroup directory/
chown은 관리자 권한이 필요합니다.
umask: 기본 권한 설정
새 파일/디렉토리를 만들 때 기본 권한을 제어합니다:
# 현재 umask 확인
umask
# 0022
# 새 파일은 644 (666 - 022)
# 새 디렉토리는 755 (777 - 022)
# 더 제한적인 기본값
umask 077 # 파일: 600, 디렉토리: 700
보안이 중요한 서버에서는 umask를 027 이상으로 설정합니다.
특수 권한: setuid, setgid, sticky bit
# setuid: 실행 시 소유자 권한으로 실행
chmod u+s program
ls -la program
# -rwsr-xr-x (s가 setuid)
# sticky bit: 디렉토리에서 자신의 파일만 삭제 가능
chmod +t /tmp
ls -la /
# drwxrwxrwt (t가 sticky bit)
/tmp에 sticky bit가 있는 이유: 모든 사용자가 쓸 수 있지만 자신이 만든 파일만 삭제 가능합니다.
- 파일을 하나 만들고
ls -la로 기본 권한을 확인하세요. chmod 755 파일명으로 권한을 변경하고 다시 확인하세요.chmod u-w 파일명으로 소유자의 쓰기 권한을 제거하고, 해당 파일을 수정하려 하면 어떻게 되는지 확인하세요.chmod a+x 파일명과chmod 755 파일명이 같은 결과를 내는지 비교해보세요.~/.ssh/디렉토리가 있다면ls -la ~/.ssh/로 SSH 키의 권한을 확인하세요.
Q1. -rw-r--r-- 권한에서 그룹 사용자가 할 수 있는 것은?
- A) 읽기, 쓰기, 실행
- B) 읽기, 쓰기
- C) 읽기만
- D) 아무것도 할 수 없음