bash: ./deploy.sh: Permission denied. 권한 에러는 chmod 777로 때려서 넘기지 말고, 세 가지(권한 비트·소유자·실행비트) 중 무엇이 막았는지를 좁혀야 합니다. 대충 풀면 보안 구멍만 남습니다.
1단계 — 누가, 무엇을 가졌나
로컬 터미널
ls -l deploy.sh
id # 내 uid·gid·소속 그룹
OUTPUT
-rw-r--r-- 1 root root 412 Aug 10 09:00 deploy.sh
ls -l 의 맨 앞 10자리를 읽습니다: -(파일) + rw-(소유자) + r--(그룹) + r--(기타). 위 예시는 누구에게도 x(실행)가 없음 → 실행 자체가 불가. 소유자도 root 인데 내가 root가 아니면 그룹/기타 권한만 적용됩니다.
2단계 — 원인별로 가른다
| 증상 | 원인 | 해결 |
|---|---|---|
Permission denied 실행 시 | x 비트 없음 | chmod +x deploy.sh |
| 읽기/쓰기 거부 | 내 uid·gid가 rwx 대상 아님 | 소유자/그룹 조정 또는 적정 권한 |
| 파일 권한은 맞는데 거부 | 상위 디렉터리에 x 없음 | 경로상 모든 디렉터리에 x 필요 |
| root 소유 파일 수정 거부 | 소유자 불일치 | sudo 또는 chown |
상위 디렉터리 x 비트 함정이 가장 안 보입니다. 파일이 rwxr-xr-x 라도 그 디렉터리에 들어갈(x) 권한이 없으면 접근 자체가 막힙니다.
로컬 터미널
namei -l /opt/myapp/deploy.sh # 경로 전체의 권한을 한 줄씩
3단계 — 최소 권한으로 고친다
로컬 터미널
chmod +x deploy.sh # 실행만 필요하면 x만 추가
sudo chown app:app deploy.sh # 소유자를 실제 사용자로
chmod 750 deploy.sh # 소유자 rwx, 그룹 rx, 기타 차단
777은 거의 항상 틀린 답입니다. "누가 무엇을 해야 하는가"에 맞춰 최소로 줍니다.
순서 요약
로컬 터미널
ls -l <파일> # 권한·소유자
id # 내 신원
namei -l <경로> # 상위 디렉터리 x까지
chmod / chown # 최소 권한으로 교정
권한 비트·소유자·setuid·디렉터리 x의 동작을 직접 실험하며 익히는 실습은 리눅스 트랙에서 회원가입 없이 무료로 할 수 있습니다.