Administrator systemu Linux wylistował zawartość katalogu /home/szkoła w terminalu i uzyskał następujący wynik:
-rwx --x r-x 1 admin admin 25 04-09 15:17 szkola.txt
Następnie wydał polecenie:
chmod ug=rw szkola.txt | ls -l
Jaki będzie efekt jego działania, wyświetlony w oknie terminala?
A. -rwx r-x r-x 1 admin admin 25 04-09 15:17 szkola.txt
B. -rwx --x rw- 1 admin admin 25 04-09 15:17 szkola.txt
C. -rw- rw- rw- 1 admin admin 25 04-09 15:17 szkola.txt
D. -rw- rw- r-x 1 admin admin 25 04-09 15:17 szkola.txt
Pytanie z egzaminu CKE, styczeń 2018 (arkusz E.12-X-18.01).
Wynik -rw- rw- r-x 1 admin admin 25 04-09 15:17 szkola.txt jest poprawny, bo polecenie chmod ug=rw ustawia dokładnie prawa dla użytkownika właściciela oraz grupy na odczyt i zapis. Ważne jest słowo dokładnie: operator = nie dodaje uprawnień, tylko zastępuje dotychczasowy zestaw praw dla wskazanych klas. Na początku plik miał prawa: właściciel rwx, grupa --x, inni r-x. Po wykonaniu chmod ug=rw właściciel traci prawo wykonywania x i dostaje rw-, grupa traci samo x i dostaje rw-, a prawa dla innych użytkowników nie są ruszane, więc zostają r-x. Dlatego końcowy zapis to -rw- rw- r-x. W praktyce przy administracji Linuksem to bardzo istotne, bo pomylenie = z + może zostawić niepotrzebne uprawnienia, np. wykonanie skryptu albo dostęp do danych. Z mojego doświadczenia lepiej po zmianie praw sprawdzać wynik poleceniem ls -l szkola.txt. Jeszcze drobna uwaga: użycie potoku | między chmod i ls -l nie jest dobrą praktyką, bo chmod nie przekazuje tu sensownych danych na standardowe wyjście. Bardziej administracyjnie poprawnie byłoby użyć chmod ug=rw szkola.txt && ls -l szkola.txt. W zadaniu chodzi jednak o sam efekt zmiany uprawnień pliku.
W tym zadaniu najłatwiej pomylić działanie operatora = w chmod z operatorami + oraz -. Polecenie chmod ug=rw nie oznacza: dodaj odczyt i zapis, zostawiając resztę bez zmian. Ono ustawia dla właściciela u i grupy g dokładnie zestaw rw. To powoduje, że wszystkie inne prawa w tych dwóch klasach są usuwane, w tym prawo wykonywania x. Dlatego wynik, w którym właściciel nadal ma rwx, nie pasuje do tego polecenia. Taki efekt byłby bardziej kojarzony z czymś w stylu chmod ug+rw, gdzie dodajemy prawa, ale nie kasujemy istniejących. Równie częsty błąd to założenie, że zmieni się także grupa others, czyli pozostali użytkownicy. W poleceniu występuje tylko ug, więc prawa dla o nie są modyfikowane. Jeśli wcześniej inni mieli r-x, to po komendzie nadal mają r-x, a nie rw-. Odpowiedź z trzema zestawami rw- sugeruje, że ktoś potraktował chmod jak zmianę wszystkich klas naraz, czyli jakby użyto a=rw albo ugo=rw. To nie jest ten przypadek. Trzeba też uważać na potok |. On nie służy do sekwencyjnego uruchamiania komend administracyjnych, tylko do przekazywania wyjścia jednej komendy na wejście drugiej. Tutaj ls -l po prostu pokaże listing, ale fachowo lepiej użyć &&, jeśli chcemy najpierw zmienić prawa, a potem dopiero sprawdzić wynik. Sedno pozostaje takie: u i g zostają ustawione na rw-, a o pozostaje bez zmian jako r-x.