# Úkoly – Bash III & Správa uživatelů
*Neboj se experimentovat. Správným řešením těchto úkolů si systém nerozbiješ a kdyby bylo hodně špatně, virtuální počítač si můžeš vždycky připravit nový.*
## Bash III – Spouštění procesů
### Bashová funkce na pozadí
Na lekci jsme si říkali, že jedna z výhod funkcí v Bashi je to, že se vykoná v procesu Bashe, který ho spouští. To ale není pravda úplně vždycky.
Zkus vysvětlit rozdíl mezi těmito příkazy:
```console
$ pust-ps () { ps; } ; pust-ps
PID TTY TIME CMD
2496176 pts/8 00:00:00 bash
2496266 pts/8 00:00:00 ps
```
```console
$ pust-ps () { ps; } ; pust-ps &
[1] 2496277
...$ PID TTY TIME CMD
2496176 pts/8 00:00:00 bash
2496277 pts/8 00:00:00 bash
2496278 pts/8 00:00:00 ps
```
Nakresli pro oba příkazy diagramy toho, jak se jednotlivé procesy navzájem spouštějí.
(Ukázky diaramů jsou i v [materiálech](https://naucse.python.cz/2020/linux-admin/linuxadmin/process-execution/). Stačí je samozřejmě jen načrtnout tužkou.)
### Výbušná změť symbolů
(Tohle zadání navazuje na předchozí úkol. A je asi dost složité; klidně přeskoč.)
Existuje jeden známý příkaz, který *nespouštěj*. Tvým úkolem bude zjistit, co dělá.
To můžeš zkusit udělat třemi způsoby:
* Najdeš to na internetu, čímž se ochudíš o to, že na řešení přijdeš sama :)
* Příkaz spustíš. To nedělej: příkaz je známý tím, že umí „shodit“ celý systém. Některé novější systémy se proti tomu umí více či méně bránit, ale stejně – nepokoušej štěstí.
(Na druhou stranu – nestane se nic horšího než budeš muset vypnout virtuální počítač.)
* Projdeš si poznámky o tom, co v Bashi dělají různé symboly, a příkaz dešifruješ.
Příkaz je `:(){ :|:& };:` – s tím že znak`:` není v Bashi speciální, funguje stejně jako třeba písmeno `f`. Nakresli diagram toho, jak se po spuštění tohoto příkazu spouštějí procesy.
<details>
<summary>Nápověda/doplnění</summary>
Velice podobný program v Pythonu, který *taky nespouštěj*, je:
```python
# Nespouštět – počítač zamrzne!
import os
while True:
os.fork()
```
</details>
## Správa uživatelů
### Jak se pouští sudo
Nakresli diagram toho, jak se pouští procesy pro příkaz `sudo ps`:
```console
$ sudo ps
PID TTY TIME CMD
2501386 pts/9 00:00:00 sudo
2501388 pts/9 00:00:00 ps
```
### Sudo zapomíná
*(`sudo` ti dává oprávnění, ale i zodpovědnost. Nauč se před každým použitím `sudo` přečíst spouštěný příkaz a zamyslet se, jestli ho opravdu chceš spustit. Ale opět, neboj se experimentovat – na virtuálním počítači není co zkazit.)*
Co by měl dělat tento příkaz?
```console
ll /var/db/sudo/lectured/
```
Příkaz ale pod běžným uživatelským účtem nefunguje; potřebuješ `sudo ll /var/db/sudo/lectured/`. To ale taky nefunguje. Proč? Jak to spravit?
* Jaké soubory jsou v `/var/db/sudo/lectured/`? Komu patří? Jak jsou velké?
* Jaké soubory jsou v `/var/run/sudo/ts`? Komu patří? Jak jsou velké? Kdo k nim má jaká práva?
* Jak by vypadal příkaz, který smaže „tvůj“ soubor v `/var/run/sudo/ts`?
Když spustíš příkaz `sudo`, zeptá se tě na heslo. Když ho spustíš podruhé (ve stejném terminálu), už se neptá – pamatuje si, že jsi heslo před chvilkou zadala.
Vyzkoušej si ale, že tohle nefunguje s příkazem pro smazání „tvého“ souboru v `/var/run/sudo/ts`. Když ho pustíš několikrát za sebou, `sudo` se vždycky znovu zeptá na heslo.
* Proč?
* Zadej tyhle příkazy:
* Smaž „svůj“ soubor z `/var/db/sudo/lectured/`.
* Smaž „svůj“ soubor z `/var/run/sudo/ts`.
* Spusť `sudo echo`.
A odpověz:
* Co je u `sudo echo` jinak?
* K čemu slouží soubory ve `/var/db/sudo/lectured/`?
### Sudo nefunguje?!😿
Na lekci jsme vytvořili soubor, který patří superuživateli `root`:
```console
$ sudo nano test.root # ... něco napsat, uložit
$ ls -l test.root
-rw-r--r--. 1 root root 0 Nov 3 20:23 test.root
```
Do takového souboru jako běžný uživatel nemůžeš nic zapsat:
```console
$ echo ... > test.root
bash: test.root: Operace zamítnuta
```
Řešením problémů s oprávněním bývá dát před příkaz `sudo` (samozřejmě po tom, co si příkaz pořádně přečteš a ujistíš se že mu rozumíš a fakt ho chceš provést).
V tomhle případě to ale nefunguje – proč?
```console
$ sudo echo ... > test.root
bash: test.root: Operace zamítnuta
```
## Administrativnější
### Zápis
Ať máme přehled, zadej prosím do tabulky s papírkama:
* jaký software používáš na virtualizaci (Virtualbox/Gnome Boxes/...)
* systém, ve kterém spouštíš virtuální počítač (Windows/Mac/Linux/...)
### Otázky
Příště má být opakovací hodina.
Napadne-li tě nějaká otázka, napiš ji do Etherpadu.