Přihlášení: student student mc midnight commander Ctrl+Alt+F1 až F6 z grackého rozhraní Alt+F1 až F6 přepínání mezi nimi Alt+F7 zpět ls adresář zobrazí co je v daném adresáři ls -l adresář zobrací co je v daném adresáři a více detaily ls -l adresář more zobazí po jednotlivých obrazovkách ls -la vypíše i skryté soubory cd / - o úroveň výš cd hodí mě mého adresáře označen vlnovkou cp odkud kam - copy mkdir make directory rm soubor smaže soubor rmdir adresář smaže adresář rm r adresář smaže vše v adresáři cat vypíše obsah souboru man příkaz help příkazu (q - návrat z manuálu) wc l počítá řádky wc m počítá znaky wc c počítá byty root/ bin boot dev etc home lib media mnt opt proc root sbin srv sys tmp usr var d rwx rwx rwx počet linků vlastník datum poslední modikace délka název d adresář - - soubor l link r právo číst w zapisovat x spustit ho - - právo není uděleno práva pro: vlastník skupina ostatní vlastník každý adresář má svého vlastníka individuálního i skupinového ls l /etc grep ^d wc l - spočítá jen adresáře - 1 - Christy
bez šedé části vypíše adresáře cp /etc/passwd /home/student - musíme mít práva úplná cesta začíná na začátku stromu (v rootu) /etc/passwd /home/student/data/data1 aktuální adresář proměnná neúplná cesta použivá se tak, že se před ní předřadí aktuální adresář cd /home/student/ předřazení (umístění kde se nacházíme) data/data1 neúplná cesta 1. vytvořit adresář počítač4 mkdir pocitac4 2. zkopírovat soubory passwd a group pod názvem hesla a skupiny cp /etc/passwd hesla cp /etc/group skupiny 3. vypsat obsah souboru passwd cat /etc/passwd 4. spočítat řádky souboru cat /etc/passwd wc l 5. spočítat znaky souboru cat /etc/passwd wc m příkazy např. ls modikátory např. -la argumenty obvykle označení adresářů a souborů se kterými se má pracovat Vi editor 1. v editoru vi napište následující program (jedná se o jednoduchou verzi programu cat) vi mycat.c /* cat: version 1 Print le on terminal */ #include <fcntl.h> #include <stdio.h> main(agrc,argv) int argc; char *argv[]; { int d,count; char buf[1024]; if(argc!= 2); printf( error: cat must have one parametr\n ); exit(1); d = open(argv[1],o_rdonly); if(d == -1) { printf( cannot open le %s\n, argv[1]); exit(1); while(( count = read(d,buf,sizeof(buf))) > 0) write(1,buf,count); return 0; ESC :w mycat.c - uložení souboru :q -vyskočení bez uložení - 2 - Christy
2. Program přeložte a spusťte. Návod: Soubor se zdrojovým programem nazvěte mycat.c Překlad proveďte příkazem $cc mycat.c o mycat - volání kompilátoru, musí se jmenovat *.c; -o denuje název, jinak by se jmenoval a.out Přeloženým programem vypište obsah souboru /etc/passwd $./mycat /etc/passwd - tečka znamená aktuální adresář 3. V některém z editorů X-winws (např. v xeditu) napište následující skript: echo ******************************************** echo pripojeni uzivatele: who echo ******************************************** echo Datum a cas: date echo ******************************************** 4. Skript vyzkoušejte Návod: Soubor se skriptem nazvěte uvod. Skriptu přidělte přístupové právo spuštění $chod u+x uvod Skript spusťte $./uvod Cvičení 3 1. Vypište hodnoty proměnných TERM, USER a?. Zadejte příkaz ls tak, aby proměnná? měla hodnotu 1. echo $TERM xterm echo $USER student echo $? 0 ls -w echo $? 1 2. V systému existují systémové programy true a false. Program true nedělá nic ale skončí úspěšně (tj. s návratovovou hodnotou). Program false také nedělá nic, ale skončí neúspěšně (tj. s návratovou hodnotou 1). V jazyce C realizujte vlastní verze těchto programů. Nazvěte je mytrue a myfalse a odzkoušejte. main () main() { { exit(1); return 1; 3. Pomocí přesměrování standardního výstupu vytvořte programem cat soubor s názvem uzivatele a s jednořádkovým obsahem Tabulka uzivatelu: Potom pomocí programu cat plňte tento soubor o tabulku uživatelů, která je uložena v souboru /etc/passwd. cat ctrl+d ctrl+c cat >a Tabulka uživatelů ctrl+d 4. Soubor lze hledat pomocí příkazu nd / -name jméno_souboru -print Spusťte příkaz nd s přesměrováním chybového výstupu souboru ~/nd_errors nebo /dev/null. nd / -name jmeno_souboru 2>error 5. Příkazem nastavte proměnnou PATH tak, aby shell prohledával také aktuální a mácí adresář. Vyzkoušejte. echo $PATH 6. Nastavte prompt shellu bash tak, aby se v promptu vypisoval také čas. man bash PS1="\n:xt>" 7. Změňte následující program cat (viz 2) tak, aby mohl být spuštěn také A. bez parametrů (bude číst ze standardního vstupu) a - 3 - Christy
B. s libovolným počtem parametrů (vypíše všechny soubory jeden po druhém) /* cat: version 1 Print le on terminal */ #include <fcntl.h> #include <stdio.h> main(argc,argv) int argc; char *argv[]; { int d,count; char buf[1024]; if(argc!= 2){ printf("error: cat must have one parametr\n"); exit(1); d = open(argv[1],o_rdonly); if(d == -1){ printf("cannot open le %s\n", argv[1]); exit(1); while(( count = read(d,buf,sizeof(buf))) > 0) write(1,buf,count); return 0 ; Pomocí vašeho programu cat spojte soubory /etc/passwd a /etc/group a spojený soubor uložte passwd_group. cat /etc/passwd > spoj cat /etc/group >> spoj cat /tec/passwd /tec/group >spoj - jiná možnost zápisu kii.pef.czu.cz student student ssh kii.pef.czu.cz -l student -p 995 putty Cvičení 4 1. Použijte expansní výraz k výpisu informací o všech programech, které jsou v adresáři /bin a začínají na l nebo L. Dalším příkazem zjistěte zda některý z programů v /bin končí na číslici. ls /bin/[ll]* ls -l /bin/*[0-9] 2. Příkazem ls vypište z mácího adresáře všechny skryté soubory. ls ~/.* 3. Do proměnné X uložte aktuální datum a proměnné Y uložte informaci o aktuálně připojených uživatelích (tj. výstup programu who). X=`date` Y=`who` 4. Do proměnné Z uložte pouze aktuální čas. (Návod: můžete buď použít modikátor programu date který způsobí, že date vypíše pouze čas nebo můžete použít složený příkaz set date ; Z=$4 echo $4 set 100 200 300 echo $1 100 shift - posune to echo $1 200-4 - Christy
5. Sestavte tabulku z které bude patrné, jak následující znaky výluky, a \ ruší speciální význam následujících znaků: $, *, \,, >? echo $USER echo `$USER` echo "$USER" $ * \ ` ` >? ` ` + + " " - + \ + + 6. Napište script s nazvem nasob, který se bude spouštět se dvěma celočíselnými parametry a který vypíše jejich součin Návod: echo expr $1 * $2 exit 0 Lze ve skriptu uzavřít znak * místo jednoduchých uvozovek dvojitých uvozovek? Vyzkoušejte a vysvětlete. Zjednodušte druhou řádku skriptu a znovu skript vyzkoušejte. expr 20 '*' 30 600 7. Vytvořte ve vašem mácím adresáři soubor který se bude jmenovat?*!*. Potom jej přejmenujte na a_b.c touch "?*!*" 8. Prohlédněte si jaké v shellu existují aliasy. Vytvořte v systému alias lb, který provede dlouhý výpis adresáře /bin se zastavováním po naplnění obrazovky. Vyzkoušejte. (alias lb= ls l /bin more ) alias lb=' ls -l /bin more' 9. Jaký bude výsledek následujících složených příkazů: test w /etc/passwd ;echo $? [ -f /bin/ls ];echo $? [ -d /bin/ls ];echo $? [ -r /etc/group a s /etc/group ];echo $? Vyzkoušejte a vysvětlete. (operátor -a má význam and a operátor s má význam nenulová délka souboru) 10. Jaký bude výsledek příkazů: HISTSIZE=500 [ $HISTSIZE lt 1000 ] ; echo $? [ $HISTSIZE ge 1000 ] ; echo $? if [ $# -eq 0 ] then dir="." else dir=$1 while : if [! -d $dir ] then echo "$0 : $dir neni adresar" else echo "$dir :" fcount=0 dcount=0 scount=0 for le in $dir/* if [ -f $le ] then if [ -L $le ] then scount=`expr $scount + 1` - 5 - Christy
else fcount=`expr $fcount + 1` elif [ -d $le ] then dcount=`expr $dcount + 1` ne echo $dcount adresaru $fcount obycejnych souboru $scount linku if [ $# -le 1 ] then break else shift dir=$1 ne Cvičení 5 1. Jaký bude výsledek příkazů zadaných za sebou v bash shellu? $echo ".*" $echo $? $!e $echo [ -f /etc/passwd ] $[ -f /etc/passwd ] ; echo $? $echo.* Echo $* - Echo $? vrati 0!e historie, posledni prikaz ktery zacina na retezec e 2. Vysvětlete a vyzkoušejte činnost následujícího skriptu. ( Proměnná # obsahuje počet parametrů spuštění) while [ $# -gt 0 ] echo -n "$1 " shift ne echo tento kód lze zaměnit za echo $* :))) Skript podstatně zjednodušte tak, že použijete proměnnou *, která obsahuje všechy parametry spuštění. 3. Napište a odzkoušejte skript který spočte kolik je v zadaných adresářích podadresářů a kolik normálních souborů. File: abc Col 0 582 bytes 100% #nums : script vypise pocet souboru a adresaru if [ $# -eq 0 ] then dir="." else dir=$1 while : if [! -d $dir ] then echo "$0 : $dir neni adresar" else echo "$dir :" fcount=0 dcount=0 for le in $dir/* - 6 - Christy
ne if [ -f $le ] then fcount=`expr $fcount + 1` elif [ -d $le ] then dcount=`expr $dcount + 1` ne echo $dcount adresaru $fcount obycejnych souboru if [ $# -le 1 ] then break else shift dir=$1 Skript upravte tak, aby se: 1. započítávaly i skryté soubory 2. zvlášť vypisoval počet souborů, které jsou symbolickými linky Cvičení 6 1. Ve svém mácím adresáři vytvořte kopie programů cp a cat s názvy kopie a vypis a dále podadresář programy. V adresáři programy vytvořte hard link na program kopie s názvem cp a soft link na program vypis s názvem cat, který bude obsahovat úplnou cestu k programu vypis. Kolik hard linků je na soubory kopie a vypis a na podadresář programy? Ověřte programem ls. / - kopie (cp) - výpis (cat) - programy - cat -> soft link na výpis - cp -> hard link na kopie bude obsahovat úplnou cestu a pak tam bude hardlink, který se bude jmenovat cp na kopii Cp cat ~/student/cat Cp cp ~/student/cp Mv cp kopie Mv cat vypis Ln soubor link Ln s soubor link Ln s ~/vypis ~/programy/cat 2. Pomocí programu grep zjistěte kolik je v adresáři /bin a /etc symbolických linků. Návod : Pokud grep spustíte takto: grep ^l, grep bude číst standardní vstup a propouštět pouze řádky, které začínají na l. Ls l /bin grep *l wc -l 3. Nastavte přístupová práva k souboru kopie tak, aby výpis programem ls -l byl rwsr-sr T a k souboru vypis tak, aby výpis programem ls byl rwsr xrwt. Který z programů kopie nebo vypis můžete spustit? Vyzkoušejte. Ls l /usr/bin/passwd vypise prava pro passwd wc -l Sbit uzivatele: Find /usr/bin user root perm +6000 (hledani souboru, kde hledat, co se hleda vlastnictvi root a permission a +6000 je sbit uzivatele nebo sbit skupiny) Co udelat, kdyz se musi zmenit heslo rootu? Xvin971 (mozna xwin971) Jak nakopirovat bash pro sebe :)) (ale nejde to, prej, haha) Cp /bin/bash ~ - 7 - Christy
Chmod 7777 ~/bash Chown root bash 4. Zjistěte jak je v systému zajištěno, aby uživatel nemohl vytvořit kopii shellu s nastaveným s-bitem uživatele, který by vlastnil root. Návod : Vytvořte kopii shellu bash a nastavte mu všechna práva a s-bit uživatele. Potom zkuste předat jeho vlastnictví superuživateli. Vytvořili jste kopii shellu s nastaveným s-bitem ve vlastnictví superuživatele? 5. Vytvořte v mácím adresáři kopii systémového programu cat s názvem mycat. Vytvořte soubor data s libovolným obsahem. Nastavte přístupová práva k souborům mycat a data tak, aby ostatní uživatelé mohli zobrazit obsah souboru data pouze vaším programem mycat. Cesta povede takto, nikudy jinudy to jit nesmi: Cat -> mycat -> data Rwxr-xv-x +sbit uzivatele EVID Jak musi byt nastavena prava, aby uzivatel soubor nemohl editovat a aby mohl udelat zmenu sveho hesla? /etc/passwd /usr/bin/passwd 6. Programem nd vytvořte soubor, který bude obsahovat výpis všech souborů, které jsou ve vlastnictví superuživatele a které mají nastavem s-bit uživatele nebo s-bit skupiny. Popis programu nd najdete v on-line manuálu. Cvičení 7 1. a. Vypište všechny procesy, které v systému běží. (ps axl nebo ps el) b. Vypište jen procesy s přiřazeným terminálem. (ps al ) c. Vypište procesy, které máte ve svém vlastnictví. (ps -lu username ) d. Vypište všechny procesy, které jste spustili z shellu, kterému zadáváte příkazy. (ps l) (Ve všech příkazech můžete vynechat modikátor l a stanete zkrácený výpis. Pokud před modikátory uvádíte, používáte SYSTEM V syntax. Pokud neuvádíte používáte BSD syntax.) 2. V jazyce C napište nekonečný cyklus. Program spusťte na popředí a sledujte jeho činnost z jiného terminálu. a. Program zrušte v okně, ve kterém běží. b. Program znovu spusťte a zjistěte PID jeho rodiče. c. Sledujte čas spotřebovaný procesem. b. Program zrušte z druhého okna zasláním signálu. 3. Program z příkladu 1 spusťte na pozadí a sledujte jeho činnost ze stejného okna. Nakonec program zrušte. 4. Program z příkladu 1 spusťte na pozadí. a. Program pozastavte zasláním signálu a přesvědčete se o jeho zablokování. (Signál, který způsobí pozastavení je SIGSTOP (19) ). b. Program odblokujte a přesvědčete se, že skutečně běží. (Signál, který způsobí odblokování je SIGCONT(18)). c. Nakonec běžící program zrušte. 5. Napište skript, který každých 10 sec souboru ~/journal vypíše datum a čas a připojené uživatele. Skript vyzkoušejte. Skript pozměňte tak, aby časový interval výpisu bylo možné zadávat parametrem spuštění skriptu. 6. Analýzou programu stanovte kolik procesů v systému poběží a kolik jich zůstane zablokováno, pokud přeložíte a spustíte následující program. main() { fork(); if(fork()==0) - 8 - Christy
pause(); fork(); if(fork()==0) while(1); pause(); Výsledek ověřte tak, že program napíšete a spustíte. Nakonec všechny procesy zrušte. Fork znamená kopie. Uložím jako něco.c Nastaveni přístupových práv: Chmod 777 neco.c Kompilace Cc neco.c Vytvoří a.out a ten jde spouštět pomoci./a.out Ps l Vypíše procesy systému./a.out & Spuštění na pozadí Při ps l zobrazí a.out s PID Kill PID ukončí daný PID Kill -19 PID Pozastaví nebo končí prováděný PID Kill -18 PID Spuští daný PID Killall a.out Vypne najednou všechny vytvořené procesy programem a.out Cvičení 8 1. Které z následujících znakových řetězců 12?.cshrc abc.c!?cshrc?c bc obsahují instanci následujícího regulárního výrazu: a) \.c.* b).c.* c) bc..* 2. Výsledky z př. 1 ověřte pomocí programu grep. (Návod: Vytvoříte řádkový soubor, jehož řádky buu obsahovat jednotlivé řetězce. Tento soubor bude vstupem programu grep, který budete spouštět s jednotlivými regulárními výrazy.) 3. Pomocí programů ls, grep a wc spočtěte kolik je v /etc podadresářů a kolik je v /bin linkových souborů. 4. Pomocí programu grep vyhledejte všechny soubory s nastaveným s-bitem uživatele nebo s nastaveným s-bitem skupiny. (Výpis všech souborů získáte příkazem ls R / ) 5. Přeložíte a spustíte následující program. #include <stdio.h> main() { if(fork()==0) - 9 - Christy
execl( /bin/date, date, NULL); execl( /bin/ls, ls, -al, /etc, NULL); pause(); a) Který z programů ls a date je spuštěn rodičovským a který dětským procesem? b) Kolik zůstane v systému zablokovaných procesů? c) Vložte programu tisky tak, aby bylo možné odpověď na otázku a) zkontrolovat. (Číslo procesu lze získat pomocí volání getpid()a číslo rodičovského procesu pomocí volání getppid(). d) Program pozměňte tak, aby vznikl ještě jeden potomek původního rodičovského procesu, který bude vypisovat obsah souboru /etc/passwd. Grep \.c.* http://www.josef-dvorak.webzdarma.cz/36unx/36unx.htm Ls l /etc grep ^d wc l Výsledek je 57 :)))) Ls l /etc grep ^l wc l Výsledek je 3 Cat ~/kopie grep ^$ wc -l Wc l vytiskne počet řádek Cat ~/kopie vypíše na výstup obsah souboru kopie Cat /etc/passwd grep bash Cat passwd udělá výpis souboru Grep bash vypíše kažu řádku, která obsahuje slovo bash Cely příkaz vypíše soubor passwd, kažu řádku, která obsahuje slovo bash Ls Rl / 2>/dev/null grep ^_..[ss] ls -Rl / 2>/dev/null egrep '^[-dlbc]..[ss] ^_...[ss]' cc prog.c - 10 - Christy
Dalsi priklad kazdych 10 vterin vypise datum a prihlaseneho uzivatele souboru journal File Cv7 if [ -f ~/journal ] then rm ~/journal while : date >>~/journal who >>~/journal echo '***********************' >>~/journal sleep 10 ne chmod 777 cv7./cv7 vytvori se soubor journal, ktery obsahuje dane informace. Co dela program fork, jak ho resit co dela? Fork vytvori novy proces puvodniho, takze mam dva procesy. If fork==0 pauza - 11 - Christy