chmod zmienia prawa dostępu, a chown właściciela lub grupę pliku. Zanim użyjesz któregokolwiek, ustal, jako kto działa proces i co dokładnie próbował zrobić. Potem zmień tylko to jedno, czego brakuje, i ponów odrzuconą operację. chmod 777 nie jest naprawą - jest rezygnacją z kontroli dostępu.
Ta strona prowadzi cię od trzech odczytów, przez wybór właściwego polecenia, do zmiany jednego bitu i testu. Po drodze rozkłada na części chmod 777 - żebyś wiedział, co naprawdę robi, zanim ktoś ci go poleci w komentarzu na forum.
Przenosisz aplikację klienta na nowy serwer. Rozpakowujesz pliki jako root, konfigurujesz serwis, strona wstaje. Wieczorem klient dzwoni, bo nie może dodać zdjęcia produktu - w logu
Permission denied. Kusi, żeby wpisaćchmod -R 777na całym katalogu i wrócić do kolacji. Dokładnie w tym miejscu zaczyna się ta procedura - i dlatego nie zaczyna się odchmod.
Od czego zacząć, zanim cokolwiek zmienisz?
Odmowa dostępu ma trzy niewiadome: kto próbował, czego potrzebował i przez jaką ścieżkę szedł. Trzy odczyty rozwiązują wszystkie trzy, a żaden z nich niczego nie zmienia, więc wykonasz je bez ryzyka.
Wykonuj je na tym hoście i w tej przestrzeni użytkowników, w której działa proces korzystający z pliku. Przy kontenerze to istotne - odczyt wewnątrz kontenera i na hoście nie jest zamienny, więc wybierz stronę, po której proces faktycznie działa.
Najpierw tożsamość:
id UZYTKOWNIK_PROCESU
W miejsce UZYTKOWNIK_PROCESU wpisz nazwę z konfiguracji badanego procesu, nie tę, która wydaje się oczywista. id wypisze użytkownika i wszystkie jego grupy - za chwilę porównasz je z grupą pliku.
Potem badany obiekt:
stat --format='%A %a %U %G %n' /sciezka/do/obiektu
Ścieżkę podaj dokładnie tę, na której operacja została odrzucona. Dostaniesz prawa w dwóch zapisach (%A czytelnym, %a ósemkowym) oraz nazwy właściciela i grupy (%U, %G). To odczyt jednego obiektu - o reszcie ścieżki nie mówi nic.
Na koniec cała droga do niego:
namei -l /sciezka/do/obiektu
namei -l wypisze każdy element ścieżki razem z jego trybem i właścicielem. Ten odczyt łapie pułapkę niewidoczną w stat: plik ma poprawne bity, ale któryś katalog wyżej nie daje prawa przejścia.
Zanim ruszysz dalej, zapisz jedno zdanie - jakie działanie było potrzebne (odczyt, zapis, wykonanie pliku czy przejście przez katalog) i której klasie użytkowników ono przysługuje. To zdanie jest całą diagnozą. Reszta to dobór narzędzia.
chmod czy chown - jak wybrać właściwe polecenie?
Każde z nich naprawia inną niezgodność. chmod zmienia prawa dostępu wskazanych plików i katalogów, chown ich właściciela, grupę albo oba pola.
Decyzję podejmujesz na podstawie odczytu, nie intuicji:
- Właściciel i grupa się zgadzają, ale właściwej klasie brakuje jednego prawa - wybierasz
chmod. statpokazuje innego właściciela lub grupę, niż wynika ze sposobu uruchomienia aplikacji - wybieraszchown.- Nie zgadza się jedno i drugie - zmieniasz osobno, każdą zmianę z osobnym uzasadnieniem z odczytu i osobnym testem.
Jest jeszcze warunek, o którym łatwo zapomnieć: tryb pliku może zmienić jego właściciel albo proces z odpowiednim uprawnieniem systemowym. Sam zamiar naprawy nie daje prawa do chmod - jeżeli polecenie odmawia, wróć do pytania, jako kto je wykonujesz.
Jak czytać prawa r, w i x?
Tryb pliku dzieli prawa na trzy klasy: właściciela (u), grupę (g) i pozostałych (o); litera a obejmuje wszystkie naraz. W każdej klasie są trzy prawa - r to odczyt, w to zapis, a x to wykonanie lub przeszukiwanie.
To "lub" przy x robi różnicę. Dla pliku x oznacza prawo uruchomienia. Dla katalogu oznacza prawo przeszukiwania, bez którego nie dostaniesz się do wpisów w środku. Dodanie x plikowi nie otwiera drogi przez katalogi na jego ścieżce - to dwa różne zamki.
Operator + dodaje prawo wybranej klasie, - je odbiera. Dzięki temu tryb symboliczny zmienia jeden bit i nie dotyka pozostałych - nie musisz przeliczać całego trybu na liczby, żeby poprawić jedną literę.
Jak zmienić jedno prawo bez ruszania pozostałych?
Każdy wzorzec poniżej zakłada, że masz już odczyty i wiesz, czego brakuje. Wykonuj go w tym samym miejscu, w którym robiłeś odczyty.
Właściciel ma wykonywać plik, a w klasie u nie ma x:
chmod u+x /sciezka/do/pliku
Po zmianie ponów stat - wynik ma się różnić dokładnie jednym prawem. Potem uruchom plik jako jego właściciel, bo to ta operacja była celem.
Inni użytkownicy mają zbędne prawo zapisu:
chmod o-w /sciezka/do/obiektu
Tu odbierasz, nie dodajesz. Sprawdź po zmianie dwie rzeczy - że zapis dla klasy o zniknął i że operacje, które mają działać, nadal działają.
Grupa potrzebuje odczytu, użytkownik procesu do niej należy, a stat pokazał brak r w klasie grupy:
chmod g+r /sciezka/do/obiektu
Żaden z tych wzorców nie jest przepisem dla nieznanej aplikacji. Warunkiem użycia jest zgodność trzech rzeczy - odczytu, podmiotu i wymaganego działania. Jeżeli którejś brakuje, wróć do sekcji z odczytami.
Co oznacza chmod 777 i dlaczego nie jest naprawą?
W zapisie ósemkowym odczyt ma wartość 4, zapis 2, a wykonanie lub przeszukiwanie 1. Cyfra 7 to suma całej trójki. Trzy cyfry trybu dotyczą kolejno właściciela, grupy i pozostałych użytkowników.
chmod 777 nadaje więc komplet podstawowych praw każdej klasie - także procesom i kontom, które z tym plikiem nie mają nic wspólnego. Komunikat znika z ekranu, bo znika sama kontrola dostępu, a razem z nią odpowiedź na pytanie, co było nie tak. Zostaje za to otwarta furtka - prawo zapisu dla wszystkich oznacza, że dowolny proces w systemie może podmienić plik, który twój serwis potem wykona.
Nie zastępuj 777 innym "uniwersalnym" kodem z poradnika. Prawidłowy tryb wynika z rodzaju obiektu, operacji procesu i modelu właścicielstwa - z niczego więcej.
Jak zmienić właściciela lub grupę poleceniem chown?
Zanim wykonasz zmianę, zapisz oczekiwaną parę - kto ma być właścicielem i jaka grupa wynika ze sposobu uruchomienia aplikacji. Dopiero potem, na hoście badanego obiektu:
chown UZYTKOWNIK:GRUPA /sciezka/do/obiektu
Polecenie ustawia oba pola naraz i nie dotyka bitów trybu. Gdy odczyt uzasadnia zmianę tylko właściciela, pomiń część po dwukropku:
chown UZYTKOWNIK /sciezka/do/obiektu
Gdy zmiany wymaga tylko grupa, zostaw puste pole przed dwukropkiem:
chown :GRUPA /sciezka/do/obiektu
Po każdej z tych zmian ponów stat i porównaj z oczekiwaniem - różnica ma obejmować dokładnie to pole, które zmieniałeś. Na koniec ponów operację aplikacji jako użytkownik z pierwszego odczytu, bo to jej powodzenie jest miarą naprawy.
Kiedy wolno użyć rekurencji -R?
Opcja -R (--recursive) zmienia całe wskazane drzewo katalogów, nie jeden obiekt. To nie jest wygodniejszy wariant domyślny - to decyzja o większym zasięgu, trudniejsza do cofnięcia.
Przed jej użyciem odpowiedz na trzy pytania:
- Czy ścieżka docelowa jest rozwiązana do konkretnego katalogu - bez zmiennych i placeholderów, które mogą okazać się puste?
- Czy w drzewie są obiekty o różnych rolach? Plikom i katalogom bit
xmówi co innego, więc jeden wspólny tryb dla wszystkiego jest błędem z definicji. - Czy w drzewie są dowiązania symboliczne? GNU
chmoddla dowiązania podanego wprost w poleceniu działa na wskazywany plik, a przy przejściu rekurencyjnym napotkane dowiązania pomija; udokumentowane opcje dereferencji zmieniają to zachowanie.
Nie uruchamiaj rekurencji na / ani na katalogu systemowym. Opcja --preserve-root odrzuci próbę na samym /, ale nie wybierze za ciebie właściwego zakresu niżej.
Tabela decyzji od odczytu do testu
| Co pokazał odczyt | Czego brakuje | Polecenie | Minimalna zmiana | Test po zmianie |
|---|---|---|---|---|
| Właściwa klasa nie ma potrzebnego prawa na pliku | jedno z r, w, x |
chmod |
dodaj jeden bit właściwej klasie trybem symbolicznym | stat i ponowienie operacji jako użytkownik procesu |
| Katalog po drodze nie daje prawa przejścia | x na katalogu nadrzędnym |
chmod |
dodaj x właściwej klasie tylko na tym katalogu |
namei -l i ponowny dostęp do tego samego wpisu |
stat pokazuje innego właściciela, niż wymaga aplikacja |
zgodny właściciel obiektu | chown |
zmień tylko właściciela | stat i operacja właściwego procesu |
| Użytkownik procesu jest w dobrej grupie, obiekt ma inną | zgodna grupa obiektu | chown |
zmień tylko grupę | stat, id i ponowienie operacji |
| Prawa są szersze, niż potrzebuje proces | odebranie zbędnego bitu | chmod |
odbierz konkretny bit zbędnej klasie | test operacji dozwolonej i kontrola, że odebrana faktycznie odmawia |
| Tożsamość, właściciel, grupa i bity się zgadzają, odmowa zostaje | przyczyna leży poza podstawowymi bitami | żadne | nie zmieniaj kolejnych praw | zachowaj wyniki id, stat, namei i przejdź do diagnozy odmowy dostępu |
Jak sprawdzić, że zmiana rozwiązała właściwy problem?
Test ma dwa kroki i żadnego skrótu. Ponów odczyt - stat dla obiektu albo namei -l, jeżeli zmieniałeś element ścieżki - i porównaj z planowaną różnicą. Potem powtórz dokładnie tę operację, która została odrzucona, jako ten użytkownik lub proces, któremu odmówiono.
Powodzenie jednej operacji dowodzi dostępu do tej jednej operacji - nie do wszystkich działań aplikacji i nie do całego drzewa. Jeżeli pliki są odtwarzane przy każdym wdrożeniu, przenieś ustalone właścicielstwo i prawa do jego automatyzacji. Ręczna poprawka, której nikt nie zapisał, wraca jako ten sam problem po kolejnym wdrożeniu.
Pozostałe polecenia z tej serii znajdziesz w przeglądzie zarządzania plikami i dostępem z terminala.
Pytania o chmod i chown
Co to jest chmod?
chmod to polecenie zmieniające prawa dostępu do wskazanych plików i katalogów - odczyt, zapis oraz wykonanie lub przeszukiwanie. Nie zmienia właściciela ani grupy, od tego jest chown. Zanim go użyjesz, odczytaj stan przez stat i namei, a potem dodaj lub odbierz wyłącznie to jedno prawo, którego wymaga operacja.
Jak użyć chmod bez nadpisania pozostałych praw?
Użyj trybu symbolicznego. Wskaż klasę (u, g albo o), operator + lub - i jedno prawo - r, w albo x. Takie polecenie dotyka jednego bitu i zostawia resztę trybu bez zmian. Zapisz wynik stat przed zmianą, wykonaj ją, ponów stat i porównaj - różnica ma obejmować dokładnie to jedno prawo.
Co oznacza chmod 777?
Każda cyfra 7 to suma odczytu (4), zapisu (2) i wykonania lub przeszukiwania (1). Trzy cyfry dotyczą kolejno właściciela, grupy i pozostałych użytkowników, więc chmod 777 daje pełne podstawowe prawa każdej klasie - także tym, którzy nie mają przy tym pliku nic do roboty. Dlatego nie jest ani naprawą odmowy dostępu, ani bezpiecznym testem.
Czym różnią się chmod i chown?
chmod zmienia prawa dostępu, chown właściciela, grupę albo oba pola naraz. Które wybrać, rozstrzyga odczyt stat - właściwa klasa bez potrzebnego prawa wskazuje na chmod, a niezgodny właściciel lub grupa na chown. Nie wykonuj obu zmian jednym ruchem, bo każda potrzebuje osobnego dowodu z odczytu i osobnego testu.
Dlaczego po zmianie chmod nadal jest Permission denied?
Sprawdź namei -l, bo dostęp może blokować katalog po drodze, oraz id, żeby potwierdzić, jako kto działa proces. Jeżeli właściciel, grupa i podstawowe bity się zgadzają, nie poszerzaj praw - przyczyna leży w innej warstwie. Dalszą drogę opisuje diagnoza odmowy dostępu do pliku lub procesu.
Ta strona kończy się na właścicielu, grupie i podstawowych bitach trybu. Listy ACL oraz polityki SELinux i AppArmor to osobne mechanizmy - opisujemy je osobno.
Tekst opiera się na dokumentacji GNU Coreutils 9.11 dla poleceń chmod, chown, stat i id oraz trybów numerycznych, na Linux man-pages (chmod(2)) i na stronie man namei(1) z util-linux.