W Linuksie każdy plik ma właściciela, grupę i trzy zestawy uprawnień: co może zrobić właściciel, co członkowie grupy, a co wszyscy inni. Na wyjściu ls -l widać je jako dziewięć znaków, np. -rw-r--r--, a w poleceniu chmod zapisuje się je liczbą, np. 644. Przeliczanie między tymi zapisami jest sprawdzianem rozumienia — i świetnym zadaniem do programu. Na lekcji uczniowie piszą takie przeliczanie w Pythonie.
Scenariusz jest przeznaczony na 45 minut dla klasy znającej system binarny i funkcje w Pythonie — na przykład po lekcji o strukturze katalogów. Program tylko przelicza zapisy, więc działa też w Windowsie. Same polecenia chmod uczniowie wykonują ręcznie w terminalu Linuksa.
Przygotowanie stanowisk
Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- odczytać uprawnienia
rwxr-xr--dla właściciela, grupy i innych; - przeliczać zapis symboliczny na ósemkowy (r = 4, w = 2, x = 1) i odwrotnie;
- obliczyć wynik poleceń
chmod u+xichmod go-x; - obliczyć domyślne uprawnienia nowych plików i katalogów dla zadanego
umask.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: kto może czytać i zmieniać plik? |
| 5–15 min | Odczyt ls -l, r, w, x |
| 15–22 min | Zapis ósemkowy, chmod, umask |
| 22–37 min | Trzy zadania w Pythonie |
| 37–42 min | Próba w terminalu Linuksa |
| 42–45 min | Pytania kontrolne |
Odczyt uprawnień
W wyniku ls -l pierwszy znak to typ (- plik, d katalog), a dziewięć kolejnych to trzy trójki dla właściciela (u), grupy (g) i pozostałych (o):
-rw-r--r-- plik: właściciel czyta i zapisuje, grupa i inni tylko czytają
drwxr-xr-x katalog: właściciel wszystko, pozostali czytają i wchodzą
| Litera | Dla pliku | Dla katalogu |
|---|---|---|
r (4) | odczyt zawartości | wyświetlenie listy plików |
w (2) | zmiana zawartości | tworzenie i usuwanie plików w katalogu |
x (1) | uruchomienie programu | wejście do katalogu (cd) |
Zapis ósemkowy
Każda trójka to suma: rwx = 4 + 2 + 1 = 7, r-x = 5, rw- = 6, r-- = 4, --- = 0. Zatem -rw-r--r-- to 644, -rwxr-xr-x to 755, -rw------- to 600, a -rw-r----- to 640. Polecenia chmod 644 plik i chmod u=rw,go=r plik robią to samo.
chmod symboliczny i umask
chmod u+x plik dodaje wykonywanie dla właściciela, chmod go-x plik odbiera je grupie i innym, a chmod a+r plik dodaje odczyt wszystkim. umask to maska odbierająca prawa przy tworzeniu: nowy plik zaczyna od 666, nowy katalog od 777, a umask odejmuje ustawione w nim bity. Przy umask 022 plik ma 644, a katalog 755; przy 077 — odpowiednio 600 i 700.
Specjalne bity (setuid 4xxx, sticky 1xxx) w zadaniu dla chętnych pojawiają się w zapisie jako s i t.
Zadania
Zadanie 1. Liczby na symbole. Napisz symbolicznie(tryb, katalog) i wypisz zapis dla 644, 755, 600, 640, 444 oraz dla katalogu 755.
Zadanie 2. Symbole na liczby. Napisz z_symbolicznego(tekst) i przelicz rwxr-xr-x, rw-r-----, rwx------ i r--r--r--.
Zadanie 3. chmod i umask. Napisz chmod_symbolicznie(tryb, polecenie) i oblicz wynik u+x dla 644, go-x dla 755 i a+r dla 600. Oblicz domyślne uprawnienia nowego pliku i katalogu dla umask 022, 077 i 002.
Dla chętnych: sprawdź zapis symboliczny trybów 4755 (setuid) i 1777 (sticky bit w katalogu /tmp).
Rozwiązanie i wyniki
import stat
def symbolicznie(tryb, katalog=False):
typ = stat.S_IFDIR if katalog else stat.S_IFREG
return stat.filemode(typ | tryb)
def z_symbolicznego(tekst):
cyfry = []
for grupa in (tekst[0:3], tekst[3:6], tekst[6:9]):
cyfry.append(4 * (grupa[0] == "r") + 2 * (grupa[1] == "w") + 1 * (grupa[2] == "x"))
return int("".join(str(c) for c in cyfry), 8)
def chmod_symbolicznie(tryb, polecenie):
operator = "+" if "+" in polecenie else "-"
kto, prawa = polecenie.split(operator)
maska = 0
for litera in prawa:
wartosc = {"r": 4, "w": 2, "x": 1}[litera]
for k in ("u", "g", "o") if kto == "a" else kto:
maska |= wartosc << {"u": 6, "g": 3, "o": 0}[k]
return tryb | maska if operator == "+" else tryb & ~maska
# Zadanie 1: z liczb na zapis symboliczny
for tryb in (0o644, 0o755, 0o600, 0o640, 0o444):
print(oct(tryb)[2:], symbolicznie(tryb))
print(oct(0o755)[2:], symbolicznie(0o755, katalog=True))
# Zadanie 2: z zapisu symbolicznego na liczby
for tekst in ("rwxr-xr-x", "rw-r-----", "rwx------", "r--r--r--"):
print(tekst, oct(z_symbolicznego(tekst))[2:])
# Zadanie 3: chmod i umask
print(oct(chmod_symbolicznie(0o644, "u+x"))[2:], oct(chmod_symbolicznie(0o755, "go-x"))[2:], oct(chmod_symbolicznie(0o600, "a+r"))[2:])
for umask in (0o022, 0o077, 0o002):
print("umask", oct(umask)[2:].zfill(3), "plik", oct(0o666 & ~umask)[2:], "katalog", oct(0o777 & ~umask)[2:])
Program wypisze:
644 -rw-r--r--
755 -rwxr-xr-x
600 -rw-------
640 -rw-r-----
444 -r--r--r--
755 drwxr-xr-x
rwxr-xr-x 755
rw-r----- 640
rwx------ 700
r--r--r-- 444
744 744 644
umask 022 plik 644 katalog 755
umask 077 plik 600 katalog 700
umask 002 plik 664 katalog 775
Zadanie dla chętnych (rozszerzenie.py) pokazuje zapis specjalnych bitów (s zamiast x dla setuid i t dla sticky):
-rwsr-xr-x
drwxrwxrwt
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
chmod 777 „naprawia” każdy problem | Daje wszystkim pełny dostęp — to zagrożenie bezpieczeństwa; nadawaj tylko potrzebne prawa. |
| Skrypt nie uruchamia się | Brak prawa x (wykonywanie): chmod u+x skrypt.sh. |
| Nie można wejść do katalogu | Brak prawa x na katalogu (mimo r). |
| Pomyłka kolejności u, g, o | Pierwsza trójka to właściciel, druga — grupa, trzecia — pozostali. |
Zapis 0644 kontra 644 | Zero na początku to ósemkowy zapis liczby (w Pythonie 0o644). |
chmod w Windowsie nie działa | Windows nie używa tego modelu uprawnień; ćwicz w Linuksie lub w WSL. |
Pytania kontrolne i punktacja
- Jakie uprawnienia oznacza
-rw-r-----? - Co daje
chmod 755 skrypt.sh? - Jakie uprawnienia ma nowy plik przy
umask 022?
Odpowiedzi: Właściciel: odczyt i zapis (6), grupa: odczyt (4), pozostali: brak (0) — zapis 640. Właściciel może czytać, zapisywać i uruchamiać, a grupa i pozostali czytać i uruchamiać. 644 (666 minus 022).
Proponowana punktacja (razem 10 punktów): zadanie 1 — funkcja symbolicznie 2 pkt, sześć wyników 1 pkt; zadanie 2 — przeliczenie z symboli 2 pkt, cztery wyniki 1 pkt; zadanie 3 — chmod_symbolicznie 2 pkt, umask 2 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to właściciele i grupy (chown, chgrp), użytkownicy systemu i polecenie sudo. Ten materiał rozwija dział o uprawnieniach w kursie Linux w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: uprawnienia plików w Wikipedii oraz moduł stat w dokumentacji Pythona. Zobacz też lekcję o strukturze katalogów.
Poprowadź kolejne lekcje Linux
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu Linux →