Permission denied w Linuksie: 10 przypadków, w tym /dev/null

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootDebian 12 zwykłe kontoSprawdzono 2026-11-05
Jak znaleźć przyczynę Permission denied

Permission denied to błąd Linuksa, który pojawia się, gdy bieżące konto nie ma uprawnień do użycia danego pliku, katalogu lub polecenia. Wybierz swój przypadek po nazwie polecenia i ścieżce na początku wiersza błędu, sprawdź uprawnienia i właściciela poleceniem ls -l, a potem uruchom ponownie z odpowiednimi uprawnieniami lub z odpowiedniego konta, aby rozwiązać problem.

Poniższe wyniki pochodzą z konta root na serwerze AlmaLinux 9.8 i ze zwykłego konta na serwerze Debian 12; nazwy kont i hostów oraz godziny w wynikach /dev/null to przykładowe wartości.

1️⃣ Jak znaleźć przyczynę Permission denied

Wiersz błędu kończy się w postaci [polecenie: cel: Permission denied], a nazwa polecenia i ścieżka przed nim pokazują, gdzie nastąpiła blokada. Na schemacie poniżej wybierz komunikat błędu podobny do tego na ekranie, a zobaczysz polecenie do sprawdzenia w pierwszej kolejności i miejsce w tym artykule, które warto przeczytać.

🧭 Wybierz swój przypadek po komunikacie błędu
Diagram objaśniający
🧭 Komunikat błędu
Komunikat błęducat: 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
➜
Sprawdź najpierwls -l secret.txtls -ld webls -l deploy.shidsudo sh -cUprawnienia katalogu domowego i plikówgetenforce · findmntls -l /dev/null
➜
Miejsce w tym artykule🔲 Uprawnienia do odczytu i zapisu plików🔲 Uprawnienie do przechodzenia przez katalog🔲 Uprawnienie do wykonywania🔲 Odczyt informacji zarezerwowanych dla roota🔲 Gdy > jest blokowane mimo sudo🔲 Odrzucone logowanie SSH3️⃣ Rzadkie błędy Permission denied🔲 Gdy /dev/null stał się zwykłym plikiem
Jeśli polecenie, które czyta lub zmienia plik, zostaje odrzucone, najpierw sprawdź uprawnienia r i w tego pliku oraz jego właściciela.
Jeśli w błędzie pojawia się nazwa katalogu ze środka ścieżki, sprawdź, czy ten katalog ma uprawnienie x.
Jeśli bezpośrednie uruchomienie skryptu zostaje odrzucone, sprawdź, czy plik ma uprawnienie x.
Jeśli odczyt informacji systemowych ze zwykłego konta jest blokowany, sprawdź bieżące konto i uruchom ponownie jako root.
Jeśli przekierowanie > jest blokowane mimo sudo, uruchom jako root także przekierowanie.
Jeśli przed błędem stoi nazwa konta i adres serwera, logowanie zostało odrzucone na etapie uwierzytelniania.
Jeśli następuje odmowa, choć uprawnienia są w porządku lub polecenie działa jako root, sprawdź SELinux, noexec i bity wykonywania.
Jeśli ten wiersz powtarza się zaraz po zalogowaniu, sprawdź, czy /dev/null nie stał się zwykłym plikiem.

2️⃣ Częste błędy Permission denied

🔲 Uprawnienia do odczytu i zapisu plików

Aby odczytać plik, konto potrzebuje uprawnienia do odczytu (r), a aby go zmienić lub utworzyć nowy, uprawnienia do zapisu (w). Plik secret.txt z uprawnieniami 600 może czytać i zapisywać tylko jego właściciel, 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

Odczyt tego samego pliku z innego konta, daemon, został od razu odrzucony. Tworzenie pliku w katalogu bez uprawnienia do zapisu daje ten sam błąd: na serwerze Debian 12 na zwykłym koncie polecenie touch zostało zablokowane w katalogu lock z uprawnieniami 000.

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

W pierwszej kolumnie ls -l sprawdź po kolei dla właściciela, grupy i pozostałych kont, czy są r i w, a potem dodaj uprawnienia tylko kontu, które ich potrzebuje, poleceniem chmod albo zmień właściciela poleceniem chown.

🔲 Uprawnienie do przechodzenia przez katalog

Nawet jeśli uprawnienia pliku są w porządku, nie dotrzesz do niego, gdy katalog w środku ścieżki nie ma uprawnienia x. W katalogu x oznacza prawo do przejścia przez niego do środka, a r prawo do odczytu listy nazw w nim.

web/ ── drw-r--r-- · r jest · x brak → tu blokada
css/ ── nazwa widoczna, uprawnienia · rozmiar ?
style.css ── nieosiągalny
index.html ── nazwa widoczna, uprawnienia · rozmiar ?
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

Katalog web ma tylko r, więc daemon odczytał nazwy w środku, css i index.html, ale bez x uprawnienia i rozmiary zostały znakami zapytania. Odwrotnie: katalog site, który ma x, ale nie ma r, zablokował listowanie, a plik o znanej już nazwie dało się odczytać.

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>

Gdy ścieżka jest długa, sprawdź poleceniem ls -ld katalog po katalogu od góry, czy mają x, i dodaj zablokowanemu katalogowi tylko to x, którego konto potrzebuje do przejścia.

🔲 Uprawnienie do wykonywania

Aby uruchomić skrypt jako ./nazwa pliku, plik musi mieć uprawnienie x. Uruchomienie deploy.sh z uprawnieniami 644 zostało odrzucone.

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

Po dodaniu x właścicielowi poleceniem chmod u+x pierwsza kolumna zmieniła się na [-rwxr--r--].

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

Jeśli uruchomienie jest odrzucane mimo uprawnienia x, sprawdź, czy system plików, na którym leży plik, jest zamontowany z noexec.

🔲 Odczyt informacji zarezerwowanych dla roota

Zwykłe konto nie może odczytać informacji, które system zostawia rootowi, takich jak procesy uruchomione przez roota czy dane haseł innych kont. Na serwerze Debian 12 otwarcie katalogu fd procesu 1 ze zwykłego konta dało błąd uprawnień.

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

Dane o wygasaniu hasła innego konta zostały zablokowane z tego samego powodu; /etc/shadow, w którym się znajdują, to plik niedostępny do odczytu dla zwykłych użytkowników. Przy takich błędach nie rozszerzaj uprawnień, tylko uruchom polecenie ponownie przez sudo lub jako root.

🔲 Gdy > jest blokowane mimo sudo

sudo uruchamia jako root tylko polecenie zapisane po nim, a otwarcie pliku do przekierowania (>) wykonuje powłoka bieżącego konta, zanim polecenie ruszy. Dlatego po przekierowaniu wyniku sudo echo do pliku, do którego może pisać tylko root, wiersz błędu zaczyna się od nazwy powłoki, w postaci [bash: ścieżka pliku: Permission denied].

sudo echo x > /root/test.txt

Aby także przekierowanie odbyło się jako root, obejmij cały wiersz poleceniem sh -c, tak by sama powłoka działała przez sudo; oficjalny podręcznik sudo też podaje przykład uruchamiania wewnątrz sh -c, aby przekierowanie zadziałało.

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

tee przyjmuje standardowe wejście i zapisuje je bezpośrednio do podanych plików, więc gdy uruchomisz tee przez sudo, plik otwiera tee z uprawnieniami roota. tee dodatkowo jeszcze raz wypisuje na ekran to, co otrzymuje.

echo x | sudo tee /root/test.txt

🔲 Odrzucone logowanie SSH

Jeśli przed Permission denied stoi [konto@adres serwera:], a w nawiasie jest metoda uwierzytelniania, np. publickey, logowanie zostało odrzucone na etapie uwierzytelniania, a sprawdzić trzeba coś innego niż uprawnienia plików. Na serwerze sshd ma ustawienie StrictModes z domyślną wartością yes, więc przed przyjęciem logowania sprawdza uprawnienia i właściciela katalogu domowego oraz plików tego konta. Jeśli choć jedno z nich, katalog domowy, katalog ~/.ssh lub ~/.ssh/authorized_keys, jest zapisywalne dla innego konta, sshd nie używa tego pliku kluczy, więc poleceniem ls -ld sprawdź, czy żadne z trzech nie daje innym kontom uprawnienia w.

⌨️ Symulator Permission denied

Poniższy symulator startuje na koncie root, a dzięki runuser możesz stać się innym kontem, daemon, i samodzielnie zobaczyć wynik, gdy odczyt plików, przejście przez katalogi i uprawnienie do wykonywania są blokowane.

Symulator Permission deniedcoreutils 8.32
[root@server1 work]#
Działa tylko w przeglądarce. Startuje na koncie root; dopisz cat lub ls po runuser -u daemon --, aby zobaczyć wynik wykonany z innego konta, daemon.

3️⃣ Rzadkie błędy Permission denied

Jeśli następuje odmowa, choć uprawnienia są w porządku, zablokowało coś spoza bitów uprawnień, np. polityka SELinux albo montowanie noexec. Jeśli wykonanie jest odrzucane nawet jako root, sprawdź, czy plik nie ma żadnego bitu x.

Na serwerze z włączonym SELinux pojawia się Permission denied, gdy polityka SELinux blokuje działanie, nawet jeśli bity uprawnień są w porządku; wtedy najpierw sprawdź zapisy odmów SELinux. Na serwerach, na których działa demon audit, odmowy trafiają do /var/log/audit/audit.log jako [avc: denied] razem z zablokowaną akcją, nazwą polecenia (comm) i nazwą celu (name).

Sprawdź poleceniem getenforce, czy SELinux jest włączony, i uruchom ausearch jako root, aby zobaczyć dzisiejsze odmowy.

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

Przy demonie rsync błąd [Permission denied (13)] przy odbieraniu też wynikał z tego, że SELinux blokował dostęp do ścieżki modułu.

Na systemie plików zamontowanym z noexec nie da się uruchamiać plików bezpośrednio, więc nawet gdy ls -l pokazuje x, są one odrzucane z [bash: ścieżka skryptu: Permission denied]. Podaj katalog poleceniu findmnt -T, a zobaczysz, gdzie jest zamontowany i z jakimi opcjami; jeśli wśród opcji jest noexec, to ten przypadek.

findmnt -T /tmp -o TARGET,OPTIONS

root omija większość kontroli uprawnień, ale wykonanie jest dozwolone tylko wtedy, gdy co najmniej jedno z trojga, właściciel, grupa lub pozostałe konta, ma x. Dlatego skrypt bez żadnego x jest odrzucany, nawet gdy root uruchamia go przez ./.

Uruchomienie przez ./ z konta root pliku deploy.sh, którego pierwsza kolumna to [-rw-r--r-- 1 root root], dało [bash: line 1: ./deploy.sh: Permission denied].

🔲 Gdy /dev/null stał się zwykłym plikiem

Jeśli zaraz po zalogowaniu przez SSH na zwykłe konto poniższe wiersze pojawiają się jeden po drugim jeszcze przed znakiem zachęty powłoki, najpierw sprawdź, czy /dev/null, urządzenie znakowe, do którego wszystkie konta wyrzucają wyniki, nie stał się zwykłym plikiem należącym do roota. Liczba wierszy zależy od serwera, czyli od liczby skryptów profile czytanych przy logowaniu, a na tym samym serwerze po przełączeniu na roota błąd się nie pojawił.

-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

Pierwsza kolumna to [-rw-r--r--], a w miejscu rozmiaru widniało 55: tekst błędów wyrzucany przez inne polecenia zbierał się w pliku. Jeśli wiersz poleceń sprzątających zawierający poniższą postać zostanie uruchomiony jako root, rm usuwa plik urządzenia, a przekierowanie 2>/dev/null następnego polecenia tworzy pod tą samą nazwą nowy zwykły plik należący do roota.

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

Poniższy wiersz uruchom jako root. Jeśli utworzysz nowe urządzenie pod sąsiednią nazwą, a potem nadpiszesz je poleceniem mv, nie ma chwili, w której nazwy brakuje, więc między usunięciem a utworzeniem nie zostaje luka, w której inne przekierowanie znowu utworzy zwykły plik.

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

[c 1 3] w mknod to numer /dev/null na liście numerów urządzeń jądra. Po naprawie echo x > /dev/null ze zwykłego konta także zakończyło się bez błędu. Ponowne uruchomienie systemu też może to przywrócić, ale powyższy jeden wiersz, który nie zatrzymuje serwera, jest szybszy.

SprawdźPrzed poprawkąPo poprawce
Pierwsza kolumna ls -l-rw-r--r--crw-rw-rw-
Rozmiar w ls -l551, 3
stat -c %Fregular filecharacter special file
Zapis ze zwykłego kontaPermission deniedBrak błędu

Wynik do wyrzucenia kieruj tylko do >/dev/null lub 2>/dev/null i poza naprawą nigdy nie wpisuj /dev/null jako celu rm ani mv.

🔢 FAQ & polecane treści

Próba zapisu na systemie plików zamontowanym tylko do odczytu daje [Read-only file system], czyli inny błąd (EROFS) niż Permission denied. Wtedy przed uprawnieniami sprawdź, z jakimi opcjami ten system plików jest zamontowany.

Otwarcie odczytu, zapisu i wykonywania dla wszystkich kont usuwa ten Permission denied, ale wtedy plik mogą zmieniać także inne konta. Dodanie uprawnień tylko kontu, które ich potrzebuje, albo zmiana właściciela daje węższy zakres.

Samo rozszerzenie uprawnień usuwa Permission denied, ale /dev/null pozostaje zwykłym plikiem, więc wyrzucane wyniki dalej się w nim zbierają. Jako urządzenie jest naprawiony dopiero wtedy, gdy stat znowu pokazuje character special file.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 10   +   1   =