Permission denied: /dev/null 포함 10가지 사례

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정Debian 12 일반 계정2026-11-05 확인
Permission denied 원인 확인

Permission denied는 리눅스에서 지금 계정에 그 파일이나 폴더, 명령을 쓸 권한이 없을 때 나오는 오류입니다. 오류 줄 앞의 명령 이름과 경로로 어떤 경우인지 고른 뒤 ls -l로 권한과 소유자를 확인하고, 그 경우에 맞는 권한이나 계정으로 다시 실행하면 해결됩니다.

아래 출력은 AlmaLinux 9.8 서버의 root 계정과 Debian 12 서버의 일반 계정에서 실행한 결과이며, 계정과 호스트 이름, /dev/null 출력의 시각은 예시 값입니다.

1️⃣ Permission denied 원인 확인

오류 줄은 [명령: 대상: Permission denied] 꼴로 끝나며, 앞에 붙은 명령 이름과 경로로 어디에서 막혔는지 확인할 수 있습니다. 아래 그림에서 내 화면과 닮은 오류 문구를 고르면 먼저 볼 명령과 이 글에서 읽을 자리가 나옵니다.

🧭 오류 문구로 내 경우 고르기
설명 다이어그램
🧭 오류 문구
오류 문구cat: secret.txt: Permission deniedls: cannot access 'web/index.html': Permission denied./deploy.sh: Permission deniedls: cannot open directory '/proc/1/fd': Permission deniedbash: /root/test.txt: Permission denieduser@server1: Permission denied (publickey)(13)Permission denied-bash: /dev/null: Permission denied
➜
먼저 볼 것ls -l secret.txtls -ld webls -l deploy.shidsudo sh -c홈 폴더와 파일 권한getenforce · findmntls -l /dev/null
➜
이 글의 자리🔲 파일 읽기와 쓰기 권한🔲 폴더 통과 권한🔲 실행 권한🔲 root 몫 읽기🔲 sudo를 붙여도 >가 막힐 때🔲 SSH 접속 거절3️⃣ 드문 Permission denied🔲 /dev/null이 일반 파일로 바뀐 경우
파일을 읽거나 고치는 명령이 거절되면 그 파일의 r, w 권한과 소유자부터 확인합니다.
경로 중간 폴더의 이름이 오류에 나오면 그 폴더에 x 권한이 있는지 확인합니다.
스크립트를 직접 실행할 때 거절되면 그 파일에 x 권한이 있는지 확인합니다.
시스템 정보를 일반 계정으로 읽다 막히면 지금 계정을 확인하고 root로 다시 실행합니다.
sudo를 붙였는데도 > 리다이렉션에서 막히면 리다이렉션까지 root로 실행합니다.
오류 앞에 계정과 서버 주소가 붙으면 접속 인증에서 거절된 경우입니다.
권한 칸이 맞거나 root로 실행했는데도 거절되면 SELinux, noexec, 실행 비트를 확인합니다.
로그인하자마자 이 줄이 이어지면 /dev/null이 일반 파일로 바뀌었는지 확인합니다.

2️⃣ 자주 나오는 Permission denied

🔲 파일 읽기와 쓰기 권한

파일을 읽으려면 그 계정에 읽기(r) 권한이, 고치거나 새로 만들려면 쓰기(w) 권한이 있어야 합니다. 권한을 600으로 둔 secret.txt는 소유자 root만 읽고 쓸 수 있습니다.

ls -l secret.txt
-rw------- 1 root root 16 Oct 29 00:29 secret.txt
runuser -u daemon -- cat secret.txt
cat: secret.txt: Permission denied

다른 계정 daemon으로 같은 파일을 읽자 바로 거절되었습니다. 쓰기 권한이 없는 폴더 안에 파일을 만들 때도 같은 오류가 나며, Debian 12 서버의 일반 계정에서 권한을 000으로 둔 lock 폴더에 touch가 막혔습니다.

touch ~/touchtest/lock/x.txt
touch: cannot touch '/home/user/touchtest/lock/x.txt': Permission denied

ls -l 첫 칸에서 소유자, 그룹, 그 밖의 계정 순으로 r과 w가 있는지 보고, 필요한 계정에만 chmod로 권한을 더하거나 chown으로 소유자를 바꿉니다.

🔲 폴더 통과 권한

파일 권한이 맞아도 경로 중간 폴더에 x 권한이 없으면 그 안의 파일에 닿지 못합니다. 폴더에서 x는 그 폴더를 지나 안으로 들어가는 권한이고, r은 안의 이름 목록을 읽는 권한입니다.

web/ ── drw-r--r-- · r 있음 · x 없음 → 여기서 막힘
css/ ── 이름은 보이고 권한 · 크기는 ?
style.css ── 닿지 못함
index.html ── 이름은 보이고 권한 · 크기는 ?
ls -ld web web/css
drw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/css
runuser -u daemon -- ls -l web
ls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ?            ? css
-????????? ? ? ? ?            ? index.html

web 폴더에 r만 있어 daemon은 안의 이름 css와 index.html까지 읽었지만, x가 없어 권한과 크기는 물음표로 남았습니다. 반대로 x만 있고 r이 없는 site 폴더는 목록이 막혔고, 이름을 알고 있는 파일은 읽혔습니다.

ls -ld site
drwx--x--x 2 root root 24 Oct 29 00:29 site
runuser -u daemon -- ls site
ls: cannot open directory 'site': Permission denied
runuser -u daemon -- cat site/index.html
<h1>index</h1>

경로가 길면 ls -ld로 위 폴더부터 하나씩 x가 있는지 확인하고, 막힌 폴더에 그 계정이 지나갈 x만 더합니다.

🔲 실행 권한

스크립트를 ./파일 이름으로 실행하려면 그 파일에 x 권한이 있어야 합니다. 권한이 644인 deploy.sh는 실행이 거절되었습니다.

ls -l deploy.sh
-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh
./deploy.sh
bash: line 1: ./deploy.sh: Permission denied

chmod u+x로 소유자에게 x를 더하자 첫 칸이 [-rwxr--r--]로 바뀌었습니다.

chmod u+x deploy.sh
ls -l deploy.sh
-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.sh

x 권한이 있는데도 실행이 거절되면 그 파일이 있는 파일 시스템이 noexec로 마운트되어 있는지 확인합니다.

🔲 root 몫 읽기

일반 계정은 root가 띄운 프로세스나 다른 계정의 비밀번호 정보처럼 시스템이 root 몫으로 둔 정보를 읽지 못합니다. Debian 12 서버의 일반 계정에서 1번 프로세스의 fd 폴더를 열자 권한 오류가 났습니다.

ls /proc/1/fd
ls: cannot open directory '/proc/1/fd': Permission denied
chage -l daemon
chage: Permission denied.

다른 계정의 비밀번호 만료 정보도 같은 이유로 막혔으며, 이 정보가 든 /etc/shadow는 일반 사용자가 읽을 수 없게 두는 파일입니다. 이런 오류는 권한을 넓히지 않고 sudo나 root 계정으로 다시 실행합니다.

🔲 sudo를 붙여도 >가 막힐 때

sudo는 그 뒤에 적은 명령만 root로 실행하고, 리다이렉션(>)으로 파일을 여는 일은 명령이 실행되기 전에 지금 계정의 셸이 처리합니다. 그래서 root만 쓸 수 있는 파일로 sudo echo의 출력을 리다이렉션하면, 오류 줄이 셸 이름으로 시작하는 [bash: 파일 경로: Permission denied] 꼴로 나옵니다.

sudo echo x > /root/test.txt

리다이렉션까지 root로 하려면 sh -c로 줄 전체를 감싸 셸까지 sudo로 실행하며, sudo 공식 매뉴얼도 리다이렉션이 되도록 sh -c 안에서 실행하는 예를 들고 있습니다.

sudo sh -c 'echo x > /root/test.txt'

tee는 표준 입력을 받아 적어 준 파일에 직접 쓰므로, tee를 sudo로 실행하면 파일은 root 권한의 tee가 엽니다. tee는 받은 내용을 화면에도 한 번 더 출력합니다.

echo x | sudo tee /root/test.txt

🔲 SSH 접속 거절

Permission denied 앞에 [계정@서버 주소:]가 붙고 괄호 안에 publickey 같은 인증 방식이 있으면 접속 인증 단계에서 거절된 경우이며, 파일 권한과는 확인할 곳이 다릅니다. 서버의 sshd는 StrictModes 설정이 기본값 yes라, 로그인을 받기 전에 그 계정의 홈 폴더와 파일의 권한, 소유자를 검사합니다. 홈 폴더와 ~/.ssh 폴더, ~/.ssh/authorized_keys 가운데 하나라도 다른 계정이 쓸 수 있으면 sshd가 그 키 파일을 사용하지 않으므로, ls -ld로 세 곳에 다른 계정의 w 권한이 없는지 확인합니다.

⌨️ Permission denied 시뮬레이터

아래 시뮬레이터는 root 계정으로 시작하며, runuser로 다른 계정 daemon이 되어 파일 읽기와 폴더 통과, 실행 권한에서 막히는 출력을 직접 확인할 수 있습니다.

Permission denied 시뮬레이터coreutils 8.32
[root@server1 work]#
브라우저 안에서만 동작합니다. root 계정으로 시작하며, runuser -u daemon -- 뒤에 cat이나 ls를 붙이면 다른 계정 daemon으로 실행한 출력이 나옵니다.

3️⃣ 드문 Permission denied

권한 칸이 맞는데도 거절되면 SELinux 정책이나 noexec 마운트처럼 권한 비트 밖에서 막은 경우입니다. root로 실행했는데도 실행이 거절되면 그 파일에 x 비트가 하나도 없는지 확인합니다.

SELinux가 켜진 서버에서는 권한 비트가 맞아도 SELinux 정책이 막으면 Permission denied가 나오므로, 이때는 SELinux의 거절 기록부터 확인합니다. 거절 기록은 audit 데몬이 동작하는 서버에서 /var/log/audit/audit.log에 [avc: denied]로 남으며, 막힌 동작과 명령 이름(comm), 대상 이름(name)이 함께 기록됩니다.

getenforce로 SELinux가 켜져 있는지 보고, root로 ausearch를 실행해 오늘 막힌 기록을 확인합니다.

getenforce
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today

rsync 데몬으로 받을 때 난 [Permission denied (13)]도 SELinux가 모듈 경로 접근을 막은 경우였습니다.

noexec로 마운트된 파일 시스템에서는 파일을 직접 실행할 수 없어, ls -l에 x가 보이는데도 [bash: 스크립트 경로: Permission denied]로 거절됩니다. findmnt -T에 그 폴더를 주면 그 폴더가 마운트된 곳과 옵션이 나오며, 옵션에 noexec가 있으면 이 경우입니다.

findmnt -T /tmp -o TARGET,OPTIONS

root는 대부분의 권한 검사를 넘지만, 실행만은 소유자와 그룹, 그 밖의 계정 가운데 한 곳이라도 x가 있을 때 허용됩니다. 그래서 x가 하나도 없는 스크립트는 root가 ./로 실행해도 거절됩니다.

첫 칸이 [-rw-r--r-- 1 root root]인 deploy.sh를 root 계정에서 ./로 실행하자 [bash: line 1: ./deploy.sh: Permission denied]가 나왔습니다.

🔲 /dev/null이 일반 파일로 바뀐 경우

일반 계정으로 SSH에 들어오자마자 셸 프롬프트보다 먼저 아래 줄이 연달아 찍히면, 모든 계정이 출력을 버리는 문자 장치 /dev/null이 root 소유의 일반 파일로 바뀌지 않았는지 먼저 확인합니다. 줄 수는 로그인할 때 읽는 profile 스크립트 수에 따라 서버마다 다르며, 같은 서버에서 root로 바꾼 뒤에는 이 오류가 나지 않았습니다.

-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...
ls -l /dev/null
-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/null
stat -c %F /dev/null
regular file

첫 칸이 [-rw-r--r--]이고 크기 자리에 55가 찍혀, 다른 명령이 버린 오류 글자가 파일로 쌓여 있었습니다. 정리 명령 줄에 아래 꼴이 섞여 root로 실행되면 rm이 장치 파일을 지우고, 그다음 명령의 2>/dev/null 리다이렉션이 같은 이름으로 root 소유 일반 파일을 새로 만듭니다.

rm -f /dev/null 2>/dev/null

아래 줄은 root로 실행합니다. 새 장치를 옆 이름으로 만든 뒤 mv로 덮어쓰면 이름이 비는 순간이 없어, 지운 다음 만드는 사이에 다른 리다이렉션이 일반 파일을 또 만들 틈을 남기지 않습니다.

mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/null
stat -c %F /dev/null
character special file

mknod의 [c 1 3]은 커널 장치 번호 목록에서 /dev/null의 번호입니다. 복구한 뒤 일반 계정의 echo x > /dev/null도 오류 없이 끝났습니다. 재부팅으로 돌아올 수도 있지만, 서버를 멈추지 않는 위 한 줄이 더 빠릅니다.

확인고치기 전고친 뒤
ls -l 첫 칸-rw-r--r--crw-rw-rw-
ls -l 크기 자리551, 3
stat -c %Fregular filecharacter special file
일반 계정에서 쓰기Permission denied오류 없음

버릴 출력은 >/dev/null이나 2>/dev/null로 넘기기까지만 하고, 복구할 때가 아니면 /dev/null을 rm이나 mv 대상으로 적지 않습니다.

🔢 FAQ & 추천 콘텐츠

읽기 전용으로 마운트된 파일 시스템에 쓰려고 하면 [Read-only file system]이 나오며, Permission denied와는 다른 오류(EROFS)입니다. 이때는 권한보다 그 파일 시스템이 어떤 옵션으로 마운트되어 있는지부터 확인합니다.

모든 계정에 읽기, 쓰기, 실행을 열면 그 자리의 Permission denied는 사라지지만, 다른 계정도 그 파일을 고칠 수 있게 됩니다. 필요한 계정에만 권한을 더하거나 소유자를 바꾸는 쪽이 범위가 좁습니다.

권한만 넓히면 Permission denied는 사라지지만 /dev/null은 일반 파일 그대로라, 버린 출력이 그 파일에 계속 쌓입니다. stat 결과가 character special file로 돌아와야 장치로 복구된 것입니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 10   +   1   =