Użytkownicy i grupy
W uniksopodobnych systemach istnieją użytkownicy i grupy.
Użytkownicy identyfikowani są po numerycznych identyfikatorach uid (user identifier), które są mapowane na nazwy użytkowników.
Podobnie grupy mają identyfikatory numeryczne o nazwie gid (group identifier), które też są mapowane na nazwy grup.
Każdy użytkownik jest w jednej podstawowej grupie (nazywanej jego grupą podstawową, primary group) i może należeć do dowolnie wielu grup (nazywanych jego grupami dodatkowymi, supplementary groups).
Lista dostępnych użytkowników i grup oraz powiązania uid/gid z nazwami zwykle są czytane z plików /etc/passwd i /etc/groups, ale po odpowiedniej konfiguracji może być pobierana też z innych źródeł.
Np. można wykorzystać serwer LDAP, czy kontroler domeny AD za pośrednictwem programu winbindd. Więcej informacji na tutaj.
Hasła lokalnych użytkowników i grup są przechowywane w /etc/shadow i /etc/gshadow
W systemie plików zapisane są uidy i gidy (a nie nazwy użytkowników), stąd np. podłączenie dysku z jednego komputera do drugiego przypisze pliki innym nazwom użytkowników i grup jeżeli mapowania uid/gid na nazwy nie są identyczne na obu systemach.
To dotyczy również kontenerów (sic!).
Dla procesów uniksopodobne systemy przechowują efektywny, zapisany i rzeczywisty uid (analogicznie gid).
Dla zwykłych procesów te identyfikatory są równe, dla procesów które zmieniały użytkownika mogą być różne. Więcej informacji na tutaj.
W tej chwili zakres uid'ów i gid'ów w Linuksie to 0÷(232-2)
Użytkownik o uid równym 0 nazywany jest superużytkownikiem (superuser) i ma zwyczajowo nadaną nazwę root.
Żeby sprawdzić swoją nazwę użytkownika, można skorzystać z komendy whoami.
Do sprawdzenia listy grup służy komenda groups [użytkownik]. Bez argumentów wyświetla grupy bieżącego użytkownika.
Zadanie 1 Przetestuj działanie komendy whoami.
Zadanie 2 Sprawdź listę grup w której jesteś. Sprawdź listę grup w której jest użytkownik student.
Komenda id [użytkownik] wyświetla nazwy i numery użytkownika, jego grupy podstawowej i grup dodatkowych.
Informację o użytkowniku można wyciągnąć poleceniem getent passwd użytkownik, o grupach – getent group grupa.
Zadanie 3 Sprawdź jaki masz uid i gid, zarówno poleceniem id jak i getent.
Zmiana hasła użytkownika jest wykonywana przy pomocy komendy passwd.
Root może przy pomocy passwd user ustawić hasło każdego użytkownika, może też zmienić czas ważności hasła bądź zablokować konto.
Podstawowe komendy administracyjne do zarządzania użytkownikami to:
dodawanie nowego użytkownika: useradd [-m] [-g grupa] nazwa
dodawanie nowej grupy: groupadd nazwa
dodanie użytkownika do grupy: gpasswd -a użytkownik grupa
zmiana/usunięcie użytkownika/grupy: usermod / userdel / groupmod / groupdel
Przykłady:
user@host ~ $ whoami
user
user@host ~ $ groups
wheel users android
user@host ~ $ groups john
android chromium
user@host ~ $ id
uid=1005(user) gid=100(users) grupy=100(users),10(wheel),968(android)
user@host ~ $ id john
uid=1234(john) gid=1001(chromium) grupy=1001(chromium),968(android)
Użytkownicy w systemie, historia logowania, komunikacja
Listę osób bieżąco używających systemu można wyświetlić komendą w -n oraz who.
Historię logowań można wyświetlić używając polecenia last [-n ile_ostatnich] [username].
Zadanie 4 Zaloguj się po ssh na polluksa. Sprawdź jacy inni użytkownicy są zalogowani.
Zadanie 5 Na polluksie sprawdź jacy trzej użytkownicy logowali się ostatnio.
Zadanie 6 Na polluksie sprawdź kiedy ostatnio logował się użytkownik root.
Zadanie 7 Sprawdź jacy użytkownicy byli zalogowaniu na polluksie w chwili 2026-03-16 10:04:10
Komendą write użytkownik [terminal] można wysłać tekst do wybranego użytkownika (kończąc wpisany tekst przez EOF, zwykle Ctrl+d).
Spowoduje to wyświetlenie mu podanego testu poprzedzonego komunikatem "message from…" w terminalu.
Otrzymywanie takich wiadomości można zablokować (bądź odblokować) komendą mesg {n|y}.
Można też wysłać wiadomość do wszystkich użytkowników komendą wall.
Zadanie 8 Napisz do sąsiada wiadomość. Zobacz na własnym ekranie wiadomość wysłaną od kogoś.
Istnieje też komenda talk użytkownik pozwalająca na rozmowę między dwoma użytkownikami.
Przykłady:
user@host ~ $ who
user tty2 2025-01-04 10:04 (:0)
user pts/0 2025-01-04 10:04 (:0)
user pts/1 2025-01-04 10:06 (:0)
user pts/2 2025-01-04 12:25 (:0)
user pts/4 2025-01-04 12:27 (:0)
user tty3 2025-01-04 14:54
user pts/6 2025-01-04 18:36 (:0)
jane pts/5 2025-01-04 13:43
john pts/3 2025-01-04 23:43
user@host ~ $ w
23:46:14 up 13:45, 9 users, load average: 0.97, 0.66, 0.53
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
user tty2 10:04 12:45m 0.00s 0.17s /usr/bin/startplasma-x11
user pts/0 10:04 2:21 0.95s 0.72s /bin/bash
user pts/1 10:06 2:04m 0.26s 0.06s alsamixer -c0
user pts/2 12:25 0.00s 0.23s 0.23s /bin/bash
user pts/4 12:27 54:13 10.42s 10.33s ssh root@10.0.0.7
user tty3 14:54 8:52m 2:07 ? xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc :1 -auth /tmp/serverauth.w8runSyQCb
user pts/6 18:36 3:26m 0.21s ? /usr/bin/less
jane pts/5 13:43 2:22 0.80s 0.52s top
john pts/3 23:43 2:27 0.23s 0.01s /usr/lib/python-exec/python3.12/python
user@host ~ $ last -n 3 user
user tty3 Sat Jan 4 14:54 still logged in
user pts/9 Sat Jan 4 20:05 - 09:13 (5+13:08)
user pts/1 :0 Thu Jan 2 10:05 - 10:21 (00:15)
wtmp begins Mon Dec 31 23:59:59 2024
user@host ~ $ last -n 7
john pts/3 Sat Jan 4 23:43 still logged in
user tty3 Sat Jan 4 14:54 still logged in
jane pts/3 Sat Jan 4 13:43 still logged in
user pts/9 Sat Jan 4 20:05 - 09:13 (2+13:08)
user pts/1 :0 Thu Jan 2 10:05 - 10:21 (00:15)
user pts/17 :0 Wed Jan 1 22:10 - 22:37 (00:26)
reboot system boot 6.8.8 Wed Jan 1 22:08 still running
user pts/16 :0 Wed Jan 1 12:10 - 12:37 (00:26)
wtmp begins Mon Dec 31 23:59:59 2024
Przełączenie się na innego użytkownika
Posiadając odpowiednie uprawnienia i/lub znając odpowiednie hasło (w zależności od ustawień systemu) można przełączyć się na innego użytkownika bądź wykonać komendę jako inny użytkownik.
Komenda su [-] [użytkownik] po uwierzytelnieniu uruchamia domyślną
powłokę dla podanego użytkownika (domyślnie roota).
Komenda su -c komenda [-] [użytkownik] po uwierzytelnieniu uruchamia
w domyślnej powłoce dla podanego użytkownika (domyślnie roota) podaną komendę.
su jest dostępna w każdym uniksopodobnym systemie.
W domyślnych ustawieniach Linuksa komenda su wymaga podania hasła użytkownika docelowego (i w niektórych dystrybucjach przynależności do odpowiedniej grupy, zwykle wheel).
Na wielu dystrybucjach instalowana jest też komenda sudo która ma na celu
zezwolenie wybranym użytkownikom na wykonywanie wybranych komend z uprawnieniami
wskazanych użytkowników. Do uwierzytelnienia sudo wykorzystuje hasło
bieżącego bądź docelowego użytkownika.
W niektórych dystrybucjach komenda sudo jest nadużywana do zastąpienia komendy su.
Zadanie 9 Zaloguj się na podany przez prowadzącego serwer przez ssh
(prawdopodobnie ssh userN@fe80::1%2, gdzie N musisz zastąpić numerem
swojego komputera).
Zmień użytkownika na root.
Zmień użytkownika na innego userN.
Do zmiany (w bieżącej sesji powłoki) grupy podstawowej można użyć komendy newgrp lub sg. Komenda sg może też (podobnie jak su) uruchomić wskazane polecenie ze zmienioną grupą podstawową.
Komenda newgrp jest w standardzie POSIX, ale część systemów uniksopodobnych jej nie dostarcza. sg jest specyficzne dla Linuksa.
Po wykonaniu komendy newgrp / sg lista grup do których użytkownik należy zostaje bez zmian, więc efektywne prawa dostępu do plików są identyczne niezależnie od bieżącej grupy podstawowej.
Zmiana grupy podstawowej ma wpływ m. inn. na to do jakiej grupy należą nowo tworzone pliki i procesy.
Root może też korzystać z komend runuser i setpriv do uruchamiania komend z innym uid/gid/uprawnieniami.
Przykłady:
user@host ~ $ su
Password:
root@host /home/user # exit
user@host ~ $ su john
Password:
[host /home/user]$ exit
exit
user@host ~ $ id
uid=1005(user) gid=100(users) groups=100(users),10(wheel),968(android)
user@host ~ $ newgrp android
user@host ~ $ id
uid=1005(user) gid=968(android) groups=968(android),10(wheel),100(users)
user@host ~ $ exit
exit
user@host ~ $ su john
Password:
[host /home/user]$ sg android -c 'ps -H -o user,group,cmd -t `tty`'
USER GROUP CMD
user users -bash
root users su john
john chromium bash
root chromium sg android -c ps -H -o user,group,cmd -t `tty`
john android ps -H -o user,group,cmd -t /dev/pts/11
[host /home/user]$ exit
exit
user@host ~ $
Zwróć uwagę, że każde wywołanie
su,
newgrp, etc. uruchamia nowy proces (domyślnie powłoki).
Zauważ też że programy su i sg są uruchamiane jako root, co będzie wyjaśnione później w tym temacie.
Uprawnienia dostępu do plików
Rodzaje i zapis uprawnień
W uniksopodobnych systemach dostęp do pliku określają trzy podstawowe uprawnienia: odczytu (read), zapisu (write) i wykonania (execute).
Każde z tych uprawnień jest przyznawane osobno właścicielowi pliku (user), grupie pliku (group) i pozostałym użytkownikom (others).
Dodatkowo można ustawić trzy uprawnienia specjalne: set-user-id (suid, s), set-group-id (sgid, s) i sticky (t).
Przy dostępie do pliku, jeżeli plik należy do bieżącego użytkownika, brane są pod uwagę tylko uprawnienia użytkownika.
Jeżeli plik nie należy do użytkownika, ale użytkownik należy do grupy pliku, brane są pod uwagę tylko uprawnienia grupy.
Jeżeli plik nie należy do użytkownika i użytkownik nie należy do grupy pliku, brane są pod uwagę tylko uprawnienia pozostałych.
Zauważ że jeśli plik ma ustawione prawo do odczytu dla grupy ale nie ma prawa odczytu dla użytkownika, to właściciel pliku nie może wyświetlić tego pliku nawet jeśli należy do grupy pliku.
Prawo do wykonania dla pliku oznacza możliwość uruchomienia go (jako skrypt, program etc.), dla katalogu – wejścia do niego.
Suid/sgid nadany zwykłym plikom oznacza, że po uruchomieniu proces będzie działać z efektywnym uid/gid właściciela pliku.
Zauważ że skrypt są interpretowane przez inny program, nie uruchamiane. Nadanie skryptowi suid/sgid nie ma wpływu na jego działanie.
Suid pozwala np. zwykłemu użytkownikowi zmienić hasło (czyli zmienić plik /etc/shadow do którego zwykły użytkownik nie ma dostępu).
Sgid pozwala np. zwykłemu użytkownikowi uruchamiać maszyny wirtualne w VirtualBoxie czy analizować pakiety sieciowe w Wiresharku.
Sticky bit nadany katalogowi D oznacza, że plik X z katalogu D może usunąć tylko właściciel pliku X bądź katalogu D.
Sticky bit ustawiany jest w katalogu /tmp i innych, gdzie każdy użytkownik może tworzyć pliki o to, by tylko właściciel (bądź root) mogli usunąć pliki.
Suid/sgid dla innych plików niż zwykłe i sticky bit dla innych plików niż katalogi nie mają spójnego znaczenia w uniksopodobnych systemach.
Przy montowaniu systemu plików można ustawić opcję nosuid która wyłącza działanie suid/sgid
Uprawnienia są przechowywane jako liczba, gdzie wartości kolejnych bitów oznaczają (od najstarszego bitu): prawa specjalne (w kolejności suid, sgid, sticky), i prawa dla użytkownika, grupy, innych (w kolejności odczyt, zapis, wykonanie).
Numerycznie uprawnienia zapisuje się w systemie ósemkowym, np: 4751 gdzie kolejne cyfry oznaczają uprawnienia specjalne (tutaj: suid), użytkownika (tutaj: wszystkie), grupy (tutaj: odczyt i wykonanie) i innych (tutaj: wykonanie).
Tekstowo uprawnienia zapisuje się jako: rwxrwxrwx, gdzie kolejne trójki to właśnie uprawnienia użytkownika, grupy i innych.
Brak danego uprawnienia zapisuje się przez -.
Zwykle przed tak zapisanymi uprawnieniami pojawia się dodatkowa litera określająca typ pliku.
Uprawnienia specjalne zapisuje się na pozycji uprawnień wykonania: suid i prawo do wykonanie to s, suid i brak prawa do wykonania to S na pozycji użytkownika. Analogicznie prezentowany jest sgid na pozycji grupy, i sticky bit z literami t i T na pozycji pozostałych.
Przykładowo: rw-r--r-- oznacza że użytkownik ma prawo zapisu i odczytu, a grupa i pozostali tylko do odczytu (równoważne 644),
a rwx--x--x pozwalają właścicielowi na odczyt, zapis i wykonanie pliku, a grupie i pozostałym tylko na wykonanie (711).
Ilustracja tego na który z trzech zestawów uprawnień patrzyć
Pamiętaj że program ls czy stat będzie identycznie wyświetlał uprawnienia niezależnie od tego czy użytkownik jest właścicielem pliku czy nie, czy plik należy do jednej z grup użytkownika czy nie.
roo@host /tmp $ whoami
roo
roo@host /tmp $ groups
bipedal jumping
roo@host /tmp $ ls -l
total 4
drwxr-x--x 5 roo jumping 160 Mar 16 20:04 myDir
-rw----r-- 1 roo jumping 249 Mar 16 20:03 someFile
roo@host /tmp $ stat myDir
File: myDir
Size: 160 Blocks: 0 IO Block: 4096 directory
Device: 0,30 Inode: 90 Links: 5
Access: (0751/drwxr-x--x) Uid: (1234/ roo) Gid: (123/ jumping)
roo@host /tmp $ stat someFile
File: someFile
Size: 249 Blocks: 8 IO Block: 4096 regular file
Device: 0,30 Inode: 91 Links: 1
Access: (0604/-rw----r--) Uid: (1234/ roo) Gid: (123/ jumping)
Użytkownik
roo jest właścicielem pliku, więc patrzy
tylko na pierwszy zestaw uprawnień.
tigger@host /tmp $ whoami
tigger
tigger@host /tmp $ groups
jumping happy
tigger@host /tmp $ ls -l
total 4
drwxr-x--x 5 roo jumping 160 Mar 16 20:04 myDir
-rw----r-- 1 roo jumping 249 Mar 16 20:03 someFile
tigger@host /tmp $ stat myDir
File: myDir
Size: 160 Blocks: 0 IO Block: 4096 directory
Device: 0,30 Inode: 90 Links: 5
Access: (0751/drwxr-x--x) Uid: (1234/ roo) Gid: (123/ jumping)
tigger@host /tmp $ stat someFile
File: someFile
Size: 249 Blocks: 8 IO Block: 4096 regular file
Device: 0,30 Inode: 91 Links: 1
Access: (0604/-rw----r--) Uid: (1234/ roo) Gid: (123/ jumping)
Użytkownik
tigger nie jest właścicielem pliku, ale jest w grupie
jumping do której należy plik, więc patrzy
tylko na środkowy zestaw uprawnień.
eeyore@host /tmp $ whoami
eeyore
eeyore@host /tmp $ groups
quadruped glum
eeyore@host /tmp $ ls -l
total 4
drwxr-x--x 5 roo jumping 160 Mar 16 20:04 myDir
-rw----r-- 1 roo jumping 249 Mar 16 20:03 someFile
eeyore@host /tmp $ stat myDir
File: myDir
Size: 160 Blocks: 0 IO Block: 4096 directory
Device: 0,30 Inode: 90 Links: 5
Access: (0751/drwxr-x--x) Uid: (1234/ roo) Gid: (123/ jumping)
eeyore@host /tmp $ stat someFile
File: someFile
Size: 249 Blocks: 8 IO Block: 4096 regular file
Device: 0,30 Inode: 91 Links: 1
Access: (0604/-rw----r--) Uid: (1234/ roo) Gid: (123/ jumping)
Użytkownik
eeyore nie jest właścicielem pliku i
nie jest w grupie
jumping do której należy plik, więc patrzy
tylko na ostatni zestaw uprawnień.
Aby zobaczyć szczegółowe informacje o pliku, w tym uprawnienia, można wykonać stat plik.
Uprawnienia są też wyświetlane w wynikach ls -l i tree -p (lub razem z nazwą użytkownia i grupy tree -pug().
Wszystkie powyższe polecenia dodają na początek uprawnień literę określającą rodzaj pliku.
Zadanie 10 Sprawdź jakie uprawienia mają (na twoim komputerze):
twój katalog domowy
podkatalog .ssh w twoim katalogu domowym
plik .bash_history w twoim katalogu domowym
plik /etc/passwd i /etc/shadow
katalog /tmp
plik /usr/bin/passwd i /usr/bin/write
Zadanie 11 Sprawdź jakie mają uprawnienia i jakim są rodzajem plików:
Zmiana uprawnień, grupy i użytkownika pliku
Domyślnie uprawnienia nadawane plikom i katalogom określa maska którą można odczytać poleceniem umask (i zmienić dla bieżącej powłoki poleceniem umask oktalnie).
Do zmiany uprawnień służy komenda chmod uprawnienia plik.
chmod przyjmuje uprawnienia w postaci ósemkowej, np. chmod 644 plik lub w postaci symbolicznej.
Postać symboliczna to oddzielone przecinkami wyrażenia na które składa się:
litera u, g, o lub a (user, group, others lub all - wszyscy)
operacja +, - lub = (dodaj, usuń lub ustaw te prawa)
uprawnienia r, w, x, s lub t.
Np. chmod u+x,o= plik doda użytkownikowi prawo do zapisu i ustawi brak praw dla innych (a prawa grupy zostaną bez zmian).
Pominięcie litery [ugoa] przed operacją ma specjalne znaczenie, szczegóły w podręczniku systemowym.
Uprawnienia dostępu może zmieniać tylko właściciel pliku (i root).
Właściciel pliku będący w kliku grupach może użyć komendy chgrp grupa plik do zmiany grupy do której należy plik.
Tylko root może zmienić właściciela (i grupę) pliku poleceniem chown [właściciel][:[grupa]] plik.
Zarówno chmod, chgrp i chown przyjmują przełączniki -R (--recursive) dla rekursywnej zmiany i --reference=plik dla ustawienia uprawnień/grupy/właściciela identycznego jak we wskazanym pliku.
Ćwiczenia wykonuj na podanym przez prowadzącego serwerze (ssh userN@fe80::1%2).
Do tworzenia plików możesz wykorzystać np. komendę fortune > plik.
Instrukcja jak wykonywać ćwiczenia na własnym urządzeniu z Linuksem
Żeby robić poniższe ćwiczenia z własnego komputera, możesz albo:
Dodać do swojego systemu przykładowe grupy i użytkowników komendami:
groupadd even
groupadd odd
groupadd low
groupadd high
useradd -g odd -G low -m user1
useradd -g even -G low -m user2
useradd -g odd -G high -m user3
useradd -g even -G high -m user4
passwd -d user1
passwd -d user2
passwd -d user3
passwd -d user4
Zbudować i użyć
obrazu dockera (o ile znasz dokera), np. komendami:
curl -s https://www.cs.put.poznan.pl/jkonczak/_media/so:users_chmod:container-for-file-permission-labs.tar.xz | tar xJ
docker build --tag container-for-file-permission-labs container-for-file-permission-labs
docker run --network=none --rm -ti container-for-file-permission-labs
Zadanie 12 Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel mógł odczytać plik.
Sprawdź poprawność nadanych praw przełączając się na innych użytkowników.
Zadanie 13 Stwórz plik. Ustaw korzystając z ósemkowego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik. Sprawdź poprawność nadanych praw.
Zadanie 14 Stwórz plik. Ustaw korzystając z symbolicznego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik.
Zadanie 15 Zmień grupę pliku z poprzedniego zadania.
Zadanie 16 Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel i pozostali mogli odczytać plik. Sprawdź czy osoba należąca do grupy pliku może go odczytać.
Zadanie 17 Stwórz katalog K ze zwykłym plikiem P i pustym podkatalogiem w środku.
Odbierz prawo do wykonywania katalogu K.
Spróbuj wylistować ze szczegółami katalog K, wejść do niego,
oraz wyświetlić plik P bez wchodzenia do katalogu K.
Zadanie 18 Zmień prawa dostępu katalogu na u=rwx,go=rx. Stwórz w tym
katalogu zwykły plik. Wyświetl plik jako inny użytkownik. Wyświetl zawartość
katalogu jako inny użytkownik.
Następnie zmień prawa do katalogu na u=rwx,go=x. Spróbuj ponownie
wyświetlić plik i zawartość katalogu jako inny użytkownik.
Zadanie 19 Stwórz katalog z prawami dostępu 777 i stwórz w nim dwa pliki. Jednemu z nich ustaw prawa 600. Z innego użytkownika spróbuj usunąć oba pliki.
Zadanie 20 W katalogu użytkownika A z prawami dostępu 777 stwórz jako użytkownik B dwa katalogi: jeden pusty, jeden z plikiem w środku. Spróbuj usunąć te katalogi jako użytkownik A.
Zadanie 21 Czy możesz zmienić nazwę katalogu K który nie dał się usunąć w
poprzednim zadaniu? Czy możesz przenieść katalog K do innego katalogu? Czy
możesz przenieść katalog zawierający K do innego katalogu?
Zadanie 22 Stwórz plik i katalog z plikiem w środku i odbierz wszystkim trzem wszystkie uprawnienia. Zmień użytkownika na root i spróbuj wyświetlić oba pliki.
Zadanie 23 Z roota zmień właściciela wybranego pliku. Następnie zmień grupę innego pliku na www-data.
Przykłady:
umask
user@host ~ $ umask
0022
user@host ~ $ mkdir d_zero-two-two
user@host ~ $ touch f_zero-two-two
user@host ~ $ umask 027
user@host ~ $ mkdir d_zero-two-seven
user@host ~ $ touch f_zero-two-seven
user@host ~ $ umask 421
user@host ~ $ mkdir d_four-two-one
user@host ~ $ touch f_four-two-one
user@host ~ $ ls -ltr
drwxr-xr-x 2 user users 4096 Jan 04 00:01 d_zero-two-two
-rw-r--r-- 1 user users 0 Jan 04 00:02 f_zero-two-two
drwxr-x--- 2 user users 4096 Jan 04 00:03 d_zero-two-seven
-rw-r----- 1 user users 0 Jan 04 00:04 f_zero-two-seven
d-wxr-xrw- 2 user users 4096 Jan 04 00:05 d_four-two-one
--w-r--rw- 1 user users 0 Jan 04 00:06 f_four-two-one
manipulacja uprawnieniami
user@host ~/perms $ ls -l butterflies.txt
-rw-r--r-- 1 user users 55 Jan 04 12:00 butterflies.txt
user@host ~/perms $ stat butterflies.txt
File: butterflies.txt
Size: 55 Blocks: 8 IO Block: 4096 regular file
Device: 254,3 Inode: 15466579 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Access: 2025-01-04 12:00:00.000000000 +0100
Modify: 2025-01-04 12:00:00.000000000 +0100
Change: 2025-01-04 12:00:00.000000000 +0100
Birth: 2025-01-04 12:00:00.000000000 +0100
Uprawnienia są pokazywane symbolicznie w wyniku
ls -l i symbolicznie oraz ósemkowo w wyniku
stat.
Poniższe trzy przykłady ustawiają te same uprawnienia różnymi argumentami do
chmod:
user@host ~/perms $ stat butterflies.txt | sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod g+w butterflies.txt
user@host ~/perms $ stat butterflies.txt | sed -n '4p'
Access: (0664/-rw-rw-r--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod ug+x butterflies.txt
user@host ~/perms $ stat butterflies.txt | sed -n '4p'
Access: (0774/-rwxrwxr--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod o-r butterflies.txt
user@host ~/perms $ stat butterflies.txt | sed -n '4p'
Access: (0770/-rwxrwx---) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ stat field.txt | sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod ug+x,g+w,o-r field.txt
user@host ~/perms $ stat field.txt | sed -n '4p'
Access: (0770/-rwxrwx---) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ stat pause.txt | sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod 770 pause.txt
user@host ~/perms $ stat pause.txt | sed -n '4p'
Access: (0770/-rwxrwx---) Uid: ( 1005/ user) Gid: ( 100/ users)
Pominięcie
ugo przy zapisie symbolicznym w
chmod: zmieni wskazane prawa użytkownikowi, grupie i pozostałym, o ile maska (
umask) nie ma przysłania odpowiedniego bitu uprawnień:
user@host ~/perms $ chmod 0 rain.txt
user@host ~/perms $ stat rain.txt | sed -n '4p'
Access: (0000/----------) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ umask
0022
user@host ~/perms $ chmod +rw rain.txt
user@host ~/perms $ stat rain.txt | sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Uprawnienia specjalne w zapisie symbolicznym pokazywane są literą
s/S i
t/T na odpowiednim polu; wielkość litery pokazuje czy uprawnienie do wykonania "przykryte" przez odpowiednie specjalne uprawnienie jest ustawione.
user@host ~/perms $ stat smell.txt | sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod g+s,o= smell.txt
user@host ~/perms $ stat smell.txt | sed -n '4p'
Access: (2640/-rw-r-S---) Uid: ( 1005/ user) Gid: ( 100/ users)
user@host ~/perms $ chmod g+x smell.txt
user@host ~/perms $ stat smell.txt | sed -n '4p'
Access: (2650/-rw-r-s---) Uid: ( 1005/ user) Gid: ( 100/ users)
user, group czy others
user@host ~/perms $ chmod 077 butterflies.txt
user@host ~/perms $ chmod 707 field.txt
user@host ~/perms $ chmod 770 pause.txt
user@host ~/perms $ chgrp android field.txt
user@host ~/perms $ ls -l
total 24
----rwxrwx 1 user users 55 Jan 04 12:00 butterflies.txt
-rwx---rwx 1 user android 82 Jan 04 12:00 field.txt
-rwxrwx--- 1 user users 85 Jan 04 12:00 pause.txt
user@host ~/perms $ cat butterflies.txt
cat: butterflies.txt: Permission denied
user@host ~/perms $ su john
Password:
[host /home/user/perms]$ groups
android chromium
[host /home/user/perms]$ cat field.txt
cat: field.txt: Permission denied
[host /home/user/perms]$ cat pause.txt
cat: pause.txt: Permission denied
Zauważ że np. dla użytkownika
john z grupy
android przy dostępie do pliku
field.txt brane są pod uwagę tylko uprawienia grupy - nie ma on dostępu do pliku mimo tego że "pozostali" mają dostęp.
uprawnienia tylko do zapisu, odczytu
user@host ~ $ touch incoming
user@host ~ $ chmod 422 incoming
user@host ~ $ cat incoming
user@host ~ $ echo "hello" > incoming
-bash: incoming: Permission denied
user@host ~ $ su jane
Password:
jane@host /home/user $ cat incoming
cat: incoming: Permission denied
jane@host /home/user $ echo "hello" > incoming
jane@host /home/user $ echo "user!" >> incoming
jane@host /home/user $ exit
exit
user@host ~ $ cat incoming
hello
user!
tworzenie/usuwanie wpisów w katalogach
Do tworzenia i usuwania plików (w tym katalogów) w katalogu wystarczą uprawienia wykonania i zapisu do tego katalogu. Specjalnie uprawienie "sticky bit" dodatkowo zabrania usuwania plików użytkownikom którzy nie są właścicielem usuwanego pliku lub właścicielem katalogu z którego plik jest usuwany.
user@host ~ $ chgrp android ffa
user@host ~ $ chmod g+w ffa
user@host ~ $ cd ffa
user@host ~/ffa $ touch user_file
user@host ~/ffa $ su john
Password:
[host /home/user/ffa]$ id
uid=1234(john) gid=1001(chromium) groups=1001(chromium),968(android)
[host /home/user/ffa]$ mkdir john_empty_dir john_dir
[host /home/user/ffa]$ touch john_file1 john_file2 john_file3 john_dir/file
[host /home/user/ffa]$ exit
exit
user@host ~/ffa $ su jane
Password:
jane@host /home/user/ffa $ touch jane_file
jane@host /home/user/ffa $ tree -pug
[drwxrwxr-x user android ] .
├── [-rw-r--r-- jane android ] jane_file
├── [drwxr-xr-x john chromium] john_dir
│ └── [-rw-r--r-- john chromium] file
├── [drwxr-xr-x john chromium] john_empty_dir
├── [-rw-r--r-- john chromium] john_file1
├── [-rw-r--r-- john chromium] john_file2
├── [-rw-r--r-- john chromium] john_file3
└── [-rw-r--r-- user users ] user_file
3 directories, 6 files
jane@host /home/user/ffa $ rm -f user_file
jane@host /home/user/ffa $ rm -f john_file1
jane@host /home/user/ffa $ rm -rf john_empty_dir
jane@host /home/user/ffa $ rm -rf john_dir
rm: cannot remove 'john_dir/file': Permission denied
jane@host /home/user/ffa $ tree -pug
[drwxrwxr-x user android ] .
├── [-rw-r--r-- jane android ] jane_file
├── [drwxr-xr-x john chromium] john_dir
│ └── [-rw-r--r-- john chromium] file
├── [-rw-r--r-- john chromium] john_file2
└── [-rw-r--r-- john chromium] john_file3
2 directories, 4 files
jane@host /home/user/ffa $ exit
exit
user@host ~/ffa $ chmod o+t .
user@host ~/ffa $ su jane
Password:
jane@host /home/user/ffa $ rm -f jane_file
jane@host /home/user/ffa $ rm -f john_file2
rm: cannot remove 'john_file2': Operation not permitted
jane@host /home/user/ffa $ exit
exit
user@host ~/ffa $ rm -f john_file2
user@host ~/ffa $ chmod go=rx .
user@host ~/ffa $ su john
Password:
[host /home/user/ffa]$ tree -pug
[drwxr-xr-x user android ] .
├── [drwxr-xr-x john chromium] john_dir
│ └── [-rw-r--r-- john chromium] file
└── [-rw-r--r-- john chromium] john_file3
2 directories, 2 files
[host /home/user/ffa]$ rm john_file3
rm: cannot remove 'john_file3': Permission denied
suid i sgid
Suid i sgid nakazuje wykonać program jako właściciel pliku, zmieniając efektywne identyfikatory użytkownika bądź grupy (euid/egid).
user@host ~ $ pygmentize prog.c
int main(int, char **a) {
char *name;
asprintf(&name, "%s.txt", a[0]);
int file = creat(name, 0644);
free(name);
write(file, "Hello\n", 6);
close(file);
execlp("id", "id", 0);
return 1;
}
user@host ~ $ gcc -w -ansi ./prog.c -o prog
user@host ~ $ su
Password:
root@host /home/user # cp prog prog-suid
root@host /home/user # cp prog prog-sgid
root@host /home/user # cp prog prog-none
root@host /home/user # chown daemon:man prog-*
root@host /home/user # chmod u+s prog-suid
root@host /home/user # chmod g+s prog-sgid
root@host /home/user # exit
user@host ~ $ stat prog-* | awk '/F/{f=$0}/)/{print f "\t" $0}'
File: prog-none Access: (0755/-rwxr-xr-x) Uid: ( 2/ daemon) Gid: ( 15/ man)
File: prog-sgid Access: (2755/-rwxr-sr-x) Uid: ( 2/ daemon) Gid: ( 15/ man)
File: prog-suid Access: (4755/-rwsr-xr-x) Uid: ( 2/ daemon) Gid: ( 15/ man)
user@host ~ $ chmod go+w .
user@host ~ $ ./prog-none
uid=1005(user) gid=100(users) groups=100(users),10(wheel),968(android)
user@host ~ $ ./prog-suid
uid=1005(user) gid=100(users) euid=2(daemon) groups=100(users),10(wheel),968(android)
user@host ~ $ ./prog-sgid
uid=1005(user) gid=100(users) egid=15(man) groups=15(man),10(wheel),100(users),968(android)
user@host ~ $ stat prog-*.txt | awk '/F/{f=$0}/)/{print f "\t" $0}'
File: prog-none.txt Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
File: prog-sgid.txt Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 15/ man)
File: prog-suid.txt Access: (0644/-rw-r--r--) Uid: ( 2/ daemon) Gid: ( 100/ users)
user@host ~ $ ls -ltr prog-*
-rwsr-xr-x 1 daemon man 15680 Jan 04 12:01 prog-suid
-rwxr-sr-x 1 daemon man 15680 Jan 04 12:02 prog-sgid
-rwxr-xr-x 1 daemon man 15680 Jan 04 12:03 prog-none
-rw-r--r-- 1 user users 6 Jan 04 12:04 prog-none.txt
-rw-r--r-- 1 user man 6 Jan 04 12:05 prog-sgid.txt
-rw-r--r-- 1 daemon users 6 Jan 04 12:06 prog-suid.txt
Data utworzenia, modyfikacji, dostępu
Linuksowe system plików zwykle przechowują datę zmiany metadanych (change, ctime), zmiany treści (modify, mtime) i ostatniego dostępu (access, atime) dla każdego pliku. Niektóre systemy plików dodatkowo przechowują też czas utworzenia pliku.
Montując system plików często wyłącza się rejestrowanie czasu ostatniego dostępu podając opcję noatime lub ustawia zmianę tego czasu tylko w szczególnych przypadkach podając opcję relatime. Komenda mnt i findmnt wyświetlają z jakimi opcjami zamontowano system plików.
Polecenie stat plik pokazuje te czasy.
Komenda touch plik ustawia czas dostępu i modyfikacji pliku, domyślnie na teraz.
Podając -d data lub --reference=plik można wybrać inną datę, a -a, -c i -m wybierają który czas zmodyfikować.
Jeśli plik docelowy nie istnieje, domyślnie komenda touch go stworzy. Jest to często używane do tworzenia pustych plików.
Zadanie 24 Sprawdź daty dla pliku /var/log/wtmp
Zadanie 25 Zmień daty do swojego katalogu domowego.
Zadanie 26 Zmień datę zmiany zawartości wybranego pliku na 13:30 PDT Saturday month ago.
Przykłady:
user@host ~ $ stat essay.odt
File: essay.odt
Size: 73414 Blocks: 144 IO Block: 4096 regular file
Device: 254,3 Inode: 15466607 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Access: 2025-01-02 12:00:00.000000000 +0100
Modify: 2025-01-01 12:00:00.000000000 +0100
Change: 2025-01-02 12:00:00.000000000 +0100
Birth: 2025-01-01 12:00:00.000000000 +0100
user@host ~ $ ls -l essay.odt
-rw-r--r-- 1 user users 73414 Jan 1 12:00 essay.odt
user@host ~ $ touch -d '2025-01-03 12:34' essay.odt
user@host ~ $ stat essay.odt
File: essay.odt
Size: 73414 Blocks: 144 IO Block: 4096 regular file
Device: 254,3 Inode: 15466607 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Access: 2025-01-03 12:34:00.000000000 +0100
Modify: 2025-01-03 12:34:00.000000000 +0100
Change: 2025-01-05 12:00:00.000000000 +0100
Birth: 2025-01-01 12:00:00.000000000 +0100
user@host ~ $ ls -l essay.odt
-rw-r--r-- 1 user users 73414 Jan 3 12:34 essay.odt
user@host ~ $ touch -a -d 'yesterday 6pm' essay.odt
user@host ~ $ stat essay.odt
File: essay.odt
Size: 73414 Blocks: 144 IO Block: 4096 regular file
Device: 254,3 Inode: 15466607 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Access: 2025-01-04 18:00:00.000000000 +0100
Modify: 2025-01-03 12:34:00.000000000 +0100
Change: 2025-01-05 12:00:00.000000000 +0100
Birth: 2025-01-01 12:00:00.000000000 +0100
user@host ~ $ ls -l essay.odt
-rw-r--r-- 1 user users 73414 Jan 3 12:34 essay.odt
user@host ~ $ date
Sun Jan 5 12:00:00 CET 2025
user@host ~ $ touch essay.odt
user@host ~ $ stat essay.odt
File: essay.odt
Size: 73414 Blocks: 144 IO Block: 4096 regular file
Device: 254,3 Inode: 15466607 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1005/ user) Gid: ( 100/ users)
Access: 2025-01-05 12:00:00.000000000 +0100
Modify: 2025-01-05 12:00:00.000000000 +0100
Change: 2025-01-05 12:00:00.000000000 +0100
Birth: 2025-01-01 12:00:00.000000000 +0100
user@host ~ $ ls -l essay.odt
-rw-r--r-- 1 user users 73414 Jan 5 12:01 essay.odt
Zwróć uwagę, że data zmiany metadanych pliku jest ustawiana na bieżącą przy każdej zmianie metadanych, w tym zmianie dat.