Dnes se podíváme na uživatelské účty. Na Linuxovém systému může mít účet více uživatelů.
Dokonce může systém používat několik uživatelů zároveň. U počítačů, které mají jednu obrazovku a jednu klávesnici se to moc nevidí, ale i existují systémy s více obrazovkami – a častěji servery bez obrazovky, kam se uživatelé připojují vzdáleně. Nebo se živí uživatelé nepřipojují a procesy běží jejich jménem automaticky.
Každý uživatel má své uživatelské jméno.
To svoje jsi zadávala při instalaci systému.
Když chceš zjistit jaké je, můžeš použít příkaz whoami:
$ whoami
hanka
Už víš, že u procesů a souborů je vždy uvedeno jméno uživatele.
Většinou je to tvoje uživatelské jméno nebo root, ale občas zahlédneš i jiné.
$ ps -Af | tail -n6
hanka       2835    2474  0 11:02 pts/1    00:00:00 bash
root        3179       2  0 11:02 ?        00:00:00 [kworker/0:3-cgroup_destroy]
root        3239     972  0 11:04 ?        00:00:00 systemd-userwork
root        3242     972  0 11:05 ?        00:00:00 systemd-userwork
root        3243     972  0 11:05 ?        00:00:00 systemd-userwork
hanka       3288    2835  0 11:06 pts/1    00:00:00 ps -Af
$ ls -l | tail -n6
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Obrázky
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Plocha
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Stažené
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Šablony
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Veřejné
drwxr-xr-x. 1 hanka hanka   0  4. říj 16.35 Videa
$ ls -l /usr/bin | tail -n6
-rwxr-xr-x. 1 root root       70416 29. led  2021 zipnote
-rwxr-xr-x. 1 root root       66256 29. led  2021 zipsplit
-rwxr-xr-x. 1 root root        2210 26. led  2021 zless
-rwxr-xr-x. 1 root root        1846 26. led  2021 zmore
-rwxr-xr-x. 1 root root        4557 26. led  2021 znew
lrwxrwxrwx. 1 root root           6 17. bře  2021 zsoelim -> soelim
U souborů, ve výstupu ls -l, je jméno zopakováno.
První jméno označuje vlastníka souboru; druhé je jméno skupiny
která soubor vlastní.
Každý uživatel má svoji vlastní skupinu, která se používá když
něco není potřeba sdílet skupinově.
Uživatel může být členem více skupin. Podívej se, v jakých skupinách jsi ty:
$ groups
hanka wheel
Skupina wheel je pro uživatele, kteří mají přístup k admistrátorským
oprávněním. Můžou tak např. přidávat další uživatele.
Příkaz groups bere i argumenty – uživatele, jejichž skupiny vypíše.
Koukni se třeba, že uživate root není ve skupině wheel:
$ groups hanka root
hanka : hanka wheel
root : root
Ještě víc informacíti dá příkaz id, který u každého jména
(uživatele nebo skupiny) ukáže i číslo.
Systém používá tyhle čísla.
Jména jsou „pro lidi“ – používají se při výpisech a nastavování.
$ id
uid=1000(hanka) gid=1000(hanka) skupiny=1000(hanka),10(wheel) kontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ id hanka root
uid=1000(hanka) gid=1000(hanka) skupiny=1000(hanka),10(wheel)
uid=0(root) gid=0(root) skupiny=0(root)
Informace o „kontextu“ má co dělat s podsystémem SELinux, používaným pro lepší zabezpečení systému. Pro teď ji ignoruj.
Už víš, že si můžeš dávat vlastní příkazy do ~/bin.
Tenhle adresář je ve tvém domovském adresáři, do kterého ostatní uživatelé
počítače nemají přístup.
Kdybys chtěla dát svůj program k dispozici všem uživatelům,
do adresáře /usr/bin/ (nebo jiného sdíleného adresáře v $PATH),
narazíš.
Na podobných sdílených místech nemázádný tvůj proces právo soubory vytvářet,
měnit ani mazat:
$ cp ~/bin/mujprogram /usr/bin/mujprogram
cp: nelze vytvořit obyčejný soubor '/usr/bin/mcd': Operace zamítnuta
$ echo "..." > /usr/bin/mujprogram
bash: /usr/bin/mujprogram: Operace zamítnuta
$ vim /usr/bin/mujprogram   # obdobná chyba nastane při uložení
Když budeš chtít podobně měnit systém, musíš poprosit administrátora systému, aby změny udělal. A když jsi administrátorkou ty, budeš na tyhle změny muset proces pustit pod administrátorským uživatelským účtem. Ten je oddělený od toho obyčejného uživatelského, což má dobrý důvod: je menší šance že systém změníš (nebo zničíš) nechtěně.
Jak to udělat, to si řekneme za chvíli; teď ještě něco k oprávněním.
„Práva“ u souborů zobrazuje ls -l v prvním sloupečku:
$ cd ~/Dokumenty/data-shell/
$ ls -l pizza.cfg
-rw-r--r--. 1 hanka hanka    32 Aug  8  2019 pizza.cfg
Pro ls -l bývá nastavený alias ll, který klidně použij.
Nemusí ale být na všech systémech (a na všech účtech),
proto budu ls -l rozepisovat.
Práva (angl. permissions) jsou součástí módu (angl. mode),
který je zobrazen jako ta zkratkovitá sada symbolů: -rw-r--r--.
Pojďme rozluštit, co to znamená.
První znak udává typ souboru:
- znamená normální soubor;d uvidíš u adresářů;p je roura (pipe), c nebo
d označují „zařízení“ značí jako /dev/null nebo terminály (/dev/tty*),
o odkazech (l) si řekneme později.Po prvním písmenku jsou samotná práva: tři trojice písmen rwx,
kde každé může být nahrazeno pomlčkou: rwx, rw-, r--, -w- apod.
První trojice se vztahuje k vlastníkovi, druhá ke skupině a třetí k ostatním
uživatelům.
Podívejme se napřed na první trojici.
r
#
Když je první písmenko trojice, r, udává právo ke čtení.
Pomlčka znamená, že nemá právo soubor přečíst.
Můžeš si to vyzkoušet příkazem chmod (z angl. change mode, změnit mód):
chmod -r jméno_souboru právo odebere,chmod +r jméno_souboru právo naopak přidá.$ ls -l pizza.cfg
-rw-r--r--. 1 hanka hanka    32 Aug  8  2019 pizza.cfg
$ chmod -r pizza.cfg
$ cat pizza.cfg
cat: pizza.cfg: Operace zamítnuta
$ ls -l pizza.cfg
--w-------. 1 hanka hanka 32 Aug  8  2019 pizza.cfg
$ chmod +r pizza.cfg
$ ls -l pizza.cfg 
-rw-r--r--. 1 hanka hanka 32  8. srp  2019 pizza.cfg
Všimni si že právo ke čtení se vztahuje na obsah souboru. Jméno, mód, vlastníka a ostatní vlastnosti souboru můžeš zjistit i bez práva ke čtení obsahu.
w
#
Druhé písmenko udává právo ke čtení.
Když je zde místo w pomlčka, vlastník do souboru nesmí zapisovat.
Toto oprávnění se dá změnit pomocí chmod -w a chmod +w:
$ chmod -w pizza.cfg
$ ls -l pizza.cfg
-r--r--r--. 1 hanka hanka 32  8. srp  2019 pizza.cfg
$ echo Nový řádek >> pizza.cfg
bash: pizza.cfg: Operace zamítnuta
$ chmod +w pizza.cfg
$ ls -l pizza.cfg
-rw-rw-r--. 1 hanka hanka 32  8. srp  2019 pizza.cfg
$ echo Nový řádek >> pizza.cfg
$ cat pizza.cfg
alpha: 0.5
beta: 0.2
gamma: off
Nový řádek
x
#
Poslední z trojice je právo spuštění, x, které už znáš:
pomocí chmod +x označuješ spustitelné soubory.
$ ./pizza.cfg 
bash: ./pizza.cfg: Operace zamítnuta
$ chmod +x pizza.cfg 
$ ls -l pizza.cfg
-r-xr-xr-x. 1 hanka hanka 32  8. srp  2019 pizza.cfg
$ ./pizza.cfg  # Soubor bez "shebangu" se Bash pokusí spustit jako skript
./pizza.cfg: řádek 1: alpha:: příkaz nenalezen
./pizza.cfg: řádek 2: beta:: příkaz nenalezen
./pizza.cfg: řádek 3: gamma:: příkaz nenalezen
$ chmod -x pizza.cfg 
$ ls -l pizza.cfg
-r--r--r--. 1 hanka hanka 32  8. srp  2019 pizza.cfg
Všechny soubory s příkazy jsou spustitelné:
$ type cat gedit
cat je zahashován (/usr/bin/cat)
gedit je /usr/bin/gedit
$ ls -l /usr/bin/cat
-rwxr-xr-x. 1 root root 37032 26. bře  2021 /usr/bin/cat
$ ls -l /usr/bin/gedit
-rwxr-xr-x. 1 root root 16072  2. dub  2021 /usr/bin/gedit
x u adresářů
#
Zvláštní význam má právo x u adresářů, u kterých je téměř vždy nastaveno.
Když se budeš dívat na adresáře, bude se hodit přepínač -d,
se kterým ls místo obsahu adresáře popíše adresář samotný.
Vyzkoušej si:
$ ls -l .
$ ls -l -d .
drwxr-xr-x. 8 hanka hanka 4096  6. říj 23.40 .
A co znamená to x?
To je právo adresář procházet, tedy přistupovat k tomu, co je v něm.
Když x pro nějaký adresář odebereš, přijdeš o právo jakkoli pracovat se
soubory (a podadresáři) v něm:
$ chmod -x .
$ ls .
ls: nelze přistoupit k '.': Operace zamítnuta
$ cat pizza.cfg
cat: pizza.cfg: Operace zamítnuta
$ cat ~/Dokumenty/data-shell/pizza.cfg
cat: /home/hanka/Dokumenty/data-shell/pizza.cfg: Operace zamítnuta
To se vztahuje i na adresář . (neboli ./.), takže nejde jen tak
aktuálnímu adresáři právo x zpět přidat:
$ chmod +x .
chmod: nelze přistoupit k '.': Operace zamítnuta
V tomhle případě můžeš do nadřazeného adresáře – to ještě smíš.
Z něj sice nemůžeš “zpět” do data-shell:
$ cd ..
$ cd data-shell/
bash: cd: data-shell/: Operace zamítnuta
Ale můžeš pro data-shell přidat právo x a situaci vrátit „do normálu“:
$ chmod +x data-shell
$ cd data-shell/
$ ls
creatures  diplomka_archiv  north-pacific-gyre  plan.txt   writing
data       molecules        pizza.cfg           solar.pdf
$ ls -ld . pizza.cfg
drwxr-xr-x. 8 hanka hanka 4096  6. říj 23.40 .
-r--r--r--. 1 hanka hanka   32  8. srp  2019 pizza.cfg
'rwx' se opakuje 3× – pro vlastníka, skupinu a ostatní.
Vlastník i skupina, která soubor vlastní, jsou ve výstupu ls -l vidět:
$ ls -l pizza.cfg
-rw-rw-r--. 1 hanka hanka 36  8. lis 14.59 pizza.cfg
Práva pro konkrétní kategoriii z těchto tří můžeš nastavit tak, že příkazu
chmod dáš před + nebo - jedno z písmen
u (user – uživatel, vlastník), g (group – skupina)
a o (others, ostatní) nebo a (all – všechny tři). Například:
$ chmod u+x .
$ chmod g+x .
$ chmod o+x .
$ chmod a-x .
Kromě + a - rozumí chmod symbolu =, které práva nastaví na danou sadu
(tj. zadaná přidá a nezadaná odebere).
A několik specifikací se dá spojit pomocí čárky, takže můžeš konkrétní práva nastavit třeba takto:
$ chmod u=rw,g=r,o= pizza.cfg
Když so podíváš na svůj domovský adresář, zjistíš že to do něj nikdo jiný
nevleze: rwx je tu jen pro tebe.
$ ls -ld ~
drwx------. 25 hanka hanka 4096  2. lis 14.31 /home/hanka
Když tahle práva odebereš i sobě (chmod u-rwx ~),
bude tvůj systém podobně nepoužitelný jako kdyby chtěl tvůj uživatelský učet
používat někdo jiný.
Běžící procesy se neukončí, ale můžeš mít problém například
otevřít nový terminál nebo prohlížeč.
Příkaz chmod u+rwx ~ ale vše vrátí do pořádku.
Skupinu můžeš u souboru který vlastníš změnit příkazem
chgrp (z angl. change group, změň skupinu):
$ chgrp wheel pizza.cfg
$ ls -l pizza.cfg
--w-rw----. 1 hanka wheel 36  8. lis 14.59 pizza.cfg
To ovšem pro tebe nic nezmění.
Vždy totiž platí jen první trojice rwx, která se na soubor vztahuje, takže:
rwx platí pro vlastníka,rwx platí pro všechny ze skupiny kromě vlastníka,rwx platí pro všechny ostatní – ty, kdo nejsou ani vlastníkem ani
nepatří do skupiny.A vlastníka souboru změnit nemůžeš.
Tuhle operaci bys totiž nemohla vzít zpět
(to by musel provést nový vlastník), takže tohle lze udělat jen
z administrátorského účtu.
Tam k tomu slouží příkaz chown (z angl. change owner, změň vlastníka)
Pojďme se podívat jak se přihlásit pod jiným účtem;
za domácí úkol si pak s chgrp a chown pohraj.
Kdo jsi – tedy pod jakým účtem jsi přihlášena – ti řekne příkaz id:
$ id
Chceš-li se přihlásit pod jiným účtem, můžeš použít příkaz su.
Kdyby na systému existoval uživatel pepa, mohla bys napsat:
$ su pepa
(su je z angl. set user, ale lépe
se to pamatuje jako moravské „od včil su Pepa“).
Pojď si to vyzkoušet s účtem root, který jsi už viděla ve výstupu
ps a ls:
$ su root
Heslo: 
Zjistíš že k účtu root neznáš heslo.
Tak to ukonči pomocí Ctrl+C, zkusíme to jinak.
V nastavení GNOME Shell (tom „klikacím“, z menu vpravo nahoře)
vyber sekci Uživatelé.
Tady můžeš přidávat nové uživatelské účty.
Aktuálně tam bude jen jeden – systémové účty jako root jsou skryté.
Při instalaci systému jsi nastavila, že jsi správce. To znamená že si tvoje procesy můžou zažádat o administrátorská práva; typicky je ale dostanou až po zadání hesla.
Klikni tedy na tlačítko Odemknout a zadej svoje heslo.
Kdykoli se tě systém zeptá na heslo, znamená to že se buď přihlašuješ, nebo dělat něco, co ovlivní celý systém (tj. víc než jen tvůj účet) – a je to tedy potenciálně nebezpečné. Přidání uživatele zas tak nebezpečné není, ale rozhodně to ovlivní víc než jen tvůj účet.
Přes tlačítko Přidat uživatele teď přidej nového uživatele
s uživatelským jménem test1.
Heslo k novému účtu musí být složitější než 1234; zapiš si ho na papír.
Když teď Nastavení zavřeš a otevřeš znovu, možnost měnit ostatní účty budeš muset znovu „odemknout“ a zadat svoje heslo.
Gnome GUI na uživatele.
Jsem administrátor.
Vytvořit nového uživatele test1 – chce to heslo, i když jsem "administrátor".
Co je to administrátor?
Zavřít nastavení, otevřít znovu – chce to heslo znovu. Administrátor – systém mi přidělí oprávnění, když zadám své heslo. „Být“ administrátor chci co nejmíň.
Přepni se teď do příkazové řádky a přepni se na nový účet test.
Když budeš vyplňovat heslo, na obrazovku se nic nevypíše (ani hvězdičky/tečky
jako když zadáváš heslo grafických aplikací).
To je u zadávání hesel do příkazové řádky normální:
$ su test1
Heslo:
$ whoami
test1
Pak se porozhlédni. Zjistíš, že se nezměnil aktuální adresář; dokud v něm budeš, můžeš se dívat na soubory – když už někde „jsi“ systém nekontroluje, jestli tam máš přístup:
$ pwd
/home/hanka/Dokumenty/data-shell
$ ls
creatures  molecules           notes.txt  solar.pdf
data       north-pacific-gyre  pizza.cfg  writing
$ ps -al
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000    1624    1614  0  80   0 - 118849 -     tty2     00:00:00 gnome-sess
4 S     0   11788    2835  0  80   0 - 63928 -      pts/1    00:00:00 su
4 S  1001   11794   11788  0  80   0 - 58240 -      pts/1    00:00:00 bash
4 S  1001   12107   12034  0  80   0 - 56507 -      pts/1    00:00:00 ps
Když se ale přepneš do domovského adresáře uživatele test1, zjistíš,
že se nejde přepnout zpátky:
$ cd
$ pwd
/home/test1
$ cd -
bash: cd: /home/hanka/Dokumenty/data-shell: Operace zamítnuta
Navíc tu chybí adresáře jako Obrázky a Video.
Ty totiž vytváří grafické rozhraní – GNOME – které uživatel test
ještě nespustil:
$ ls
$ ls -a
.   .bash_logout   .bashrc   .xauthf9T9mu
..  .bash_profile  .mozilla  .xauthIdeOEt
Přepni tedy uživatele „graficky“: v menu vpravo nahoře vyber Přepnout uživatele (NE „odhlásit“). Přihláění bude trvat déle – například o vytvoření výše zmíněných adresářů.
Když si teď pustíš Nastavení a budeš chtít odemknout nastavení uživatelů,
bude to po tobě chtít heslo správce, nikoli heslo uživatele test1.
Test totiž nemá právo přidávat účty; na to musí poprosit administrátora.
Přepni se teď zpátky na svůj hlavní účet (přes Přepnout uživatele, ne „odhlásit“).
Zpátky ke konzoli.
Jsi-li v ní stále přihlášena jako test1, napiš exit.
(Příkaz su pouští nový shell; když ho ukončíš, vrátíš se do shellu
ve kterém jsi pustila su.)
$ exit
$ whoami
hanks
Superuživatel root nemá heslo, takže su root nebude fungovat:
$ su root
Zbytek tohoto textu jsou zatím jen zkratkovité poznámky. Dopíšu je pro další běh kurzu.
$ less /etc/passwd
$ less /etc/shadow
$ ls -l /etc/passwd /etc/shadow
Za zmínku stojí superuživatel root, který má zvláštní postavení:
může na systému dělat cokoli.
Oprávnění se na něj nevztahují.
Změnit uživatele může jen administrátor.
Jak tedy funguje su?
$ su test1
$ ps -au
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hanka        1504  0.0  0.1 371584  2812 tty2     Ssl+ 13:37   0:00 /usr/libe...
hanka        1507  1.1  3.3 1723936 67372 tty2    Sl+  13:37   1:03 /usr/libe...
hanka        1570  0.0  0.1 467944  3192 tty2     Sl+  13:37   0:00 /usr/libe...
hanka       15640  0.0  0.3 227968  6084 pts/0    Ss   14:31   0:00 bash
root       18130  0.0  0.4 246780  8444 pts/0    S    15:10   0:00 su test1
test1      18140  0.1  0.2 227404  5396 pts/0    S    15:10   0:00 -bash
test1      18171  0.0  0.1 228432  3980 pts/0    R+   15:10   0:00 ps -a -u
$ type su
su je /usr/bin/su
$ ls -l /usr/bin/su
-rwsr-xr-x. 1 root root 58384 12. úno  2021 /usr/bin/su
Všimni si zvláštních písmenek v módu: rws – to s místo x znamená
setuid, program se spouští s právy vlastníka.
Je tedy jedno kdo su spustí; proces bude mít vždycky práva superuživatele
root, tj. může dělat cokoli.
Program su ale umí dělat jen jednu věc: zeptá na heslo a spustí shell pod
jiným uživatelským účtem.
Programy s módem setuid jsou napsány zvlášť opatrně, aby umožnily opravdu jen to k čemu slouží.
$ exit
$ whoami
hanka
$ ls -l /usr/bin/sudo
$ whoami
hanka
$ sudo whoami
root
$ sudo ps -a -u
$ sudo ll
$ sudo ls -l
$ sudo less /etc/shadow
Jsme ve virtuálním počítači, pojďme ho trochu rozbít:
$ vim /usr/bin/zkouska
$ sudo vim /usr/bin/zkouska
Když jsem (přes sudo) superuživatelem, su se mě neptá na heslo:
$ sudo su test1
Ale sudo funguje to jen pro administrátory (wheel):
$ sudo su hanka
Uživatel pro kterého funguje sudo se ovšem může přihlásit jako superuživatel!
$ sudo su root
# pwd
# exit
Všimni si výzvy (promptu) # místo $ – občas ho najdeš v tutoriálech;
znamená, že musíš být root.
Dnes se častěji používá sudo před každým příkazem – být administrátorem
je nebezpečné.
Navíc sudo se dá nastavovat – pro každého uživatele říct, jaké příkazy
je oprávněn přes sudo spouštět.
Potřebuješ-li pustit příkaz jako root,
všimni si, že se sudo neptá na heslo pokaždé.
Pro konkrétní terminál si ho vždy nějakou dobu pamatuje, a to i mezi spuštěními.
Potřebuješ-li opravdu pustit nový shell jako root
(např. zachraňuješ počítač),
lepší než sudo su root je sudo -i (interaktivní):
$ sudo -i
# pwd
# exit
Další věc, kterou může dělat jen administrátor, je změna hesla.
Existuje ale příkaz passwd který heslo mění – a má příznak setuid.
$ type passwd
passwd je /usr/bin/passwd
[test1@fedora data-shell]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32712 30. led  2021 /usr/bin/passwd
Zkus si změnit heslo na něco jednoduchého:
$ passwd
Změna hesla uživatele hanka.
Current password: 
Nové heslo: 
ŠPATNÉ HESLO: Heslo je kratší než 8 znaků
passwd: Chyba manipulace s autentizačním tokenem
Nejde to! Stejně tak nesmíš měnit heslo jiného uživatele:
$ passwd test1
passwd: Pouze root smí zadat uživatelské jméno.
Ale root může vše!
$ sudo passwd test1
Změna hesla uživatele test1.
Nové heslo: 
ŠPATNÉ HESLO: Heslo je kratší než 8 znaků
Opakujte nové heslo: 
passwd: všechny autentizační tokeny byly úspěšně změněny.
(Hláška ŠPATNÉ HESLO se sice objeví, ale je jen informační – heslo může
být klidně jednopísmenné.)
$ useradd test2
$ sudo useradd test2
$ sudo ls -l /home/test2
$ sudo ls -al /home/test2
$ sudo ls -al ~test2
$ cat /etc/passwd
$ userdel test2
$ sudo ls -al ~test2
$ sudo ls -al /home/test2
$ sudo useradd test2
$ groups
$ groups test1
$ sudo groupadd editors
$ sudo usermod test1 -aG editors
$ groups test1
$ sudo usermod hanka -aG editors
$ groups hanka
$ groups
Uživatel a skupiny pro daný proces jsou vždy nastavené při přihlášení. Aby se změny členství ve skupinách projevily, musíš se znovu přihlásit:
$ groups
$ su hanka
$ groups
$ ps a