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 777 na całym katalogu i wrócić do kolacji. Dokładnie w tym miejscu zaczyna się ta procedura - i dlatego nie zaczyna się od chmod.

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:

  1. Właściciel i grupa się zgadzają, ale właściwej klasie brakuje jednego prawa - wybierasz chmod.
  2. stat pokazuje innego właściciela lub grupę, niż wynika ze sposobu uruchomienia aplikacji - wybierasz chown.
  3. 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:

  1. Czy ścieżka docelowa jest rozwiązana do konkretnego katalogu - bez zmiennych i placeholderów, które mogą okazać się puste?
  2. Czy w drzewie są obiekty o różnych rolach? Plikom i katalogom bit x mówi co innego, więc jeden wspólny tryb dla wszystkiego jest błędem z definicji.
  3. Czy w drzewie są dowiązania symboliczne? GNU chmod dla 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.