This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
linux-admin:capitole:capitol-06 [2016/06/06 18:23] 127.0.0.1 external edit |
linux-admin:capitole:capitol-06 [2016/09/29 10:05] (current) mihaic [Afișare fișiere executabile pentru procese] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== 6. Funcționarea shell-ului ====== | ====== 6. Funcționarea shell-ului ====== | ||
- | TODO | + | Ne interesează internele shell-ului și modul în care acesta execută comenzi. Urmărim să știm ce facilități ne oferă shell-ului pentru a ne face mai rapid și mai productiv activitățile cu sistemul de operare. |
===== Subiecte abordate ===== | ===== Subiecte abordate ===== | ||
- | * TODO | + | * Pornirea unui shell: shell-uri și terminale, ''/etc/passwd'' |
- | * TODO | + | * Scripturi de startup ale shell-ului |
- | * TODO | + | * Rularea unei comenzi de către shell |
+ | * Subshell-uri | ||
+ | * Variabile shell, variabile de mediu | ||
+ | * Operatori shell | ||
+ | * Caractere speciale shell | ||
+ | * Globbing | ||
- | ==== Utilitare folosite ==== | + | ==== Bune practici ==== |
- | * TODO | + | * Comenzi care primesc informații la intrarea standard și comenzi care primesc informații ca parametru: operatorul ''|'' vs. expandarea comenzilor ''%%$(...)%%'' |
- | * TODO | + | * Folosire variabile de mediu doar la nevoie; de prefixat comenzi cu inițializare de variabile |
- | * TODO | + | * Comenzi folosite pentru afișare și comenzi folosite pentru prelucrare |
+ | * Măsoară de două ori și taie o dată :-) | ||
+ | * Activare reverse search ''tcsh'': http://stackoverflow.com/a/7771746 | ||
- | ==== Bune practici ==== | + | ==== Utilitare folosite ==== |
- | * TODO | + | * ''bash'', ''lsof'' |
- | * TODO | + | * ''echo'' |
- | * TODO | + | * ''type'', ''which'' |
+ | * ''env'', ''set'' | ||
+ | * ''find'', ''stat'', ''pgrep'' | ||
===== Resurse utile ===== | ===== Resurse utile ===== | ||
- | * TODO | + | * https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions |
- | * TODO | + | * http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm |
==== Slide-uri ==== | ==== Slide-uri ==== | ||
- | [[http://koala.cs.pub.ro/training/res/medium-unix/slides/cap-06.pdf|Slide-uri capitol 6]] | + | [[http://koala.cs.pub.ro/training/res/linux-admin/slides/cap-06.pdf|Slide-uri capitol 6]] |
<html> | <html> | ||
Line 40: | Line 49: | ||
==== Demo-uri ==== | ==== Demo-uri ==== | ||
- | TODO | + | Pornirea unui shell folosind programul ''login'' și apoi ''/etc/passwd''. Variabila ''SHELL'' |
+ | |||
+ | Terminalul unui shell și descriptorii standard de fișier pentru un shell | ||
+ | |||
+ | Ce acțiuni realizează shell-ul la rularea unei comenzi, rularea unei comenzi în background | ||
+ | |||
+ | Determinarea comenzilor builtin și a comenzilor externe (''type'' și ''which''). | ||
+ | |||
+ | Diferența între: | ||
+ | <code> | ||
+ | ps ; echo ; echo ; echo ; echo ; echo ; echo ; echo ; echo ; ps | ||
+ | </code> | ||
+ | și | ||
+ | <code> | ||
+ | ps ; /bin/echo ; /bin/echo ; /bin/echo ; /bin/echo ; /bin/echo ; /bin/echo ; /bin/echo ; /bin/echo ; ps | ||
+ | </code> | ||
+ | |||
+ | Crearea de subshell-uri, problema cu | ||
+ | <code> | ||
+ | echo | read v | ||
+ | </code> | ||
+ | |||
+ | Actualizarea variabilei de mediu ''PATH''. Definirea de noi variabile de mediu. Prefixarea unei comenzi cu inițializarea unei variabile de mediu | ||
+ | |||
+ | Expandarea comenzilor: | ||
+ | <code bash> | ||
+ | stat -c "%s" $(find /etc/ -type f -name '*.conf' -size +5k) | ||
+ | lsof -p $(pgrep bash | tr '\n' ',') | ||
+ | </code> | ||
+ | |||
+ | Operații pe șiruri în shell | ||
+ | |||
+ | === Globbing === | ||
+ | |||
+ | Dorim să afișăm toate fișierele cu extensia ''.conf'' din ''/etc'', care încep cu ''a, b, c, d'' sau ''e'': | ||
+ | <code bash> | ||
+ | ls -l /etc/[a-e]*.conf | ||
+ | </code> | ||
+ | |||
+ | Dorim să afișăm fișierele (sau directoarele) cu extensiile ''.conf'' sau ''.d'' din ''/etc'': | ||
+ | <code bash> | ||
+ | ls -ld /etc/*{.conf,.d} | ||
+ | </code> | ||
+ | De ce am folosit parametrul ''-d'' la ''ls''? | ||
+ | |||
+ | Dorim să afișăm fișierele (sau directoarele) cu extensiile ''.conf'' sau ''.d'' din ''/etc'' care nu încep cu ''a, b, c'': | ||
+ | <code bash> | ||
+ | ls -ld /etc/[^abc]*{.conf,.d} | ||
+ | </code> | ||
+ | |||
+ | ==== Mesaj de întâmpinare în shell ==== | ||
+ | |||
+ | Dorim să afișăm un mesaj de întâmpinare custom pentru momentul în care un utilizator deschide un shell. Mesajul vrem să fie | ||
+ | <code> | ||
+ | Welcome, <nume-utilizator>, to Pearson-Hardman-Specter. <nume-utilizator> just got Litt-up! | ||
+ | </code> | ||
+ | unde ''<nume-utilizator>'' este username-ul. | ||
+ | |||
+ | Pentru aceasta va trebui să editați, ca ''root'' (adică folosind ''sudo''), fișierul ''/etc/bash.bashrc'' și să scrieți la **sfârșitul** fișierului comanda dorită. Comanda va fi rulată la orice deschidere de shell nou. Folosiți comanda ''sudo vim /etc/bash.bashrc'' pentru a edita ca root fișierul ''/etc/bash.bashrc''. | ||
+ | |||
+ | <note> | ||
+ | Fișierul ''/etc/bash.bashrc'' este un fișier global de configurare a shell-ului. Fișierul este parcurs la fiecare deschidere de shell. | ||
+ | </note> | ||
+ | |||
+ | Pentru început afișați șirul ''%%Welcome%%'' la fiecare deschidere de shell. Adică scrieți la sfârșitul fișierului ''/etc/bash.bashrc'' comanda pentru afișarea șirului. Apoi deschideți un shell nou (sau un tab nou de shell pentru verificare). | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a afișa un mesaj folosiți comanda ''echo'' urmată de șirul de afișat. Este recomandat ca șirul de afișat, transmis ca argument comenzii ''echo'' să fie pus între ghilimele (''%%"%%'', //quotes//). | ||
+ | </note> | ||
+ | |||
+ | Pentru afișarea șirului dorit, care conține username-ul, folosiți variabila ''USER'', variabilă deja definită în shell. Variabila ''USER'' conține username-ul. Pentru a afișa valoarea unei variabile folosim construcția de forma ''$USER''. De exemplu, pentru a afișa numele de utilizator și un mesaj de salut folosim comanda | ||
+ | <code> | ||
+ | echo "Salut, $USER" | ||
+ | </code> | ||
+ | |||
+ | Ca să testați deschideți un tab nou de terminal; la deschiderea terminalului vi se va crea shell-ul și vi se va afișa mesajul din ''/etc/bash.bashrc''. | ||
+ | ==== Folosire globbing ==== | ||
+ | |||
+ | Descărcați și despachetați arhiva de [[http://koala.cs.pub.ro/training/res/linux-admin/arc/cap-06-res.zip|aici]]. | ||
+ | |||
+ | Listați, folosind **globbing**, toate imaginile cu extensiile ''bmp, jpg, png, gif'' din directorul rezultat în urma dezarhivării. | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a lista toate fișierele cu extensiile ''bmp'', ''jpg'', ''png'' și ''gif'' folosiți operatorii de globbing ''*'' (//star//) si ''{opt1,opt2,opt3}'' (acolade). Un exemplu simplu de utilizare (porniți de la acesta) este | ||
+ | <code> | ||
+ | ls practic/*/*.png | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | ==== Expandarea comenzii ==== | ||
+ | |||
+ | Creați o arhivă ''tar.gz'' cu fișierele din ierarhia ''/etc/'' care au extensia ''.conf'' și au dimensiunea mai mare de ''5KB''. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''tar'' și apoi expandare de comandă ''find''. Vedeți și exemplele de comenzi de la demo-ul legat de expandarea comenzilor. | ||
+ | </note> | ||
+ | |||
+ | Creați o arhivă ''zip'' cu fișierele din ierarhia ''/usr/include'' care conțin șirul ''epoll'', | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți opțiunea ''-r'' a comenzii ''grep'' pentru a căuta recursiv într-o ierarhie. Folosiți opțiunea ''-l'' a comenzii ''grep'' pentru a afișa doar numele fișirelor găsite. | ||
+ | </note> | ||
+ | |||
+ | ==== Afișare caractere speciale ==== | ||
+ | |||
+ | Inițializați variabila ''text'' la un șir de caractere. | ||
+ | |||
+ | <note tip> | ||
+ | Adică rulați ceva de genul: | ||
+ | <code> | ||
+ | text="mellon" | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | Afișați la ieșirea standard mesajul ''%%"Variabila text are valoarea '"...'". Valorea poate fi actualizata."%%''. În mesaj, toate caracterele ghilimele (''"'') și apostrof (''%%'%%'') se vor afișa întocmai. Iar în loc de ''...'' puneți valoarea variabile ''text''. | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a afișa ghilimele atunci când deja vă aflați între ghilimele va trebui să le escapați. Escaparea se face folosind ''\'' (//backslash//). | ||
+ | |||
+ | Alternativa este să închideți ghilimele inițiale și apoi să afișați ghilimelele pe care vreți să afișați între apostrofuri. Invers pentru escaparea de apostrofuri. | ||
+ | |||
+ | Nu puteți escapa apostrofuri câtă vreme vă aflați între apostrofuri. | ||
+ | |||
+ | De exemplu dacă vrem să afișăm șirul ''%%ana'are"mere%%'' putem folosi | ||
+ | <code> | ||
+ | echo ana"'"are'"'mere | ||
+ | </code> | ||
+ | |||
+ | Urmăriți ce face comanda | ||
+ | <code> | ||
+ | echo "'"'"'ana-are-mere'"'"'" | ||
+ | </code> | ||
+ | </note> | ||
+ | ==== Afișare fișiere localizate ==== | ||
+ | |||
+ | Folosiți comanda ''locate'' pentru a afișa fișierele din sistem care au extensia ''.conf''. | ||
+ | |||
+ | Pentru fișierele de mai sus afișați directoarele din care fac parte. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''dirname'' pentru extragerea directoarelor din lista de fișiere extrasă mai sus. Folosiți expandarea comenzilor, adică construcția ''%%$(...)%%'', în conjuncție cu comanda ''locate'' rulată mai sus. | ||
+ | </note> | ||
+ | |||
+ | Eliminați duplicatele. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți operatorul ''|'' pentru a redirecta comanda de mai sus către comanda ''sort -u''. | ||
+ | </note> | ||
+ | |||
+ | Pentru directoarele de mai sus afișați numele directorului și inode-ul, separate prin virgulă ('',''). | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''stat'' cu opțiunea ''-c'' și formatul corespunzător. | ||
+ | </note> | ||
+ | |||
+ | **Bonus**: Sortați directoarele de mai sus în ordinea inode-ului. Afișați numele directorului și inode-ul (separate prin virgulă ('','')). | ||
+ | |||
+ | ==== Afișare fișiere executabile pentru procese ==== | ||
+ | |||
+ | Afișați procesele al căror proces părinte este ''init'', procesul cu PID-ul ''1''. | ||
+ | |||
+ | Pentru procesele de mai sus afișați **doar** numele comenzii (Hint: opțiunea ''-o comm''). | ||
+ | |||
+ | Pentru executabilele de mai sus afișați calea completă (Hint: ''which''). | ||
+ | |||
+ | Pentru executabilele de mai sus afișați numele și timpul ultimei schimbării (//change time//), separate prin virgulă ('',''). | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''stat''. | ||
+ | </note> | ||
+ | |||
+ | Sortați executabilele de mai sus în ordinea timpului ultimei schimbări. | ||
+ | |||
+ | <note tip> | ||
+ | Sortarea poate fi simplă, nu este nevoie de sortare numerică. Formatul datei afișat de ''stat'' permite sortare de orice fel. | ||
+ | </note> | ||
+ | |||
+ | ==== Creare fișiere ==== | ||
+ | |||
+ | Creați 100 de fișiere cu numele ''%%"myfile-XY.txt"%%'', unde ''XY'' este indexul fișierului între ''00'' și ''99''. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comenzile ''seq'' și ''touch''. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Ca model folosiți-vă de comanda<code> | ||
+ | seq -f "%02g" 1 100 | ||
+ | </code> | ||
- | TODO | + | Între ghilimele poate apărea un șir complet. Gândiți-vă că trebuie să generați șiruri de forma ''%%myfile-XY.txt%%''. |
+ | </note> | ||
- | ==== TODO: Exercițiu 1 ==== | + | ==== Expandare aritmetică ==== |
- | TODO | + | Din fișierul de [[http://lpic.ro/res/skel/sandbox.kext_iOS9.3|aici]] dorim să extragem partea care începe de la offset-ul ''0x13000'' (în hexazecimal) până la sfârșit. Puneți conținutul într-un alt fișier. Afișați conținutul primilor 16 octeți din fișier în format hexazecimal; output-ul trebuie să fie de forma ''0080 b67f 6a01 7900 1180 0000 b57f b57f''. |
- | ==== TODO: Exercițiu 2 ==== | + | <note tip> |
+ | Pentru a extrage o parte dintr-un fișier folosiți comanda ''dd''. Folosiți opțiunea ''skip'' a ''dd''. | ||
- | TODO | + | Pentru că operați pe octeți, nu pe blocuri, va trebui să configurați pentru ''dd'' dimensiunea blocului la ''1'' folosind opțiunea ''bs''. |
+ | </note> | ||
+ | <note tip> | ||
+ | Dacă avem un număr în hexazecimal putem folosi construcția de expandare aritmetică ''%%$(...)%%'' pentru a-l converti în zecimal. De exemplu: | ||
+ | <code> | ||
+ | user@hostname:~$ echo $((0x10)), $((0x20)), $((0x100)) | ||
+ | 16, 32, 256 | ||
+ | </code> | ||
+ | </note> |