Permission denied w Linuksie: 10 przypadków, w tym /dev/null
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ć.
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.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedOdczyt 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.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedW 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.
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlKatalog 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 sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -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.shbash: line 1: ./deploy.sh: Permission deniedPo dodaniu x właścicielowi poleceniem chmod u+x pierwsza kolumna zmieniła się na [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shJeś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/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: 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.txtAby 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.
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.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayPrzy 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,OPTIONSroot 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/nullstat -c %F /dev/nullregular filePierwsza 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/nullPoniż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/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter 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 -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Zapis ze zwykłego konta | Permission denied | Brak 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
Serwer WWW · 403
Błąd 403 Apache po instalacji APM (403 Forbidden)
Artykuł o przypadku, w którym serwer WWW nie mógł odczytać katalogu web, zostawił Permission denied w error_log i pokazał 403.
Serwer WWW · 503
Błąd 503 po instalacji APM
Artykuł, który na podstawie error.log sprawdza przypadek, gdy Apache nie mógł połączyć się z gniazdem php-fpm i zwracał 503.
ℹ️ 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.