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