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.txtNastępnie wydał poleceniechmod ug=rw szkola.txt | ls -lJaki będzie efekt jego działania, wyświetlony w oknie terminala?
A. -rwx --x rw- 1 admin admin 25 04-09 15:17 szkola.txt
B. -rwx r-x r-x 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 szkola.txt zmienia uprawnienia tylko dla właściciela pliku, czyli u, oraz grupy, czyli g. Operator = w chmod oznacza ustaw dokładnie takie prawa, a nie dodaj do istniejących. To ważny szczegół. Początkowo plik miał uprawnienia: właściciel rwx, grupa --x, pozostali r-x. Po wykonaniu ug=rw właściciel traci prawo wykonywania x i zostaje z rw-, a grupa traci samo wykonywanie --x i dostaje dokładnie rw-. Uprawnienia dla pozostałych użytkowników, czyli o, nie są ruszane, więc nadal zostaje r-x. Dlatego końcowy zapis to -rw- rw- r-x. W praktyce taka składnia przydaje się, gdy administrator chce ujednolicić prawa dostępu, np. dać właścicielowi i grupie możliwość czytania oraz edycji pliku konfiguracyjnego, ale bez uruchamiania go jako programu. Moim zdaniem warto zapamiętać różnicę między chmod ug=rw, chmod ug+rw i chmod ug-rw, bo to częsty powód pomyłek na Linuxie. Dobrą praktyką administracyjną jest też sprawdzanie efektu poleceniem ls -l szkola.txt, a przy pracy produkcyjnej ostrożne odbieranie prawa x, szczególnie dla skryptów i katalogów.
Najczęstsza pomyłka w tym zadaniu polega na potraktowaniu chmod ug=rw tak, jakby dopisywało prawa do istniejących uprawnień albo zmieniało wszystkie trzy klasy użytkowników. Tak jednak nie działa operator =. W symbolicznym zapisie chmod znak = ustawia dokładnie wskazany zestaw praw dla wybranych klas, więc wcześniejsze prawa w tych klasach są zastępowane. Jeżeli właściciel miał rwx, to po ug=rw nie zachowa x, tylko dostanie rw-. Jeżeli grupa miała --x, to również nie zachowa x, lecz będzie miała rw-. To nie jest operacja dodawania, jak przy ug+rw. Gdyby użyto plusa, wtedy można by mówić o zachowywaniu wcześniejszego x, ale tutaj sytuacja jest inna. Niepoprawne jest też założenie, że zmienią się prawa dla pozostałych użytkowników. W poleceniu występuje tylko ug, czyli user i group. Brakuje o oraz a, więc uprawnienia others zostają bez zmian. Skoro wcześniej były r-x, to po wykonaniu polecenia nadal są r-x, a nie rw-. Warto też zauważyć, że początkowy zapis -rwx --x r-x oznacza zwykły plik, bo pierwszy znak to -, a dalej są trzy trójki uprawnień: właściciel, grupa i inni. Z mojego doświadczenia najlepiej rozbijać taki zapis na kawałki, bo wtedy mniej miesza się rwx z właścicielem, grupą i pozostałymi. Sam potok | w tym przykładzie nie jest najlepszą praktyką do sekwencyjnego uruchamiania poleceń, bo przekazuje standardowe wyjście jednego programu na wejście drugiego. W codziennej administracji czytelniej byłoby użyć chmod ug=rw szkola.txt && ls -l szkola.txt. Sens zadania dotyczy jednak efektu zmiany uprawnień, a ten prowadzi do zapisu -rw- rw- r-x.