Linux je soubor operačních systémů založených na open-source jádře, které v roce 1991 vytvořil Linus Torvalds
Nejrozšířenějšími Linuxovými distribucemi jsou:
V různých distribucích se často liší:
- balíčkovací systémy (např.
apt,yum,pacman,dnf) - desktopové prostředí (např.
GNOME,KDE,XFCE,LXDE,i3) - umístění konfiguračních souborů
- nástroje pro správu systému
- podporované balíčky a verze
- některé distribuce mají stabilní verze balíčků -
stablea získávají pouze bezpečnostní aktualizace (např.Debian) - jiné distribuce mají nejnovější verze balíčků -
rolling release/bleeding edgea získávají nejnovější funkce a opravy téměř okamžitě (např.Arch Linux)
- některé distribuce mají stabilní verze balíčků -
- ...
Instalátory distribucí pomáhají s
- rozdělením disku
- nastavením
bootloaderu - výběrem desktopového prostředí
- výběrem softwaru, který se má nainstalovat
- konfigurací sítě
- vytvořením uživatelů
- ...
Na serverových systémech se často používají distribuce bez desktopového prostředí, protože desktopové prostředí zabírá zbytečně mnoho výpočetních zdrojů a snižuje bezpečnostní úroveň systému
Na Coderových instaních dostáváte přístup do Ubuntu serveru, který je předinstalován a přednastaven pomocí nástroje cloud-init
Nemusíte se tedy starat o instalaci operačního systému, ale můžete se okamžitě pustit do práce
Nastartuje si nový ubuntu workspace přes Coder
Do domovského adresáře si nakopírujeme několik souborů, se kterými budeme pracovat
cp /etc/hosts .
cp /etc/hostname .
sudo cp /var/log/dmesg .ls je základní příkaz pro výpis obsahu adresáře
Vyzkoušejte si vypsat obsah aktuálního adresáře
lsPokud jste se pouze přihlásili do systému, měli byste vidět několik souborů a adresářů ve vašem domovském adresáři
Všechny úkoly v tomto worshopu vypracujte pouze za pomocí manuálových stránek
Jak zobrazit skryté soubory?
Řešení
ls -aJak zobrazit obsah adresáře s podrobnými informacemi?
Řešení
ls -lJak zobrazit obsah adresáře s podrobnými informacemi a skrytými soubory?
Řešení
ls -laJak zobrazit obsah adresáře s podrobnými informacemi a skrytými soubory, seřazený podle data vytvoření?
Řešení
ls -latJak zobrazit obsah adresáře s podrobnými informacemi a skrytými soubory, seřazený podle velikosti souborů sesestupně (největší soubory nahoře)?
Řešení
ls -lSJak zobrazit obsah adresáře s podrobnými informacemi a skrytými soubory, seřazený podle velikosti souborů vzestupně (nejmenší soubory nahoře)?
Řešení
ls -lSrJak zobazit velikost souborů v MB, případně v GB - v lidsky čitelné formě?
Řešení
ls -lhJak zobrazit místo uživatele a skupiny, UID a GID vlastníka souboru?
Řešení
ls -lncd je základní příkaz pro změnu aktuálního adresáře (change directory)
V shellech existují některé speciální adresáře:
.- aktuální adresář..- nadřazený adresář~- domovský adresář-- předchozí adresář/- kořenový adresář
Vyzkoušejte si změnit aktuální adresář na /etc
cd /etcA vylistujte obsah tohoto adresáře
lsJak se dostanete zpět do domovského adresáře?
Řešení
cdnebo
cd ~Předpokládejme, že si nepamatujete cestu do adersáře, kde jste před chvílí byli, jak se tam dostanete?
Řešení
cd -Jak se dostanete do adresáře .ssh v domovském adresáři?
Řešení
cd ~/.sshJak se dostanete do nadřazeného adresáře?
Řešení
cd ..Předpokládejme, že jste v domovském adresáři
V jakém adresáři se budete nacházet po spuštění následujícího příkazu?
cd .ssh/../.config/../Řešení
Stále v domovském adresáři
pwd je základní příkaz pro vypsání aktuálního adresáře (print working directory)
Jděte do domovského adresáře a vypište aktuální adresář
cd
pwdJaký je výstup příkazu pwd?
Řešení
/home/<username>mkdir je základní příkaz pro vytvoření adresáře (make directory)
Vytvořte si adresář workshop v domovském adresáři
cd
mkdir workshopJak zjistíte, že adresář byl vytvořen?
Řešení
lsJak vytvoříte adresář ~/workshop/my/very/nested/directory?
Řešení
mkdir -p ~/workshop/my/very/nested/directoryrmdir je bezpečnější verze příkazu rm, který slouží k odstranění prázdného adresáře (remove directory)
Pokud adresář není prázdný,
rmdirskončí chybou, proto je považován za bezpečnější než klasickýrmpříkaz
Odstraňte adresář ~/workshop/my/very/nested/directory
rmdir ~/workshop/my/very/nested/directoryJak zjistíte, že adresář byl odstraněn?
Řešení
ls ~/workshop/my/very/nested/directoryVýsledek by měl vypada takto
ls: cannot access '/home/<username>/workshop/my/very/nested/directory': No such file or directory
rm je základní příkaz pro odstranění souboru nebo adresáře (remove)
Než ale začneme odstraňovat, musíme si něco vytvořit
mkdir -p ~/workshop/my/very/nested/directory
touch ~/workshop/my/very/nested/directory/file.txt
touch ~/workshop/my/very/file{1..5}.txt
sudo touch ~/workshop/my/very/file6.txtPrázdné soubory lze vytvořit pomocí příkazu
touch
Pomocí
{1..5}jsme vytvořili souboryfile1.txt,file2.txt,file3.txt,file4.txt,file5.txtVíce o shellových expanzích bude níže
Pokud nyní zkusíme odstranit adresář ~/workshop/my/very/nested/directory pomocí rmdir, skončíme chybou
rmdir ~/workshop/my/very/nested/directoryrmdir: failed to remove '/home/<username>/workshop/my/very/nested/directory': Directory not empty
Pokud použijeme rm na odstranění adresáře, dostanema ale jinou chybu
rm ~/workshop/my/very/nested/directoryrm: cannot remove '/home/<username>/workshop/my/very/nested/directory': Is a directory
rm slouží primárně pouze k odstranění souborů, nikoliv adresářů
Jak odstraníte adresář ~/workshop/my/very/nested/directory, společně s jeho obsahem?
Řešení
rm -r ~/workshop/my/very/nested/directoryJak odstraníte všechny soubory v ~/workshop/my/very/ a také samotný adresář?
Řešení
rm -r ~/workshop/my/veryMinulý příkaz se nás zeptal na potvrzení, zdali chceme smazait i soubor file6.txt, jelikož je vlastněný uživatelem root
rm: remove write-protected regular empty file '/home/<username>/workshop/my/very/file6.txt'?
Vytvořme soubor znovu
mkdir -p ~/workshop/my/very
sudo touch ~/workshop/my/very/file6.txtJak odstraníte všechny soubory v ~/workshop/my/very/ a také samotný adresář, aniž by se vás systém ptal na potvrzení?
Řešení
rm -rf ~/workshop/my/verycp je základní příkaz pro kopírování souborů a adresářů (copy)
Vytvořte si kopii souboru /etc/passwd do domovského adresáře
Řešení
cp /etc/passwd ~Jak zjistíte, že soubor byl úspěšně zkopírován?
Řešení
ls ~Případně můžete porovnat velikost souborů nebo provést kontrolní součet
Jak zkopírujete obsah adresáře (i podadresářů) /var/log/ do adresáře ~/logs?
Řešení
cp -r /var/log ~/logsNa některé soubory a adresáře nebudete mít dostatečná práva, ale pro naše účely to nevadí
mv je základní příkaz pro přesunutí souborů a adresářů (move)
Velmi podobný příkazu cp, ale na rozdíl od něj neprovádí kopii, ale pouze přesun a tedy nezanechává původní soubor.
Používá se také na přejmenování souborů a adresářů
Jak přejmenujete soubor ~/logs/dpkg.log na ~/logs/dpkg.log.old?
Řešení
mv ~/logs/dpkg.log ~/logs/dpkg.log.oldJak přejmenujete adresář ~/logs na ~/log?
Řešení
mv ~/logs ~/logcat je základní příkaz pro výpis obsahu souborů (concatenate)
Vyzkoušejte si vypsat obsah souboru /etc/passwd
cat /etc/passwdHlavním účelem cat je přečtění několika souborů a jejich spojení do jednoho výstupu
Jak zobrazíte obsah souborů /etc/passwd a /etc/hostname dohromady?
Řešení
cat /etc/passwd /etc/hostnameNicméně v praxi se často setkáte z tím, že se
catpoužívá pouze na přečtení obsahu jednoho souboru a následně se s tímto obsahem pracuje pomocí jiných příkazů
less a more jsou základní příkazy pro postupné a interaktivní čtení obsahu souborů v terminálu
less je modernější a nabízí více funkcí než more, ale oba příkazy jsou velmi podobné
Vyzkoušejte si vypsat obsah souboru /etc/passwd pomocí less
less /etc/passwdJak se pohybujete v less?
Řešení
šipkami, nebo pomocí kláves
-
j- dolů -
k- nahoru -
f- vpřed -
b- vzad -
g- na začátek -
G- na konec -
/- vyhledávání (funguje ale pouze dopředu od první zobrazené řádky) -
q- ukončení
head a tail jsou základní příkazy pro výpis prvních nebo posledních řádků souboru
Bez speciálních přepínačů vypisují prvních nebo posledních 10 řádků souboru
Vyzkoušejte si vypsat prvních 10 řádků souboru /etc/passwd
head /etc/passwdJak zobrazíte posledních 10 řádků souboru /etc/passwd?
Řešení
tail /etc/passwdJak zobrazíte posledních 20 řádků souboru /etc/passwd?
Řešení
tail -n 20 /etc/passwdJak pomocí head zobrazíte všechny řádky souboru /etc/passwd kromě posledních 5?
Řešení
head -n -5 /etc/passwdJak pomocí tail zobrazíte všechny řádky souboru /etc/passwd kromě prvních 5?
Řešení
tail -n +6 /etc/passwdTail má i jeden velmi užitečný přepínač -f, který sleduje změny v souboru v reálném čase
Otevřete si 2 okna terminálu ve stejné složce, v jednom spusťte následující příkaz
tail -f my-output.txtV druhém okně terminálu vytvořte soubor my-output.txt a zapište do něj nějaký text
echo "Hello World" > my-output.txtPostupně sledujte první okno a u toho zapisujte další řádky
echo "Hello World" >> my-output.txtTento příkaz je velmi užitečný pro sledování nových záznamů v logovacích souborech
grep je základní příkaz pro vyhledávání řetězců v textu (global regular expression search and print)
Vyzkoušejte si vyhledat řádky v souboru /etc/passwd, které obsahují řetězec root
grep root /etc/passwdJak zobrazíte pouze řádky, které obsahují řetězec bash?
Řešení
grep bash /etc/passwdPrvní argument příkazu grep je regulární výraz, což znamená, že můžete použít speciální znaky pro vyhledávání
Jak zobrazíte pouze řádky, které obsahují řetězec sh na konci řádku?
Tedy nechceme ve výsledku například uživate sshd apod.
Řešení
grep 'sh$' /etc/passwdJak zobrazíte pouze řádky, které začínají na písmeno t?
Řešení
grep '^t' /etc/passwdPříkaz grep je velmi mocný, příkladem je například vyhledání a nálsedný výpis kontextu
Jak zobrazíte řádky, které obsahují řetězec sshd a 2 řádky před a 2 řádky po?
Řešení
grep -B 2 -A 2 sshd /etc/passwdfind je základní příkaz pro hledání souborů a adresářů v souborovém systému
Vyzkoušejte si najít všechny soubory ve vašem domovském adresáři
find ~Všimněte si, že find vypisuje i skryté soubory a také v základu vyhledává rekurzivně i v podadresářích
Find také v základu hledá i adresáře
- pokud chcete vzhledávat pouze soubory, použijte přepínač
-type f - pokud pouze adresáře, použijte
-type d
Jak najdete všechny soubory ve vašem domovském adresáři, které začínají na písmeno d?
Řešení
find ~ -type f -name 'd*'Jak najdete všechny soubory ve vašem domovském adresáři, které končí na .log?
Řešení
find ~ -type f -name '*.log'Jak najdete všechny adresáře ve vašem domovském adresáři, které obsahují slovo server?
Řešení
find ~ -type d -name '*server*'Jak najdete všechny soubory ve vašem domovském adresáři, které byly změněny v posledních 7 dnech?
Řešení
find ~ -type f -mtime -7Jak najdete všechny soubory ve vašem domovském adresáři, které obsahují písmena rc nebo conf?
Řešení
find ~ -type f -name '*rc*' -o -name '*conf*'wc je základní příkaz pro počítání znaků, slov a řádků v textu (word count)
Vyzkoušejte si spočítat počet řádků, slov a znaků v souboru /etc/passwd
wc /etc/passwdJak zobrazíte pouze počet řádků v souboru /etc/passwd?
Řešení
wc -l /etc/passwdJak zobrazíte pouze počet slov v souboru /etc/passwd?
Řešení
wc -w /etc/passwdJak zobrazíte pouze počet znaků v souboru /etc/passwd?
Řešení
wc -c /etc/passwdcut je základní příkaz pro výběr a výřezu částí textu (cut out)
Vyzkoušejte si vypsat první sloupec souboru /etc/passwd
cut -d: -f1 /etc/passwd-d určuje oddělovač, ve kterém je soubor zapsán, v tomto případě :
-f určuje, který sloupec (po rozdělení oddělovačem) chceme vypsat (první sloupec má index 1)
Jak zobrazíte třetí sloupec souboru /etc/passwd?
Řešení
cut -d: -f3 /etc/passwdJak zobrazíte jméno uživatele a jeho domovský adresář ze souboru /etc/passwd?
Řešení
cut -d: -f1,6 /etc/passwdsed je základní příkaz pro editaci textu (stream editor)
Vyzkoušejte si nahradit všechny dvojtečky ve souboru /etc/passwd za mezery
sed 's/:/ /g' /etc/passwd's/:/ /g' je regulární výraz pro nahrazení všech výskytů : za mezeru
Formát je s/<pattern>/<replacement>/<flags> kde
sznázorňuje, že se jedná o substituci<pattern>je regulární výraz, který chceme nahradit<replacement>je řetězec, kterým chceme ho nahradit<flags>jsou různé přepínače, napříkladgpro globální nahrazení (klasické flagy pro regulární výrazy)
Jak zamaskujete uživatelské jména ve souboru /etc/passwd za <masked>?
Řešení
sed 's/^[^:]*:/<masked>:/g' /etc/passwdtar je základní příkaz pro archivaci souborů a adresářů (tape archive)
Vytvořte si archiv workshop.tar ze souborů ve vašem domovském adresáři
tar -cf workshop.tar ~-cvytvoření archivu-furčení názvu archivu
Jak zobrazíte obsah archivu workshop.tar?
Řešení
tar -tf workshop.tar-tzobrazení obsahu archivu-furčení názvu archivu
Jak rozbalíte archiv workshop.tar do adresáře ~/workshop?
Řešení
tar -xf workshop.tar -C ~-xrozbalení archivu-furčení názvu archivu-Curčení cílového adresáře
Jak vyextrahujete pouze soubor .bash_history z archivu workshop.tar?
Řešení
tar -xf workshop.tar -C / home/<username>/.bash_historyJak jste si možná všimli, tar balí i celé cesty k souborům, což může být nežádoucí
Komplikuje nám to například rozbalování archivu, jelikož jsme museli specifikovat
- root adresář
/jako cíl rozbalení - kompletní cestu k souboru
.bash_history
Jak vytvoříte archiv workshop2.tar, ve kterém soubory nebudou obsahovat prefix home/<username>?
Řešení
tar -cf workshop2.tar -C ~ .-Curčení kořenového adresáře
Zobrazte si obsah archivu workshop2.tar
Řešení
tar -tf workshop2.tarNyní můžeme jednoduše extrahovat soubor .bash_history do domovského adresáře
tar -xf workshop2.tar ./.bash_historyOdstranění prefixu je velmi užitečné, pokud chceme archivovat soubory z jednoho adresáře a následně je rozbalit do jiného adresáře
Prefix
./lze dodatečně odstranit pomocí argumentu--transform='s/^\.\///'
date je základní příkaz pro zobrazení aktuálního data a času
Vyzkoušejte si zobrazit aktuální datum a čas
dateJak zobrazíte pouze aktuální datum?
Řešení
date '+%Y-%m-%d'Jak zobrazíte pouze aktuální čas?
Řešení
date '+%H:%M:%S'Jak zobrazíte aktuální datum a čas ve formátu YYYY-MM-DD HH:MM:SS?
Řešení
date '+%Y-%m-%d %H:%M:%S'Jak zobrazíte aktuální datum a čas ve formátu YYYY-MM-DD_HH-MM-SS?
Řešení
date '+%Y-%m-%d_%H-%M-%S'Jak zobrazíte datum, které bylo před 5 dny?
Řešení
date -d '5 days ago' '+%Y-%m-%d'Jak zobrazíte datum, které bude za 5 dnů?
Řešení
date -d '5 days' '+%Y-%m-%d'Shellové expanze je jeden z kroků při zpracovávní shellových příkazů a zaměřuje se na speciální znaky
*- shoda s libovolným počtem znaků?- shoda s jedním znakem[]- shoda s jedním znakem z množiny{}- expanze složených závorek~- domovský adresář~<username>- domovský adresář uživatele- ...
Vyzkoušejte si vypsat všechny skryté soubory ve vašem domovském adresáři
ls ~/.*Shell tyto znaky expanduje před spuštěním samotného příkazu nahradí skutečnými soubory
ls tedy nemusí umět pracovat s těmito znaky, ale shell mu je předá již expandoané
Podívejte se například na to, jak jednoduchý echo příkaz pracuje s expanzí
echo ~/.*Jak zobrazíte řetězce hello1, hello2, ... , hello849, hello850?
Řešení
echo hello{1..850}Podobný styl expanze provádí i pro proměnné prostředí
echo $SHELLNastavte si do proměnné MY_VAR hodnotu hello
MY_VAR=helloJak zobrazíte řetezec MY_VAR is set to hello?
Řešení
echo "MY_VAR is set to $MY_VAR"Shell neexpanduje proměnné v jednoduchých uvozovkách
echo 'This variable will not be expanded: $MY_VAR'Shellové příkazy mohou být skládány do skriptů, které mohou být spouštěny jako celek
Vytvořte si skript hello.sh, který vypíše řetězec Hello, world!
#!/bin/bash
echo 'Hello, world!'Skripům je vhodné nastavit práva pro spuštění
chmod +x hello.shNásledně můžete skript spustit
./hello.shVytvořte si skript greet.sh, který vypíše řetězec Hello, $1!
$1je první argument, který je předán skriptu
Skript budeme chtít volat s argumentem, například world
./greet.sh worldJak vytvoříte skript greet.sh?
Řešení
#!/bin/bash
echo "Hello, $1!"chmod +x greet.shfor je základní příkaz pro iteraci přes seznam prvků
Vytvořte si skript hello.sh, který vypíše řetězec Hello, world! 5x
#!/bin/bash
for i in {1..5}
do
echo "Hello, world!"
doneJak vytvoříte skript greet.sh, který vypíše řetězec předaný řetezec X-krát?
Volání bude vypada takto
./greet.sh 10 "Hello, world!"Řešení
#!/bin/bash
for i in $(seq 1 $1)
do
echo "$2"
doneif je základní příkaz pro podmíněné vykonání příkazů
Vytvořte si skript greet.sh, který vypíše
foopokud je první argumentbarbazpokud je první argumentqux
Volání bude vypadat takto
./greet.sh bar
./greet.sh quxŘešení
#!/bin/bash
if [ "$1" == "bar" ]
then
echo "foo"
elif [ "$1" == "qux" ]
then
echo "baz"
ficase je základní příkaz pro podmíněné vykonání příkazů, který je vhodný pro porovnání s více hodnotami
Jedná se o alternativu k více známému switch příkazu v jiných programovacích jazycích
Vytvořte si skript greet.sh, který vypíše
foopokud je první argumentbarbazpokud je první argumentqux
default vypíše unknown
Řešení
#!/bin/bash
case "$1" in
bar)
echo "foo"
;;
qux)
echo "baz"
;;
*)
echo "unknown"
;;
esacVe skriptech je někdy potřeba spustit příkazy v novém shellu, který je oddělený od rodičovského shellu
Toho lze docílit pomocí subshellu
Vytvořte si skript subshell.sh, který si do proměnné MY_VAR uloží výstup příkazu ls -la a následně tento výstup vypíše
Řešení
#!/bin/bash
MY_VAR=$(ls -la)
echo "$MY_VAR"Vytvořte skript, který podle prvního argumentu vypíše, zdali uživatel s tímto jménem existuje
V případě, že uživatel existuje, vypíše User exists, jinak vypíše na standardní chybový výstup User does not exist a skončí se stavovým kódem 1
Použijte pouze příkazy, které jsme si doposud probrali
./user_exists.sh rootŘešení
#!/bin/bash
if grep -q "^$1:" /etc/passwd
then
echo "User exists"
else
echo "User does not exist" >&2
exit 1
fiModifikujte skript tak, aby vypsal i uživatelské id, domovský adresář a shell ve formátu
uid: <uid>home: <home>shell: <shell>
Řešení
#!/bin/bash
if grep -q "^$1:" /etc/passwd
then
UID=$(grep "^$1:" /etc/passwd | cut -d: -f3)
HOME=$(grep "^$1:" /etc/passwd | cut -d: -f6)
SHELL=$(grep "^$1:" /etc/passwd | cut -d: -f7)
echo "uid: $UID"
echo "home: $HOME"
echo "shell: $SHELL"
else
echo "User does not exist" >&2
exit 1
fiVytvořte zálohou skript, který zazálohuje vaši složku ~/.ssh do adresáře ~/backup
Zálhování bude provedeno pomocí tar archivu a bude provádět rotaci záloh
- při každém spuštění skriptu se vytvoří nový archiv ve formátu
backup-<timestamp>.tar - při každém spuštění skriptu se smažou nejstarší zálohy, pokud jich je více než 5
Použijte pouze příkazy, které jsme si doposud probrali
./backup.shŘešení
#!/bin/bash
BACKUP_DIR=~/backup
SSH_DIR=~/.ssh
# vytvoření adresáře pro zálohy
mkdir -p $BACKUP_DIR
# vytvoření nové zálohy
tar -cf $BACKUP_DIR/backup-$(date +%s).tar -C $SSH_DIR .
# smazání nejstarších záloh
OLD=$(ls -t $BACKUP_DIR | tail -n +6)
rm -f $BACKUP_DIR/$OLDV shellu můžete řetězit příkazy pomocí ;, && a ||
;- odděluje příkazy a spustí je postupně&&- odděluje příkazy a spustí je postupně, pokud předchozí příkaz vrátí stavový kód0||- odděluje příkazy a spustí je postupně, pokud předchozí příkaz vrátí stavový kód1
Vyzkoušejte si řetězení příkazů
echo "Hello, world!" ; echo "Goodbye, world!"echo "Hello, world!" && echo "Goodbye, world!"echo "Hello, world!" || echo "Goodbye, world!"Jaký bude výstup následujícího příkazu?
echo "Hello, world!" && false || echo "Goodbye, world!"Řešení
false vrací stavový kód 1, tedy se spustí i poslední příkaz
Hello, world!
Goodbye, world!
Jaký bude výstup následujícího příkazu?
exit 1 && echo "Hello, world!"A jaký bude výstup následujícího příkazu?
exit 1 || echo "Hello, world!"Pipelining je základní technika pro přesměrování výstupu jednoho příkazu na vstup druhého
Vyzkoušejte si pipelining
ls ~ | grep 'log'Jaký bude výstup následujícího příkazu?
ls ~ | grep 'log' | wc -lZkuste zkombinovat find a grep tak, aby vypsaly všechny soubory ve vašem domovském adresáři, které obsahují slovo log
Řešení
find ~ | grep 'log'Modifikujte předchozí příkaz tak, aby místo /home/<username> vypisoval pouze ~
Řešení
find ~ | grep 'log' | sed "s|/home/.*/|~/|"Výstup příkazů lze přesměrovat do souborů, pípes a jiných procesů
>- přesměrování výstupu do souboru (přepíše obsah, overwrite)>>- přesměrování výstupu do souboru (přidá na konec, append)<- přesměrování vstupu ze souboru (stdin)
Vyzkoušejte si přesměrování výstupu
echo "Hello, world!" > hello.txtJaký bude obsah souboru hello.txt?
Uložte si výstup příkazu ls -la do souboru ls.txt
ls -la > ls.txtVelká část programů podporuje čtění vstupu ze standardního vstupu, již jsme viděli například grep
Dalším zajímavým a velmi užitečným programem je xargs, který umožňuje zpracovávat vstupní řádky a spouštět s nimi příkazy
Vyzkoušejte si například modifikaci výstupu příkazu ls pomocí xargs
ls | xargs -I {} echo "File: {}"-Iurčuje, že se má nahradit{}řádkem vstupu
Pokud tedy na vstupu dostáváme seznam souborů, můžeme s nimi spouštět různé příkazy a ukladát je například do specální složky
Jak zkopírujete všechny soubory ve vašem domovském adresáři do složky ~/backup, ale se jménem ve formátu <filename>.bak?
Řešení
ls ~ | xargs -I {} cp {} ~/backup/{}.baktee je základní program, který zapisuje vstup na standardní výstup a zároveň do souboru
Jedná se o tzv. T-příkaz, který zapisuje vstup na dvě místa
- "dolů", do souboru
- "dopředu", na svůj standardní výstup
Využívá se například při logování
Vyzkoušejte si zápis výstupu příkazu ls do souboru ls.txt a zároveň na standardní výstup
ls -la | tee lsla.txtLze nahlédnout, že tee vypisuje výstup na standardní našeho terminálu, ale zároveň zapisal výstup příkazu ls do souboru lsla.txt
Programy mohou zapisovat do tzn. file-descriptorů, které jsou číslovány
0- standardní vstup (stdin, readonly)1- standardní výstup (stdout)2- standardní chybový výstup (stderr)- ...
Pokud některý program zapisuje to stderr, lze tento výstup přesměrovat do stdout pomocí 2>&1
Ale zajímavější je často odfiltrovat klasický stdout výstup a ponechat pouze stderr
<program> >/dev/nullTímto jsme shellu řekli, že má filedescriptor 1 (defaultní) (stdout) přesměrovat do /dev/null, což je speciální soubor, který všechno co se do něj zapíše, okamžitě zahodí
Stejným postupem můžeme odfiltrovat chybový výstup
<program> 2>/dev/nullTímto jsme shellu řekli, že má filedescriptor 2 (stderr) přesměrovat do /dev/null, což je speciální soubor, který všechno co se do něj zapíše, okamžitě zahodí
Filtrovat stderr je někdy vhodné, pokud například spouštíme find na celém systémovém disku a jelikož do některých adresářů nemáme přístup, chybový výstup může být velmi dlouhý
Základní uživatelská oprávnění v Linuxu jsou založena na třech oprávněních
r- read (čtení)w- write (zápis)x- execute (spuštění)
Linux poté umožňuje nastavovat tyto práva na soubory a adresáře pro tři skupiny uživatelů
- vlastník souboru
- vlastnící skupina uživatelů
- ostatní uživatelé
Vyzkoušejte si zobrazit uživatelská oprávnění souboru /etc/passwd
ls -la /etc/passwdVýsupt by měl vypadat nějak takto
-rw-r--r-- 1 root root
První znak určuje typ souboru
-- běžný soubord- adresářl- symbolický odkaz- ...
Vlastník souboru je root a hlavní skupina u tohoto souboru je stejnojmenná skupina root
Následující tři skupiny po třech znacích určují práva pro vlastníka, skupinu a ostatní uživatele
V tomto případě tedy přečteme, že
- vlastník souboru má práva na čtení a zápis
- uživatelé ve skupině
rootmají práva na čtení - ostatní uživatelé mají práva na čtení
Práva lze jednoduš zakódovat pomocí binární soustavy do tří bitů
- první bit určuje, zdali můžeme číst
- druhý bit určuje, zdali můžeme zapisovat
- třetí bit určuje, zdali můžeme spouštět
Exisutje tedy 8 kombinací těchto tří bitů, které lze zakódovat do čísel 0 - 7
Často se setkáte s tím, že se práva učují například jako 775, kde po přepisu do binárního tvaru dostaneme
- 7 - 111 - rwx (vlastník může číst, zapisovat a spouštět)
- 7 - 111 - rwx (skupina může číst, zapisovat a spouštět)
- 5 - 101 - r-x (ostatní mohou číst a spouštět)
Vytvořte si soubor permissions.txt
touch permissions.txtZákladní práva jsou nastavena na většine linuxu následovně
-rw-r--r--
základní nastavení práv pro nové soubory řídí
umask, který odebírá práva od 666.Na většině systémů je
umasknastaven na 022, což znamená, že se odeberou práva 2 (write) pro skupinu a ostatní uživatele
Na změnu práv k souborům a adresářům slouží příkaz chmod
Vyzkoušejte si změnit práva souboru permissions.txt na plná prává, tzn čtení, zápis i spouštění pro všechny uživatele
Řešení
chmod 777 permissions.txtnebo více čitelná alternativa
chmod u+rwx,g+rwx,o+rwx permissions.txtJak změníte práva souboru permissions.txt na čtení a zápis jenom pro vlastníka souboru?
Řešení
chmod 600 permissions.txtnebo více čitelná alternativa
chmod u+rw,g-rwx,o-rwx permissions.txtsudo je základní příkaz pro spuštění příkazů s oprávněními jiného uživatele, primárně s oprávněními superuživatele (root)
Pomocí normálního uživatele například nemůžete měnit soubory ve složce /etc, vyzkou3ejte si
touch /etc/cant-create-filetouch: cannot touch '/etc/cant-create-file': Permission denied
Nicméně pokud použijeme prozatím magický příkaz sudo před naším příkazem, vlastně tím systému říkáme
- jako root spusti následující příkaz
sudo touch /etc/can-create-filePokud se podíváme na práva k souboru, zjistíme, že soubor doopravdy existuje a vlastní ho root
ls -la /etc/can-create-file-rw-r--r-- 1 root root 0 Mar 13 11:38 /etc/can-create-file
To, že nás uživatel může používat sudo a spouštět takto příkazy jako root
je definované v souboru /etc/sudoers
sudo cat /etc/sudoers...
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
...
Tento řádek konfiguruje sudo příkaz, aby povolil uživatelům ve skupině sudo
Formát je následující
<user/group> <host>=(<runas>) <command>
- na jakémkoliv hostu (stroji)
- za jakéhokoliv uživatele
- jakýkoliv příkaz
Pokud chceme přidat uživatele do skupiny sudo, můžeme použít příkaz usermod
sudo usermod -aG sudo <username>Takto nastavené sudo avšak uživatele nejdříve požádá o heslo,
na Coder instancích je přímo pro vašeho uživatele nastavené speciální pravidlo v souboru /etc/sudoers.d/90-cloud-init-users
sudo cat /etc/sudoers.d/90-cloud-init-users<username> ALL=(ALL) NOPASSWD:ALL
Toto pravidlo říká, že uživatel <username> může používat sudo bez hesla
su je základní příkaz pro změnu uživatele (switch user)
Umožňuje nám přepnout se dočasně na jiného uživatele, pokud máme dostatečná oprávnění a provádět příkazy jako tento uživatel
Nejdříve si musíme nějakého uživatele vytvořit a nastavit mu heslo
sudo useradd demo
sudo passwd demoNásledně se můžeme přepnout na tohoto uživatele
su demoPo takto jednoduchém přepnutí se nám zobrazí nový shell, který běží jako uživatel demo, ale zůstáváme stále v původním adresáři
pwd/home/<username>
Jelikož jsme jiný uživatel, nemáme práva na soubory ve složce /home/<username>
ls -lals: cannot open directory '.': Permission denied
Tento uživatel nemá ani práva na používání sudo
sudo ls -lademo is not in the sudoers file.
Pokud chceme zase přepnout zpět na původního uživatele, můžeme použít příkaz exit
exitPomocí visudo nebo pomocí editace souborů v /etc/sudoers.d/ můžeme nastavit,
kteří uživatelé mohou používat sudo a jaké mají mít práva
Jak přidáte práva uživateli demo k používání sudo, ale pouze na příka ls?
Řešení
echo "demo ALL=(ALL) NOPASSWD:/bin/ls" | sudo tee /etc/sudoers.d/demoZkuste se znovu přepnout na uživatele demo a zkusit spustit příkaz ls pomocí sudo
su demo
sudo lsTentokát by se vám již mělo podařit spustit příkaz ls pomocí sudo a vypsat soubory v domovském adresáři jiného uživatele.