Úloha 2 - Vzkaz od kolegy
Představme si, že pracujeme jako sysadmin (správce sítě) v nějaké firmě a náš kolega, který je zrovna na dovolené, nám dal vědět, že narazil na problém a máme se připojit na jeho počítač. Nalezneme tam prý podrobnosti v souboru.
Na systému se v domovské složce nacházel soubor, jeho obsah však zní takto:
Ahoj, slyšel jsem, že jsou prý útoky na firmu, tak jsem původní
vzkaz schoval v systému. Jestli jsi to ty, tak ho zvládneš
najít.
P.S.: Má koncovku .md
Jak najít soubor v systému?
slouží nám k tomu všestranný příkaz find
, potřebujeme najít podle názvu, na to nám slouží parametr -name
find / -name "*.md"
- Za
find
nejprve určíme složku, ve které má hledat, my chceme prohledat vše, tedy celý systém, proto/
. - Následují různé přepínače a další, my hledáme podle jména takže využijeme přepínač
-name
a výraz"*.md"
, hvězdička ve výrazu je tzv. wildcard neboli cokoliv, napříkladreadme.md
,doc.md
nebolicence and changelog.md
. Naopak třebareadme.docx
by takový výraz nevyhledal.
Jenže když spustíme tento příkaz dostaneme spoustu Access Denied
errorů, jak se jich zbavit, jak je odfiltrovat?
Standard streams (stdin, stdout, stderr)
Každý program spustěný v konzolovém prostředí (CLI) komunikuje pomocí třech datových kanálů, proudů, ang. stream.
stream | číslo | fullname | k čemu slouží? | |
---|---|---|---|---|
stdin | 0 | Standard Input | Vstupní kanál, například při zadávání hesla u sudo nebo při ` |
lessse data odesílají programu skrz stdin`. |
stdout | 1 | Standard Output | Výstupní kanál, co program vypíše skrz tento kanál se zobrazí na konzoli případně se dá přeposlat jinému programu pomocí pipeingu. | |
stderr | 2 | Standard Error | Podobný jako stdout ale používá se pro chybové hlášky. |
Přesměrování do souborů
Pomocí >
můžeme přesměrovat některý ze streamů do souboru, například:
find . -name "*.md" > output.txt
Toto vytvoří (pokud existuje tak vymaže a vytvoří nový) soubor output.txt
a do něj přesměruje stdout
, který vrátí find
(neboli zapíše do souboru, to co by nám normálně program vypsal do konzole)
echo "Hello world!" >> output.txt
Toto přidá na nový řádek do souboru (vytvoří pokud nexxistuje) výstup příkazu echo
.
Při přesměrování můžeme také přesměrovat např. jenom stderr
find . -name "*.md" &2> output.txt
Všimněte si &2
, dvojka je právě číslo stderr
.
Zahození streamu
Pokud nemáme zájem o výstup stderr
a překáží nám v konzoli můžeme ho přesměrovat do /dev/null
, to je zařízení (soubor), který slouží přesně k tomuto účelu, cokoliv do něj zapsáno se smaže.
find . -name "*.md" &2> /dev/null
Tak se můžeme zbavit errorů a vidíme jen úspěšně nalezené soubory, našli jsme /etc/vzkazy/vzkaz001.md
, vypišme si jeho obsah pomocí cat /etc/vzkazy/vzkaz001.md
.
Ahoj,
nefunguje mi internet, zkoušel jsem dát `ping google.com`,
ale nejde mi to, podle mě budou asi špatně nastavené IP
adresy, můžeš se na to podívat?
Díky.
První krok při zkoumání takovéto záležitosti je vždy zreprodukovat problém, zkusme tedy ping
nout na google.com
:
user@vps:~$ ping google.com
bash: ping: command not found
Vypadá to, že příkaz ping
není na našem systému nainstalován, jak ho nainstalujeme?
Balíčkovací systém (Package Managers)
Zatímco na Windows jsme zvyklí instalovat programy vyhledáním instalačního .exe
někde na internetu, na Linuxu je vše jinak, jednodušeji a bezpečněji.
Balíček (package)
Je jednoduchý archív (zip
, tar
, ..), který obsahuje soubory potřebné k instalaci programu, instrukce pro package manager k instalaci a metadata (např.: autor, verze, název programu, závislosti na jiných programech)
Repozitář
Repozitář (ang. repository, nebo repo zkráceně) je server obvykle spravovaný týmem, který stojí za distribucí (Ubuntu, Arch, Fedora, ...), obsahuje balíčky programů, které se v něm dají vyhledávat.
Package Manager (pacman, apt, yum, yay, pm)
Package Manager, správce balíčků, je program který nám umožňuje instalovat, odinstalovávát, vyhledávat programy/balíčky v repozitáři.
Konkrétní správce balíčků se může lišit distribuce od distribuce, nejčastější příkazy pro instalaci jsou:
sudo apt install <nazev balicku>
sudo yum install <nazev balicku>
sudo pacman install <nazev balicku>
yay install <nazev balicku>
Správce balíčků nejen, že stáhne a nainstaluje automaticky balíček, ale také zkontroluje jeho závislosti, pokud vyžaduje balíček ještě jiný balíček (například nějakou knihovnu), nainstaluje ji také automaticky.
Obvykle je při instalaci potřeba před příkaz dát
sudo
a tím spustit příkaz s administrátorkýmroot
oprávnění.Často je potřeba před instalací dát
sudo apt update
, či jinou alternativu podle Vaší distribuce, pro aktualizování lokálního repozitáře.Zkusme nainstalovat
ping
:sudo apt install ping
```text Package ping is a virtual package provided by: inetutils-ping 2:1.9.4-11 iputils-ping 3:20190709-3 You should explicitly select one to install.
E: Package 'ping' has no installation candidate
Instalace selhala, proč? Protože někdy se balíčky jmenují jinak, než samotný příkaz, tady nám `apt` radí abychom nainstalovali `iputils-ping` použitím `apt install iputils-ping`.
Nyní když zkusíme `ping google.com` vidíme, že vše funguje, jak má.
```text
PING google.com (216.58.205.238) 56(84) bytes of data.
64 bytes from fra15s24-in-f238.1e100.net (216.58.205.238): icmp_seq=1 ttl=117 time=2.0 ms
64 bytes from fra15s24-in-f238.1e100.net (216.58.205.238): icmp_seq=1 ttl=117 time=8.0 ms
64 bytes from fra15s24-in-f238.1e100.net (216.58.205.238): icmp_seq=1 ttl=117 time=13.0 ms
Příkaz
ping
běží do nekonečna pokud mu nenastavíme-c <počet požadavků>
, jeho běh lze přerušit stisknutímCtrl + C
.
Tak nakonec kolega byl sám pomatený a důvodem nebyly špatně nastavené IP adresy, ale jen nenainstalovaný balíček iputils-ping
.