Úvod do Linuxu II
Co jsme dnes dělali
Shell skripty
Doteď jsme příkazy zadávali ručně jeden po druhém, případně jsme je kombinovali pomocí rour. Můžeme je ale psát do skriptů, které budou uložené v souboru a budeme je moct spouštět opakovaně. Práce v shellu se orientuje hlavně kolem souborů a práce s textem a daty.
Pro dnešní úlohy a pochopení tématu rozhodně doporučuji zeptat se nějaké formy inteligence (ať už umělé, nebo si přečíst nějaké zdroje). Vypíchl bych tyto:
- https://www.root.cz/clanky/programovani-v-bash-shellu/
- https://www.abclinuxu.cz/clanky/navody/bash-i
- https://tldp.org/LDP/Bash-Beginners-Guide/html/
Také doporučuji mít vedle terminálu po celou dobu otevřený super cheatsheet na syntax: https://devhints.io/bash
Základní syntax v Shellu
Nejdříve na Linuxovém stroji otevřete nějaký soubor, většinou jim dáváme
příponu .sh. Pro otevření můžete použít textový editory micro. Takže např.
micro pozdrav.sh.
Do souboru napište
#!/bin/bash
echo "Ahoj!"
První řádek říká systému, jak se má skript spouštět (tzv. shebang, teď mu tedy říkáme, že má obsah interpretovat jako shellový skript). Poté následuje řádek s výpisem textu.
Abychom mohli soubor spustit, musíme ho nejdřív označit jako spustitelný. To
uděláme příkazem chmod +x pozdrav.sh. Skript následně spustíme jako ./pozdrav.sh.
V programech můžeme používat proměnné:
#!/bin/bash
jmeno="David"
echo "Ahoj, $jmeno!"
Program může přijímat argumenty:
#!/bin/bash
echo "Prvni argument: $1"
echo "Druhy argument: $2"
Zkuste tento program zavolat jako ./pozdrav.sh ahoj svete.
V programu můžeme používat podmínky:
#!/bin/bash
if [ $1 -gt 10 ]; then
echo "Číslo je větší než 10"
else
echo "Číslo je menší nebo rovno 10"
fi#!/bin/bash
if [ -f "soubor.txt" ]; then
echo "Soubor soubor.txt existuje a je to soubor"
else
echo "Neexistuje"
fi
Negace podmínky se zapíše takto:
#!/bin/bash
if [ ! -f "soubor.txt" ]; then
echo "Neexistuje"
fi
Do hranatých závorek určující podmínku se toto dá napsat mnohem více. Podívejte
se to man test, případně do cheatsheetu.
Případně for cykly:
#!/bin/bash
for soubor in *.txt; do # Iteruj skrz vsechny soubory v tomto adresari ktere konci .txt
echo "Zpracovavan: $soubor"
doneÚlohy
Zahřívačka
Napište skript info.sh, který vypíše
- aktuální datum a čas (příkaz
date), - aktuální adresář (příkaz
pwd), - a počet souborů v aktuálním adresáři.
Analýza logu
Z minulé hodiny máte k dispozici access.log soubor. Napište skript
analyze.sh, který přijme jako argument cestu k log souboru a vypíše
- celkový počet požadavků,
- počet unikátních IP adres,
- pět nejčastějších IP adres
- a počet požadavků, které skončily chybou 404.
Nejspíš budete potřebovat uložit výstup programu do proměnné. To se dá udělat takto:
soubory=$( ls -l | sort )
echo "Soubory v adresari: $soubory"
Také ověřte, že byl argument skutečně zadán:
if [ -z "$1" ]; then
echo "Pouziti: $0 <cesta_k_logu>"
exit 1
fiHlídač IP adres
Napište skript suspicious.sh, který
- přijme jako argument cestu k log souboru a práh (číslo),
- najde všechny IP adresy, které mají více požadavků, než je práh
- a pro každou takovou IP adresu vypíše
- samotnou adresu,
- celkový počet požadavků
- a počet kolik z nich skončilo chybou 404.
Bonus: Upravte skript tak, aby výsledky zapsal do souboru report_<datum>.txt, kde
<datum> je aktuální datum ve formátu YYYY-MM-DD. Použijte příkaz date.