Try   HackMD

Ú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:

$ pust-ps () { ps; } ; pust-ps
    PID TTY          TIME CMD
2496176 pts/8    00:00:00 bash
2496266 pts/8    00:00:00 ps
$ 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. 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.

Nápověda/doplnění

Velice podobný program v Pythonu, který taky nespouštěj, je:

# Nespouštět – počítač zamrzne!
import os

while True:
    os.fork()

Správa uživatelů

Jak se pouští sudo

Nakresli diagram toho, jak se pouští procesy pro příkaz sudo ps:

$ 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?

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:

$ 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:

$ 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č?

$ 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.