Úvod do textového prostredia unixov

Na tomto workshope sa dozviete základné informácie o práci na príkazovom riadku unixových operačných systémov. Pre nedostatok času sa na mnohé veci pozrieme len letmo a v prípade, že budete chcieť veci ktoré sa tu naučíte neskôr používať, budete si musieť čo-to doštudovať. Alebo Inak. Na tomto workshope sa čo-to dozviete a doštudovať si toho budete musieť strašne veľa. Tento text nieje vyčerpávajúci hoci nováčika pravdepodobne vyčerpá, bezchybný (zanedbáva veci v ktorých by sme sa mohli na workshope príliš zamotať), súvislý, konzistentný a obávam sa, že ani zmysluplný (obsahuje množstvo zmysluprázdnych príkladov).

Unixové operačné systémy sa aj v súčasnosti používajú prevažne na serveroch a routroch všetkého druhu, na desktopoch sa vyskytujú pomerne zriedka. Ich veľkou prednosťou z hľadiska systémového administrátora, ale aj zručného používateľa je to, že ešte aj v súčasnosti možno povedať, že z "príkazového riadku" urobíte stále viac ako z grafických rozhraní. To je výhodou jednak pre to, že na takomto systéme možno pracovať nadiaľku bez veľkých nárokov na internetové pripojenie, ale aj pre to, že vďaka textovému rozhraniu je práca z hľadiska nevidiaceho používateľa relatívne jednoduchá, bez komplikácií súvisiacich s prístupnosťou (žiadne obrázkové informácie, veľmi zriedka je potrebný nejaký vizuálny kontext).

Čo je unix

O histórii sa rozpisovať neplánujem, pretože kapitolka o histórii unixov je povinnou jazdou každého textu ktorý o unixoch pojednáva. Takže kto prahne po informáciách, ten si prečíta napríklad text na wikipedii

V tomto texte pokec o tom čo to vlastne je odbavíme nasledovne:

Ako začať

V prvom rade potrebujeme nejaký unix. Jedna z možností ako prísť ku kontu na nejakom serveri s unixom je nájsť poskytovateľa, ktorý nám takéto konto poskytne. Na internete je ich pomerne veľa a zohnať "shell" (tak sa služba od poskytovateľa nazýva) už dnes nieje ťažké ani za mierny poplatok. Celkom elegantnou možnosťou ako k shellu prísť je napríklad zriadiť si vlastný virtuálny server. Miernou nevýhodou pre začiatočníkaje fakt, že si takýto server musíte sami správne nastaviť, čo nemusí byť úplne jednoduché. Na druhej strane, pri zriaďovaní virtuálneho servera už nejako nastavený linux dostanete, takže nieste v takej situácii, v akej by ste boli, ak by ste si inštalovali systém od úplného začiatku.

Na workshope budeme používať interný server, prihlasovacie údaje sa dozviete počas workshopu. Skôr ako sa vrhneme na samotný unix, povedzme si ešte niečo o SSH, ktoré budeme používať na pripojenie k serveru.

SSH

Ako som spomenul vyššie, unixové operačné systémy možno používať nadiaľku. Na to, aby sme to mohli robiť je potrebné sa k ním nejako pripojiť. V súčasnosti sa na to používa protokol s názvom SSH (secure shell). Podrobný pokec o možnostiach ssh by bol na jeden ďalší workshop, preto tu spomenieme iba fakt, že je to protokol, cez ktorý možno s použitím nejakého klienta komunikovať so serverom a záujemcov o viac informácií odkážeme napríklad na seriál "SSH receptem na bezpečnost" (1.a 2. časť), záujemcovia o pokročilé informácie isto radi nahliadnú do vtipne napísaného seriálu ssh intimně aneb úvod do paranoii

Tu spomenieme len to, čo budeme akútne potrebovať na workshope, teda že na to, aby sme mohli komunikovať so serverom cez SSH budeme potrebovať nejakého klienta. Použijeme program putty pre windows, presnejšie jeho portable verziu, ktorá nerobí neporiadok v registroch. Preskáčte do sekcie download a stiahnite hneď prvý balíček označený "All-in-one ZIP file". V snahe zabezpečiť "nadčasovosť" tohoto textu nevkladám priamu linku, pretože putty sa vyvíja a linka môže byť už zajtra zastaralá.

Po stiahnutí a rozbalení spomenutého zipu venujme pozornosť programu putty.exe, ktorý je súčasťou balíčka. Po jeho spustení sa otvorí okno, do ktorého môžeme zadať prihlasovacie údaje:

Po úspešnom pripojení sa na server pracujeme podobne ako na príkazovom riadku windows. Teda na poslednom riadku máme čosi čomu sa hovorí "prompt", kam píšeme príkazy. Výstupy z príkazov sa vypisujú na obrazovku, ktorej obsah si pozeráme prezeracím kurzorom, alebo jaws kurzorom, v závislosti na tom, aký čítač obrazovky používame.

Teraz už vieme všetko potrebné na to, aby sme sa mohli pripojiť k nášmu serveru.

Pre tých, čo by si radi zriadili svoj vlastný server: na vyhľadanie vhodnej služby môžete použiť google. Moja stránka (práve tá, z ktorej čítate tieto informácie) beží takisto na virtuálnom serveri, ktorý mám zriadený na serveroch spoločnosti 4smart.

Po úspešnom pripojení

Ak ste sa úspešne prihlásili, môžeme začať s prvými experimentmi. Po zadaní hesla vám server zobrazí niekoľko viac aj menej zaujímavých informácií, pod nimi sa bude nachádzať prompt, na ktorom sa nachádza aj kurzor. Na tento riadok budeme písať príkazy, prostredníctvom ktorých budeme komunikovať so serverom. Interpret príkazov (program ktorý bude vaším príkazom rozumieť a odpovedať na ne) sa nazýva shell.

Existuje množstvo rôznych shellov. Odlišujú sa napríklad v podpore rôznych funkcií, skriptovacích jazykoch v ktorých pre ne môžete "formulovať" jednoduché programy a pod. My sa budeme zaoberať v súčasnosti asi najpoužívanejším shellom s názvom bash.

Bash máme nastavený ako "login shell" čo znamená, že sa spúšťa automaticky po prihlásení.

V prípade, že chcete spojenie ukončiť, napíšte príkaz exit a potvrdte ho enterom. Každý príkaz, ktorý budeme zapisovať do príkazového riadka, musíme ukončovať enterom, aby sme shellu povedali, že sme príkaz dopísali a on sa ním môže začať zaoberať. Existuje aj možnosť zatvoriť okno stlačením kombinácie alt+f4, autor tohoto textu však tento spôsob ukončovania spojenia s unixom považuje za ekvivalentný trieskaniu dvermi po 22:00.

Základné operácie s príkazovím riadkom

Akoo už bolo spomenuté, kľúčový je príkazový riadok do ktorého píšeme príkazy. Každý príkaz ukončujeme enterom. Vyskúšajte si nasledujúce príkazy:

Vyskúšajte si vymenované príkazy, skúste sa pohrať s históriou.

Príkazy možno okrem písania aj editovať, teda fungujú šípky doprava a doľava a tlačidlá backspace a delete.

Hornou a dolnou šípkou možno používať históriu naposledy použitých príkazov, čo budete pravdepodobne využívať neskôr, keď budeme písať dlhšie príkazy.

Za zmienku ešte stojí automatické doplňovanie príkazov ale aj názvov súborov a priečinkov po stlačení tabulátora (vyskúšame neskôr, keď to začne byť potrebné).

Skôr ako sa začneme venovať práci so súbormi a priečinkami, povedzme si ešte, že príkazom možno zadávať aj parametre. Vo všeobecnosti má tvar príkazu nasledujúci tvar:

príkaz parameter1 parameter2 parameter3 ...

Spomeňme si napríklad na príkaz finger, ktorému sme ako parameter zadávali meno používateľa, o ktorom sme sa chceli niečo dozvedieť.

Parametre ktoré začínajú pomlčkou (-) budeme nazývať prepínače. Tie sa používajú na výber funkcionality konkrétneho príkazu, zatiaľ čo tie bez pomlčky sú väčšinou "dáta" ktoré má konkrétny príkaz spracovať.

Parametre oddeľujeme medzerou, čo môže vyvolávať nepríjemné pocity v čitateľoch s túžbami zadávať parametre obsahujúce medzeru. Takýchto čitateľov učičíkame informáciou, že viac slovné parametre (reťazce) uzatvárame do uvodzoviek.

Trochu nepríjemnou správou pre používateľov operačného systému Windows môže byť aj to, že všetko v unixoch (shell, názvy súborov, prepínače,...) rozlišuje veľké a malé písmená. Teda napríklad príkazi WHO, Who, ani wHo neexistujú.

Súbory a priečinky

Aj v unixových systémoch sa perzistentné dáta uchovávajú v súboroch, ktoré môžeme organizovať do priečinkov. Pri práci so shellom sme vždy v nejakom priečinku nastavení. Príkazom pwd si môžeme kedykoľvek zistiť aktuálnu cestu.

Všimnime si, že v unixoch sa ako oddeľovač používa namiesto windowsového \ štandardné lomítko (/) a že cesta nezačína písmenkom disku.

V unixoch sú všetky disky, priečinky a súbory organizované v jednom strome a v prípade, že máme v serveri viacero diskov, sú tieto pripojené do nejakého priečinka vrámci tohoto stromu.

ls: Výpis obsahu priečinka

Na vypísanie obsahu priečinka slúži príkaz ls. Ak ho použijeme bez parametrov, vypíšeme si obsah aktuálneho priečinka.

Príkaz ls však rozumie množstvu prepínačov, ktorými môžeme určiť, ako má vizerať výpis, čo všetko má výpis obsahovať,... Ako posledný parameter môžme uviesť cestu k priečinku, ktorý chceme vypísať. Príkaz ls teda nemusíme nutne použiť len na výpis aktuálneho priečinka. Nasleduje niekoľko často používaných prepínačov. Jednopísmenkové prepínače môžme kombinovať do jedného slova, teda napríklad zápisy

ls -a -l

a

ls -al

sú ekvivalentné.

cd: zmena priečinka

parametrom príkazu môže byť relatívna (bez lomítka na začiatku) alebo absolútna (ak má cesta lomítko na začiatku, tak ju nazývame absolútna, pretože popisuje cestu k priečinku od koreňového priečinka) cesta k priečinku do ktorého chceme vstúpiť.

mkdir pokus

cd pokus

ls

cd ..

rmdir pokus

cd /

ls

predposledným príkazom sme prešli do koreňového priečinka.

Za zmienku ešte stojí informácia, že shell nám ponúka rýchli spôsob ako sa dostať do niektorých priečinkov:

mkdir, rmdir: vytváranie resp mazanie priečinka

Oba príkazy sa najčastejšie používajú s jedným alebo viacerími parametrami pre jeden alebo viacero priečinkov. Vytvárať aj mazať teda môžeme aj viacero priečinkov naraz, týmto spôsobom však môžme mazať len prázdne priečinky.

cp: kopírovanie

Najjednoduchšia verzia má 2 parametre a to zdroj a cieľ, pri čom cieľ môže byť aj priečinok. Bez potrebných prepínačov môžme kopírovať len súbory, pri kopírovaní priečinkov treba použiť prepínač -r (rekurzívne kopírovanie). Teda napríklad

cp -r public_html kopia

okopíruje priečinok public_html do priečinka kopia.

Pri kopírovaní môžeme používať aj to, čo zrejme poznáte pod názvom masky:

S maskami sa viac pohráme neskôr, skusmo si však môžete vyskúšať vyrobiť priečinok a v ňom napríklad súbory kap1, kap2, kap3, (na vytváranie súborov použite príkaz touch) a na ňom vyskúšať napríklad:

ls kap?

ls kap[123]

alebo ls *

čo si myslíte, čo urobí toto?

cp kap*[05].txt vybrane

Prístupové práva

Jedna z vecí s ktorou sa vo windows väčšina ľudí nezaoberá alebo zaoberá veľmi zriedka sú prístupové práva. Pri práci na unixoch ich pravdepodobne budeme stretávať častejšie, pretože na unixoch budeme pravdepodobne vykonávať častejšie veci, pri ktorých je úprava prístupových práv potrebná.

Pod prístupovými právami myslíme akési nastavenia, ktorý používatelia a čo môžu alebo nemôžu robiť s konkrétnym objektom alebo objektmi.

V každom unixovom operačnom systéme máme k dispozícii prinajmenšom jeden ty práv, ktoré budeme nazývať posixové. Tento systém nám umožňuje nastavovať práva pre 3 úrovne:

Na každej úrovni môžme zapínať alebo vypínať tieto základné atribúty:

Vspomeňme si teraz na druhý údaj z ľava vo výpise obsahu priečinka s parametrom -l. Mám na mysli krypticky vizerajúcu deväticu znakov ktorá obsahuje nejakú kombináciu znakov rwx a pomlčiek. Tento údaj kóduje prístupové práva. Prvá trojica určuje práva pre vlastníka, druhá pre skupinu a tretia pre ostatných. Ak je na pozícii písmenka znak pomlčka, znamená to, že príslušná úroveň konkrétne oprávnenie nemá. Napríklad

rwxr-x--x

znamená:

Na to aby ste mohli začať s právami experimentovať by sa ešte zišlo vedieť, ako ich nastavovať.

chmod: nastavovanie práv

Príkaz chmod rozumie zadávaniu práv v dvoch formátoch. V tomto texte si popíšeme symbolický, ktorý umožňuje nastavovať práva aj "relatívne". Symbolický spôsob má nasledujúci tvar:

chmod popis_pravsubor1, subor2,...

A popis_prav pozostáva z jedného alebo viacerých výrazov oddelených čiarkou. Výrazy začínajú jedným z písmen u(ser), g(roup), alebo o(thers), za ktorím špecifikujeme práva pre konkrétnu úroveň. Ťažkopádny popis zadávania práv si skúsime v tomto texte ušetriť a nahradíme ho niekoľkými praktickými príkladmi:

$ chmod u=rwx,g=rw,o=x a.txt

-rwxrw---x 1 lecky demo 0 May 21 09:27 a.txt

$ chmod o+r+w a.txt

-rwxrw-rwx 1 lecky demo 0 May 21 09:27 a.txt

$ chmod o-w,g-w+x a.txt

-rwxr-xr-x 1 lecky demo 0 May 21 09:27 a.txt

a teraz ešte niekoľko poznámok:

Vyskúšajte si:

Dokumentácia

V predchádzajúcich častiach sme sa z ľahka pozreli na niekoľko príkazov. Tento text však z pochopiteľných dôvodov pred zvedavím čitateľom zatajuje množstvo zaujímavých prepínačov a funkcií jednotlivých príkazov. Napríklad príkaz chmod rozumie okrem symbolického aj absolútnemu zadávaniu prístupových práv. Zvedavého čitateľa už nebudeme ďalej trápiť rečičkami o tom, čo všetko sme mu zatajili a predstavíme si manuálové stránky.

Ide o základnú dokumentáciu, ktorá existuje ku každému z vyššie spomenutých, ale aj k mnohým doposiaľ nespomenutým príkazom. Manuálové stránky sú zvyčajne veľmi rozsiahle, zároveň však aj veľmi poučné a možno povedať, že ich čítaním trávia mnoho času aj ostrieľaní používatelia unixov. Na ich zobrazenie sa používa program s názvom man, ktorému môžeme ako parameter zadať okrem iného aj názov programu, ktorého dokumentáciu si chceme prečítať.

Vyskúšajme napríklad:

man chmod

Manuálové stránky sa zobrazujú po stranách prostredníctvom programu "less", ktorý budeme v budúcnosti používať veľmi často, preto je dobré pamätať si v súvislosti s ním niekoľko dôležitých vecí:

Vráťme sa teraz k manuálovým stránkam. Každá stránka je rozdelená na niekoľko častí:

Manuálové stránky sú v systéme organizované v tzv sekciách a číslo sekcie sa píše pred program ku ktorému si chceme manuálovú stránku prečítať. O každej sekcii sa môžete dozvedieť základné informácie, ak si pozriete man ku slovu intro v každej sekcii. Teda napr

man 1 intro

man 2 intro

Celkom užitočné "help" utilitky, ktoré stojí za to poznať sú aj apropos a whatis (pozri manuálové stránky, resp vyskúšaj)

Prepájanie príkazov

Vyskúšajte si vypísať podrobnosti o priečinku /etc

ls -al /etc

Zistíte, že je dosť dlhý (v mojom prípade má 195 riadkov). Obsahuje zoznam všetkých súborov a priečinkov, ktoré nejako súvisia s konfiguráciou servera a na obrazovku sa nám naraz nezmestí. Vyššie bol spomenutý príkaz less, ktorý dokáže zobrazovať dlhé výpisy tak, že ich "zalamuje" po stranách. Ten by sa nám teraz náramne zišiel, potrebovali by sme mu však náš dlhý výpis nejako poslať. Dá sa to urobiť tak, že príkazu ls povieme, aby to čo by normálne poslal na výstup, radšej poslal programu less, ktorý nám to rozumne vypíše. Programy ls a less teda spojíme a použijeme na to "potrubie", ktoré reprezentuje znak |. Teda:

ls -al /etc |less

a opäť si počkáme a po chvíli sa nám zobrazí čosi podobné ako pri manuálových stránkach. a môžme používať vyhľadávanie, posúvanie po obrazovkách,... Vyskúšajte si nájsť informácie o napríklad o súbore passwd.

Mimochodom, počet riadkov vo výpise pri mojom priečinku som zistil pomocou príkazu wc (word count) s prepínačom -l (lines) do ktorého som poslal výstup z príkazu ls.

Pomocou rúry môžete spájať aj viacero príkazov, napríklad

ls |sort |less

program sort slúži na triedenie dát a jeho (utriedený) výstup sme pre istotu poslali do programu less, aby sme videli celý výstup.

Výstup programu môžeme presmerovať aj do súboru:

ls -al /etc >~/a.txt

výstup teda presmerovávame znakom >.

Rovnako sa dá presmerovať aj vstup, používa sa na to znak <.

Ak znak > zdvojíme, obsah súboru do ktorého presmerovávame nebude vymazaný, ale výstup bude pridaný na jeho koniec. Teda

ls >a.txt

ls -al >>a.txt

bude obsahovať výpisy toho istého priečinka. Najprv iba názvy a potom detailný výpis.

Na výpis obsahu súboru môžeme použiť príkaz cat

cat a.txt

sort <a.txt |less

A nakoniec ešte zdvojené <. Vyskúšajte si:

sort <<poslednyriadok

prvy

druhy

treti

stvrty

piaty

poslednyriadok

Rôzne užitočné utilitky a triky

Pri demonštrovaní nasledujúcich utilitiek a konštruktov bashu budeme používať súbor, ktorý sa nachádza v priečinku /etc a volá sa passwd. To je súbor, ktorý obsahuje informácie o všetkých používateľoch na serveri. Zvedavci si pozrú

man 5 passwd

Zvedavci takisto nebudú považovať nižšie uvedené opisy za vyčerpávajúce a pri každom príkaze nazrú do manuálových stránok, alebo budú klásť zvedavé otázky googlu.

grep

Nástroj na filtrovanie výstupu. Rozumie množstvu parametrov a zvedavcom odporúčam nazrieť do man stránok. Najjednoduchšie a najčastejšie použitie:

cat /etc/passwd |grep michael

vypíše všetky také riadky súboru passwd, ktoré obsahujú slovo michael

find

Nástroj na vyhľadávanie súborov podľa rôznych kritérií. Takisto s hutnou dokumentáciou a širokým spektrom využitia

find .

vypíše obsah aktuálneho priečinka aj všetkých podpriečinkov rekurzívne

find . -iname *.txt

vyhľadá a vypíše cesty ku všetkým txt súborom, relatívne k aktuálnemu priečinku. I-čko v prepínači "iname" znamená case insensitive (bez citlivosti na veľké písmená)

find `pwd` -iname *.txt

Podobný výpis ako v predchádzajúcej ukážke, ibaže cesty sú absolútne. Dosiahli sme to nahradením cesty od ktorej sa má začať hľadať. Bodku sme nahradili príkazom pwd, uzavretým v opačných úvodzovkách. Tie nám umožňujú vložiť výstup nejakého programu ako parameter pre iný program.

find . -type d -and -empty

Nájde objekty ktoré sú priečinky (-type d) a zároveň (-and) sú prázdne (-empty), teda vypíše všetky prázdne priečinky

read

Slúži na načítanie vstupu zo štandardného vstupu. Načítanú hodnotu vkladá do pomenovanej premennej. Popri read si v nasledujúcom krátkom príklade ukážeme aj echo

read riadok

echo napisal si $riadok

Ano, bash vie čo sú to premenné a ano, netreba ich nijako špeciálne vytvárať, stačí do nich niečo zapísať

meno=mrkvicka

echo $meno

jednoduché testovanie výstupu

Príkazy môžeme okrem | spájať aj pomocou logických spojok && (a zároveň) a || (alebo). Každý príkaz po skončení vracia návratovú hodnotu, ktorá sa ukladá v premennej $?

cd

echo $?

cd neexistujuci_priecinok

echo $?

Vidíme že ak príkas skončil úspešne, vrátil hodnotu 0, v opačnom prípade vracia nenulovú hodnotu.

Pri použití && a || sa chápe nula ako pravda a nenulová hodnota ako nepravda, čo môžeme využiť nasledovne:

ls a.txt &&echo uz existuje ||touch a.txt

ak súbor a.txt existuje, tak ls vráti hodnotu 0 a vykonása echo. Ak neexistuje, tak sa echo za && nevykoná, ale sa vykoná vetva za || (alebo) a súbor sa vytvorí

while

Uhádnite alebo zistite, čo robia nasledujúce riadky:

find . -iname "*.txt" |while read s

do

cat $s |grep ahoj >/dev/null &&echo $s obsahuje hladane slovo

done

Všimnite si, že štandardný výstup grepu sme presmerovali do súboru /dev/null. Je to taký kontajner na nepotrebné výstupy, ktorý sme využili práve teraz, pretože nechceme, aby nám grep vypisoval na výstup riadky, na ktorých našiel čo hľadáme. My chceme v našom jednoduchom programe iba návratovú hodnotu z programu grep.

editovanie textov

Pre unixové prostredia existuje množstvo rôznych editorov. Pre tých, ktorím sa nechce veľa učiť bude pravdepodobne postačujúci editor s názvom pico (po spustení si pozrite spodné riadky obrazovky), pre tých, čo disponujú trpezlivosťou a majú radi dokonalosť odporúčam excelentný editor vim.

Čítanie pre tých, ktorím sa práca v unixoch stále zdá byť zvládnuteľná