chmodzmienia uprawnienia pliku lub katalogu: odczyt (r= 4), zapis (w= 2) i wykonanie (x= 1), osobno dla właściciela, grupy i pozostałych użytkowników. Zapis755oznaczarwxr-xr-x, a644oznaczarw-r--r--, i to typowe wartości dla katalogów i zwykłych plików. Unikajchmod 777ichmod -R 755: pierwsze daje dostęp wszystkim, a drugie nadaje prawo wykonywania zwykłym plikom.
Błąd „Permission denied” to jedno z pierwszych, co widzi osoba uruchamiająca własny kod na serwerze, a najczęstszą odpowiedzią z internetu jest chmod 777. Zwykle działa i prawie zawsze jest błędem. Poniżej uczysz się czytać uprawnienia, liczyć ich wartości i ustawiać je tak, żeby aplikacja działała i nie była otwarta dla wszystkich. Ogólne podstawy pracy w konsoli znajdziesz w tekście o terminalu i wierszu poleceń. Polecenia z artykułu uruchomiono na macOS (systemy uniksowe zachowują się tu tak samo, ale na Linuksie warto sprawdzić wynik przez ls -l).
Co oznacza chmod i do czego służy?
chmod (change mode) zmienia uprawnienia pliku lub katalogu. System decyduje o dostępie do pliku na podstawie trzech pytań: kim jest użytkownik (właścicielem, członkiem grupy czy kimś obcym), czego chce (czytać, zapisywać, wykonywać) i jakie prawa ma plik. chmod zmienia tylko tę trzecią rzecz. Kto jest właścicielem, zmienia osobne polecenie chown.
Jak czytać uprawnienia w wyniku ls -l?
Polecenie ls -l pokazuje uprawnienia w pierwszej kolumnie:
-rwxr-xr-x 1 mateusz staff 2 Nov 8 21:03 skrypt.sh
Pierwsze dziesięć znaków dzieli się na cztery części:
| Znaki | Znaczenie | Przykład |
|---|---|---|
| 1 | typ: - plik, d katalog, l link | - |
| 2–4 | prawa właściciela (user) | rwx |
| 5–7 | prawa grupy (group) | r-x |
| 8–10 | prawa pozostałych (others) | r-x |
W każdej trójce r oznacza odczyt, w zapis, x wykonanie, a - brak danego prawa. Dalej widać właściciela (mateusz) i grupę (staff).
Jak liczyć wartości chmod, na przykład 755 i 644?
Każde prawo ma wagę: odczyt to 4, zapis to 2, wykonanie to 1. Dla każdej z trzech grup dodajesz wagi, więc trzy cyfry opisują całe uprawnienie:
| Zapis | Rozpisane | Dla właściciela | Dla grupy | Dla pozostałych | Typowe użycie |
|---|---|---|---|---|---|
644 | rw-r--r-- | czyta i zapisuje | czyta | czyta | zwykły plik |
755 | rwxr-xr-x | wszystko | czyta i wchodzi | czyta i wchodzi | katalog, skrypt |
750 | rwxr-x--- | wszystko | czyta i wchodzi | nic | katalog tylko dla właściciela i grupy |
600 | rw------- | czyta i zapisuje | nic | nic | klucze, pliki z hasłami |
777 | rwxrwxrwx | wszystko | wszystko | wszystko | prawie nigdy |
Przykład liczenia: 7 to 4 + 2 + 1 (odczyt, zapis, wykonanie), a 5 to 4 + 1 (odczyt i wykonanie). Dlatego 755 oznacza „właściciel wszystko, reszta czyta i wykonuje”.
Jak ustawić uprawnienia symbolicznie, na przykład u+x lub go-w?
Obok liczb chmod przyjmuje zapis symboliczny: kto (u właściciel, g grupa, o pozostali, a wszyscy), operacja (+ dodaj, - zabierz, = ustaw) i prawo (r, w, x). Jest wygodny, gdy zmieniasz jedno prawo i nie chcesz przeliczać całej liczby. W teście plik zaczął od 644:
chmod u+x skrypt.sh # -rw-r--r-- → -rwxr--r-- (właściciel może wykonać)
chmod go-r skrypt.sh # -rwxr--r-- → -rwx------ (grupa i inni tracą odczyt)
chmod 755 skrypt.sh # -rwx------ → -rwxr-xr-x (ustawienie wszystkiego naraz)
Najczęstsze użycie to chmod +x skrypt.sh, które pozwala uruchomić skrypt poleceniem ./skrypt.sh.
Co oznacza prawo wykonania (x) dla katalogu?
Dla katalogu x nie znaczy „uruchom”, tylko „wejdź i dostań się do plików w środku”, a r oznacza „wylistuj zawartość”. To dwa osobne prawa i da się mieć jedno bez drugiego. W teście katalog z plikiem a.txt zachował się tak:
| Uprawnienia katalogu | ls katalog | cat katalog/a.txt |
|---|---|---|
644 (r bez x) | błąd „Permission denied” | błąd „Permission denied” |
311 (x bez r) | błąd „Permission denied” | działa, jeśli znasz nazwę pliku |
755 | działa | działa |
Wniosek praktyczny: katalog prawie zawsze potrzebuje x. Jeśli ustawisz na katalogu 644 (jak na pliku), przestaniesz mieć dostęp do jego zawartości, nawet gdy same pliki mają dobre prawa.
Dlaczego chmod -R 755 to zły pomysł?
Opcja -R zmienia uprawnienia rekurencyjnie, czyli całe drzewo katalogów. Pokusa jest duża (to jedno z najczęściej wyszukiwanych pytań o chmod), ale chmod -R 755 ustawia to samo dla katalogów i plików. W teście zwykłe pliki tekstowe też dostały prawo wykonywania:
chmod -R 755 tree
ls -l tree
# -rwxr-xr-x 1 mateusz wheel 2 Nov 8 21:03 a.txt ← plik tekstowy z prawem wykonania
Prawo wykonania na pliku danych niczego nie psuje od razu, ale to niepotrzebne i utrudnia wychwycenie plików, które faktycznie są programami. Poprawnie ustawiasz katalogi i pliki osobno, poleceniem find:
find tree -type d -exec chmod 755 {} + # katalogi: 755
find tree -type f -exec chmod 644 {} + # pliki: 644
Krótsza droga to wielkie X w zapisie symbolicznym, które nadaje x katalogom i plikom, które już je mają (w teście zwykłe pliki zostały 644, a katalogi 755):
chmod -R u=rwX,go=rX tree
Kto jest właścicielem pliku i do czego służy chown?
chmod mówi, co wolno, a chown (change owner) mówi, komu należy plik. Właściciela i grupę widzisz w ls -l, a Twoją tożsamość pokazuje polecenie id. Zmiana właściciela wymaga zwykle uprawnień administratora:
sudo chown www-data:www-data uploads
Zapis użytkownik:grupa ustawia obie wartości naraz. Nazwa użytkownika serwera zależy od systemu i konfiguracji (na Debianie i Ubuntu to zwykle www-data, w innych dystrybucjach bywa nginx albo apache).
Skąd się bierze sudo i kiedy go używać?
sudo (superuser do) uruchamia jedno polecenie jako inny użytkownik, najczęściej jako root, czyli konto administratora, które może zmienić uprawnienia i właściciela każdego pliku. To osobny program, a nie część chmod czy chown. Kto może go używać, zapisano w pliku /etc/sudoers, który czyta tylko root. Na macOS prawo do sudo daje członkostwo w grupie admin, a na Debianie i Ubuntu zwykle w grupie sudo.
Wynik ls -l pokazuje, jak to działa technicznie:
-r-s--x--x 1 root wheel 1575952 Aug 13 04:51 /usr/bin/sudo
Litera s w miejscu x właściciela to bit setuid: program uruchamia się z prawami swojego właściciela (root), a nie osoby, która go wywołała. Dzięki temu sudo może podnieść uprawnienia, ale najpierw sprawdza w /etc/sudoers, czy Ci wolno. Hasło, o które prosi, to zwykle Twoje własne, nie hasło roota.
Używaj sudo tylko dla pojedynczego polecenia, które naprawdę tego wymaga, na przykład chown czy zapis w katalogu systemowym. Nie dopisuj go do poleceń w projekcie (npm install, pip install), żeby „zadziałało”: pliki, które wtedy powstaną, należą do root, więc zwykłe konto nie może ich potem zmienić.
Czym jest umask i skąd biorą się domyślne uprawnienia?
Nowo utworzony plik nie dostaje uprawnień znikąd. System startuje od 666 dla plików i 777 dla katalogów, a potem odejmuje wartość umask. W teście:
umask | Nowy plik | Nowy katalog |
|---|---|---|
022 (typowa wartość) | 644 (rw-r--r--) | 755 (rwxr-xr-x) |
077 | 600 (rw-------) | 700 (rwx------) |
Dlatego pliki tworzone przez Twoje programy są zwykle 644, a katalogi 755. Wartość umask wpisujesz w terminalu bez argumentów, żeby ją zobaczyć, i warto to zrobić, gdy pliki powstają z innymi uprawnieniami, niż się spodziewasz.
Dlaczego chmod 777 to zły pomysł i co zrobić zamiast tego?
chmod 777 daje odczyt, zapis i wykonanie każdemu użytkownikowi i każdemu procesowi na serwerze, więc działa niemal zawsze, bo wyłącza całą ochronę. Rozwiązuje objaw („Permission denied”) i tworzy drugi problem: każdy proces może zmienić lub podmienić plik, a na wspólnym serwerze także cudzy kod. Jeśli aplikacja zapisuje do katalogu, jedyne, czego potrzebuje, to prawo zapisu dla jednego użytkownika.
Zamiast 777 zrób trzy rzeczy:
- Sprawdź, na jakim użytkowniku działa aplikacja lub serwer WWW.
- Ustaw tego użytkownika jako właściciela katalogu:
sudo chown użytkownik:grupa katalog. - Nadaj minimalne prawa:
750albo755dla katalogu,640albo644dla plików.
Konkretny przykład z PHP, czyli katalog na wgrane pliki, opisuje upload plików w PHP.
Jak naprawić błąd „Permission denied”?
Zamiast zgadywać, przejdź po kolei:
- Kim jestem? Polecenie
idpokazuje użytkownika i grupy. Dla aplikacji webowej to użytkownik serwera, nie Ty. - Czyj jest plik lub katalog?
ls -ld ścieżkapokazuje właściciela, grupę i uprawnienia (opcja-dpokazuje sam katalog, nie jego zawartość). - Czy mam prawo wejść do każdego katalogu na ścieżce? Brak
xna jednym z katalogów nadrzędnych blokuje dostęp do całej zawartości, nawet gdy sam plik ma dobre prawa. Sprawdźls -lddla kolejnych części ścieżki. - Czy potrzebne jest prawo zapisu? Do tworzenia, usuwania i zmiany nazwy pliku potrzebujesz
wna katalogu, nie tylko na samym pliku. - Dopiero wtedy zmieniaj
chownlubchmod, z możliwie najmniejszym zakresem.
Co zapamiętać o chmod i uprawnieniach?
- Uprawnienia składają się z trzech grup (właściciel, grupa, inni) i trzech praw (odczyt 4, zapis 2, wykonanie 1).
- Typowe wartości:
644dla plików,755dla katalogów,600dla sekretów. - Dla katalogu
xoznacza prawo wejścia i bez niego nie dostaniesz się do plików w środku. chmod -R 755zmienia pliki jak katalogi. Rozdziel je przezfind -type difind -type falbo użyjX.chmod 777to ukrycie problemu. Ustaw właściciela przezchowni nadaj najmniejsze potrzebne prawa.
Jeśli chcesz ćwiczyć pracę na serwerze razem z mentorem, który sprawdza Twój kod i konfigurację, zobacz kurs PHP.


