Linux · uprawnienia

Uprawnienia Linux — ćwiczenia z chmod

Odczyt i przeliczanie uprawnień rwx na zapis ósemkowy, chmod symboliczny i umask. Trzy zadania w Pythonie.

45 minutPoziom podstawowyPliki i rozwiązania

Materiał redakcyjny TablicaPro · liceum i technikum

rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
644 → -rw-r--r--
755 → -rwxr-xr-x

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+x i chmod go-x;
  • obliczyć domyślne uprawnienia nowych plików i katalogów dla zadanego umask.
CzasPraca na lekcji
0–5 minProblem: kto może czytać i zmieniać plik?
5–15 minOdczyt ls -l, r, w, x
15–22 minZapis ósemkowy, chmod, umask
22–37 minTrzy zadania w Pythonie
37–42 minPróba w terminalu Linuksa
42–45 minPytania 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ą
LiteraDla plikuDla katalogu
r (4)odczyt zawartościwyświetlenie listy plików
w (2)zmiana zawartościtworzenie i usuwanie plików w katalogu
x (1)uruchomienie programuwejś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

ObjawCo sprawdzić
chmod 777 „naprawia” każdy problemDaje 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 kataloguBrak prawa x na katalogu (mimo r).
Pomyłka kolejności u, g, oPierwsza trójka to właściciel, druga — grupa, trzecia — pozostali.
Zapis 0644 kontra 644Zero na początku to ósemkowy zapis liczby (w Pythonie 0o644).
chmod w Windowsie nie działaWindows nie używa tego modelu uprawnień; ćwicz w Linuksie lub w WSL.

Pytania kontrolne i punktacja

  1. Jakie uprawnienia oznacza -rw-r-----?
  2. Co daje chmod 755 skrypt.sh?
  3. 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 →

Zobacz program kursu