# Ú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.