User Tools

Site Tools


linux-admin:capitole:capitol-07

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
linux-admin:capitole:capitol-07 [2016/06/06 18:23]
127.0.0.1 external edit
linux-admin:capitole:capitol-07 [2016/10/03 09:18] (current)
mihaic [Exercițiu 2]
Line 1: Line 1:
 ====== 7. Redirectări ====== ====== 7. Redirectări ======
  
-TODO+Redirectarile sunt principalul mijloc prin care stocam pe disc, in fisiere, prelucrarile de date facute de scripturi si programe.
  
 ===== Subiecte abordate ===== ===== Subiecte abordate =====
  
-  * TODO +  * STDOUT (1) 
-  * TODO +  * STDERR (2) 
-  * TODO+  * STDIN (0)
  
-==== Utilitare folosite ==== 
  
-  * TODO +===== Resurse utile =====
-  * TODO +
-  * TODO+
  
-==== Bune practici ====+  * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA365|Capitolul 12 - Shell scripting]]  
 +  * [[http://​www.tldp.org/​LDP/​Bash-Beginners-Guide/​html/​|TLDP - Bash guide for beginners]] 
 +  * [[http://​www.cyberciti.biz/​open-source/​learning-bash-scripting-for-beginners/​|Learning Bash Scripting for Beginners]]
  
-  * TODO +===== Exerciții =====
-  * TODO +
-  * TODO+
  
-===== Resurse utile =====+==== Demo-uri ​====
  
-  * TODO +=== Lucrul cu redirectari === 
-  * TODO+Redirectare ''​stdout''​ (standard output, în general mesaje afișate prin comenzi similare cu ''​printf''​ din C). De exemplu, într-un sistem în care avem multe procese, e greu sa urmărim direct în consolă output-ul comenzii ''​ps'':​
  
-==== Slide-uri ====+<code bash> 
 +training@box:​~$ ps -f -u student > stdout.txt  
 +training@box:​~$ cat stdout.txt 
 +</​code>​
  
-[[http://koala.cs.pub.ro/​training/​res/​medium-unix/​slides/cap-07.pdf|Slide-uri capitol 7]]+Putem redirecta **doar** mesajele de eroare către un fișier. ScenariuVrem să găsim toate fișierele cu extensia ''​*.conf''​ din directorul ''​/etc''​
  
-<html+<code bash
-  <​center>​ +training@box:~$ find /etc -name '*.conf'​ 
-    <iframe src="​http://docs.google.com/​viewer?​url=http://​koala.cs.pub.ro/training/res/linux-admin/​slides/​cap-07.pdf&​embedded=true"​ width="​600"​ height="​470" ​  ​style="​bordernone;"></​iframe>​ +(...
-  </​center>​ +find: `/etc/ppp/peers'Permission denied 
-</html>+(...) 
 +</code>
  
-===== Exerciții =====+Ne deranjează mesajele de eroare din cauza lipsei drepturilor de citire asupra unor fișiere sau directoare. Pentru aceasta vom folosi:
  
-==== Demo-uri ====+<code bash> 
 +training@box:​~$ find /etc -name '​*.conf'​ 2> errors.txt 
 +training@box:​~$ cat errors.txt 
 +</​code>​  
 + 
 +Putem face combinații acum: redirectăm erorile într-un fișier și rezultatele în alt fișier:  
 + 
 +<code bash> 
 +training@box:​~$ find /etc -name '​*.conf'​ 2> errors.txt > stdout.txt 
 +</​code>​ 
 + 
 +În cazul în care dorim să redirecționăm **toate** mesajele afișate de o comandă, la grămadă, folosim operatorul ''&>'':​ 
 + 
 +<code bash> 
 +training@box:​~$ find /etc -name '​*.conf'​ &> find_output.txt 
 +</​code>​  
 + 
 +<​note>​ 
 +Reamintiți-vă de la procese ''​procfs'',​ montat în ''/​proc''​. Pentru fiecare proces identificat printr-un PID, aveam directorul ''/​proc/​19827/​fd'',​ care conținea link-uri simbolice către fișierele deschise de acel proces. Pentru fiecare proces în acel director găseam ''​0,​ 1, 2''​. Acestea reprezintă respectiv:​ 
 + 
 +  * ''​0''​ - intrarea standard (stdin). Exemplu: tastatura 
 +  * ''​1''​ - ieșirea standard (stdout). Exemplu: mesaje afișate cu ''​printf''​ de un program C 
 +  * ''​2''​ - ieșirea standard de eroare (stderr), unde se duc mesaje precum cele afișate de find mai sus. 
 + 
 +</​note>​ 
 + 
 +Putem redirecta outputul și către device-uri virtuale, cum ar fi ''/​dev/​null''​. În general facem acest lucru deoarece vrem să executăm o anumită comandă (într-un program sau într-un script), fără a ne interesa outputul ei. Pentru exemplul cu ''​find''​ de mai sus, să zicem că dorim să ignorăm erorile: 
 + 
 +<code bash> 
 +training@box:​~$ find /etc -name '​*.conf'​ 2> /dev/null  
 +</​code>​ 
 + 
 +<note important>​Atenție! Toți operatorii de redirectare din acest demo ''​2>'',​ ''&>'',​ ''>''​ trunchiază conținutul fișierului,​ dacă acesta exista. Ca alternativă aveam //append mode//, care se poate aplica și aici, fără probleme, astfel: 
 +''​%%2>>​%%'',​ ''​%%&>>​%%'',​ ''​%%>>​%%''​. 
 +</​note>​ 
 + 
 +=== Investigarea redirectărilor ​===  
 + 
 +Putem folosi ''​lsof''​ pentru a verifica modul în care redirectarea afectează descriptorii unui proces. 
 + 
 +Într-un tab de terminal porniți un proces ''​sleep''​ folosind comanda: ''​sleep 100''​. 
 + 
 +În alt tab, pentru a investiga descriptorii procesului sleep folosim comanda ''​lsof -p $(pidof sleep)''​. 
 + 
 +Observăm că descriptorii standard referă terminalul în care a fost rulată comanda, moșteniți de la terminalul din shell-ul folosit. 
 + 
 +Acum să invesigăm procesul sleep cu redictări în diverse fișiere. Folosiți comanda ''​sleep 100 < /dev/zero > /dev/null 2> error.txt''​ 
 + 
 +Folosim comanda lsof anterioară pentru a investiga descriptorii procesului sleep. Putem observa unde pointează descriptorii standard de fișier pentru procesul pornit. 
 + 
 +==== Exercițiu 1 ==== 
 + 
 +De multe ori dorim să căutăm într-o ierarhie de fișiere și directoare, dar după anumite criterii. Comanda cea mai potrivită în acest caz este ''​find''​. Folosiți ''​find''​ pentru a afișa toate fișierele din ierarhia ''/​etc/''​ (adică toate fișierele din /etc/, din subdirectoarele acestuia, din subdirectoarele subdirectoarelor etc.). **Hint**: Folosiți opțiunea ''​-type''​ a comenzii find. 
 + 
 +Extindeți comanda anterioară pentru a afișa toate fișierele din ierarhia ''/​etc/''​ al căror nume începe cu litere între //a// și //d//. **Hint**: Folosiți opțiunea ''​-name''​ a comenzii find și construcția ''​[a-d]*''​ pentru a indica un șir care începe cu o literă între //a// și //d// urmată de orice altceva. 
 + 
 +Extindeți comanda anterioară pentru a afișa toate fișierele din ierahia ''/​etc/''​ care au permisiunile de forma ''​%%rw-------%%'',​ adică 600. **Hint**: Folosiți opțiunea ''​-perm''​ urmată de permisiunile căutate în format octal. 
 + 
 +Pentru comanda finală, redirectați outputul în fișierul ''​~/​file_list.txt''​ și erorile în ''​~/​errors.txt''​. 
 + 
 +==== Exercițiu 2 ==== 
 + 
 +Schimbați directorul curent în directorul /​home/​training. Folosiți comanda ''​echo''​ pentru a afișa pe ecran textul ''​al doilea exercițiu''​. Redirectați acest text într-un fișier numit ''​ex2.txt''​. 
 + 
 +Folosiți comanda echo pentru a adăuga textul ''​e mai lung decat primul''​ în fișierul ''​ex2.txt'',​ fără a șterge conținutul său. 
 + 
 +Scriind comanda gcc fără niciun parametru, veți primi un mesaj de eroare. Redirectați acest mesaj de eroare folosind un operator de redirectare într-un fişier numit ''​gcc_error.txt''​. Afișați conținutul fișierului pentru a confirma. 
 + 
 +Redirectați ieșirea standard a comenzii ''​strace -e open ls /​lib''​ în fișierul ''​strace.out''​.
  
-TODO+Redirectați ieșirea de eroare standard a comenzii ''​strace -e open ls /​lib''​ în fișierul ''​strace.err''​.
  
-TODO+Redirectați atât ieșirea standard cât și ieșirea de eroare standard a comenzii ''​strace -e open ls /​lib''​ în fișierul ''​strace.both''​.
  
-==== TODO: Exercițiu 1 ====+Filtrați (folosind ''​grep libc''​) ieșirea standard a comenzii ''​strace -e open ls /​lib''​ și apoi redirectați-o în ''​strace-new.out''​ iar ieșirea de eroare standard în ''​strace-new.err''​.
  
-TODO+Filtrați (folosind ''​grep proc''​) ieșirea de eroare standard a comenzii ''​strace -e open ls /​lib''​ și apoi redirectați-o în ''​strace-newer.err''​ iar ieșirea standard în ''/​dev/​null''​.
  
-==== TODO: Exercițiu 2 ====+Adăugați output-ul generat la ieșirea de eroare standard și ieșirea standard a comenzii ''​strace -e open ls /​lib''​ în fișierul ''​strace.log''​. O nouă rulare a comenzii va conduce la adăugarea de informații la sfârșitul acestui fișier.
  
-TODO+Folosiți utilitarul ''​tee''​ atât pentru a afișa la ieșirea standard cât și a scrie în fișierul ''​free.txt''​ ieșirea comenzii ''​free''​. Scrierea în fișier trebuie făcută fără a suprascrie ce era deja scris. (Hint: ''​man tee'',​ append)
  
 +Explicați diferența de comportament între următoarele două comenzi:
 +<code bash>
 +cat / 2>&1 > error.txt
 +cat / > error.txt 2>&1
 +</​code>​
linux-admin/capitole/capitol-07.1465226633.txt.gz · Last modified: 2016/09/29 09:30 (external edit)