User Tools

Site Tools


medium-unix:capitole:capitol-03

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
medium-unix:capitole:capitol-03 [2016/05/16 17:30]
razvan
medium-unix:capitole:capitol-03 [2016/05/16 22:01] (current)
rdobrescu [Afișare fișiere]
Line 30: Line 30:
   * TODO   * TODO
  
 +==== Slide-uri ====
 +
 +[[http://​koala.cs.pub.ro/​training/​res/​medium-unix/​slides/​cap-03.pdf|Slide-uri capitol 3]]
 +
 +<​html>​
 +  <​center>​
 +    <iframe src="​http://​docs.google.com/​viewer?​url=http://​koala.cs.pub.ro/​training/​res/​medium-unix/​slides/​cap-03.pdf&​embedded=true"​ width="​600"​ height="​470" ​  ​style="​border:​ none;"></​iframe>​
 +  </​center>​
 +</​html>​
 ===== Exerciții ===== ===== Exerciții =====
  
 ==== Demo-uri ==== ==== Demo-uri ====
  
-TODO+Folosirea comenzii ''​find''​ cu diverși parametri pentru a parcurge sistemul de fișiere. Afișarea executabilelor cu bitul de setuid activat din directoarele ce conțin executabile (''/​bin'',​ ''/​sbin'',​ ''/​usr/​bin'',​ ''/​usr/​sbin''​). 
 + 
 +Folosirea comenzii ''​stat''​ cu formatare pentru a afișa metainformații despre fișiere. 
 + 
 +Folosirea comenzii ''​dd''​ pentru a copia chunk-uri de fișiere. Opțiunile ''​bs'',​ ''​count'',​ ''​skip'',​ ''​seek'',​ 
 + 
 +==== Structură de directoare și fișiere ==== 
 + 
 +Creați, în directorul home al utilizatorului ''​student'',​ structura de mai jos: 
 +<​code>​ 
 +supermarket/​ 
 +├── curatat/ 
 +│   ​├── pronto - lemn curat 
 +│   ​└── solutie curatat ferestre 
 +└── mancare/ 
 +    ├── -- -> lactate/​lapte batut 
 +    ├── carne/ 
 +    │   ​└── -10 grade sunca 
 +    ├── fructe/ 
 +    │   ​└── castraveti spanioli 
 +    └── lactate/ 
 +        └── lapte batut 
 +</​code>​ 
 + 
 +Intrarea ''​%%--%%''​ este un link simbolic, adică numele link-ului simbolic trebuie să fie ''​%%--%%''​. 
 + 
 +Intrările care se termină în ''/''​ (//slash//) sunt directoare (''​supermarket/'',​ ''​curatat/'',​ ''​mancare/'',​ ''​carne/'',​ ''​fructe/'',​ ''​lactate/''​). 
 + 
 +Restul de intrări sunt fișiere obișnuite (//regular files//). 
 + 
 +<note tip> 
 +Pentru a valida structura creată, folosiți, din directorul home al utilizatorului ''​student'',​ comanda<​code>​ 
 +tree -F supermarket 
 +</​code>​ 
 +</​note>​ 
 + 
 +==== Actualizare timpi ==== 
 + 
 +Pe structura de directoare creată anterior configurați timpi astfel: 
 +* pe intrările din mâncare, mai puțin link-ul simbolic, configurați ca timp de acces miezul nopții la Crăciun 2013 
 +* pe intrări de curățat configurați ca timp de modificare miezul nopții la Revelion 2013 
 + 
 +Nu e nevoie să folosiți o comandă specială care să se aplice pe toate intrările. Luați intrările la rând și modificați timpii. 
 + 
 +<note tip> 
 +Pentru modificarea timpilor folosiți comanda ''​touch''​. 
 + 
 +Pentru a verifica timpii de acces folosiți comanda ''​stat''​. 
 +</​note>​ 
 + 
 +==== Actualizare metadate link simbolic ==== 
 + 
 +Adăugăm în sistem utilizatorul ''​ana''​. Pentru aceasta, ne autenficăm ca root și apoi folosim comanda ''​adduser''​. Adică rulăm comenzile:<​code>​ 
 +$ sudo su 
 +# adduser ana 
 +</​code>​ 
 + 
 +Ca ''​root'',​ actualizăți următoarele metadate pe link-ul simbolic: 
 +* modificați timpii la miezul nopții Halloween 2013 
 +* modificați deținătorul link-ului în ''​ana''​ 
 + 
 +<note tip> 
 +Pentru modificarea deținătorului unui link, folosiți comanda ''​chown''​. Comanda ''​chown''​ poate fi rulată doar de utilizatorul root. 
 + 
 +Exemple de rulare a comenzii ''​chown''​ sunt:<​code>​ 
 +chown tony mydata.iso ​       # change owner user of file mydata.iso to tony 
 +chown tony:​players icon.bmp ​ # change owner user of file icon.bmp to tony and owner group to players 
 +</​code>​ 
 +</​note>​ 
 + 
 +==== Afișare fișiere ==== 
 + 
 +Dorim să afișăm fișiere după diferite considerente. 
 + 
 +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.). **Indicație**:​ Folosiți opțiunea ''​-type''​ a comenzii ''​find''​. 
 + 
 +Folosiți ''​find''​ pentru a afișa toate fișierele din ierarhia ''/​etc/''​ al căror nume începe cu litere între ''​a''​ și ''​d''​. **Indicații**:​ Folosiți opțiunea ''​-name''​ a comenzii ''​find''​. Folosiți construcția ''​[a-d]*''​ pentru a indica un șir care începe cu o literă între ''​a''​ și ''​d''​ urmată de orice altceva. 
 + 
 +Folosiți ''​find''​ pentru a afișa toate fișierele din ierarhia ''/​etc/''​ al căror nume începe cu litere între ''​a''​ și ''​d''​ și are extensia ''​.conf''​ (adică se încheie în șirul ''​.conf''​). **Indicație**:​ Porniți de la comanda anterioară și extindeți argumentul transmis opțiunii ''​-name''​. 
 + 
 +Folosiți ''​find''​ pentru a afișa toate fișierele din ierahia ''/​etc/''​ care sunt deținute de utilizatorul ''​root''​ și grupul ''​root''​. **Indicație**:​ Folosiți optiunea ''​-user''​ a comenzii ''​find''​. 
 + 
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ care sunt deținute de utilizatorul ''​root''​ și un grup diferit de ''​root''​. **Indicație:​** Folosiți ''​!''​ (semnul exclamării în fața opțiunii necesare pentru a o nega). 
 + 
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ pentru care ''​others''​ au permisiuni de orice fel (adică ''​others''​ au **oricare** dintre permisiunile //read//, //write// sau //​execute//​). **Indicații**:​ Urmăriți opțiunea ''​-perm''​ în pagina de manual a comenzii ''​find''​. Urmăriți și exemplele de folosire căutând după șirul ''​EXAMPLES''​. 
 + 
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ pentru care ''​others''​ nu au nici un fel de permisiuni (de orice fel: //read//, //write// sau //​execute//​). **Indicație:​** Folosiți ''​!''​ (semnul exclamării în fața opțiunii necesare pentru a o nega). 
 + 
 +==== Afișare informații despre fișiere ==== 
 + 
 +Dorim să afișăm informații despre fișiere folosind comanda ''​stat'',​ comandă dedicată exact obținerii de informații despre fișiere. 
 + 
 +Afișați pentru fișierul ''/​etc/​passwd''​ doar dimensiunea. **Indicație**:​ Folosiți comanda ''​stat''​ împreună cu opțiunea ''​%%--format%%''​ (sau ''​-c'',​ forma scurtă a acestei opțiuni). 
 + 
 +Afișați pentru fișierul ''/​etc/​passwd''​ inode-ul, dimensiunea și uid-ul, separate prin '',''​ (virgulă). 
 + 
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​. 
 + 
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​. 
 + 
 +Calculați totalul de octeți ocupat de fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​. **Indicație**:​ Dacă aveți numere (câte unul pe linie) pe care vreți să le adunați, folosiți construcția ''​paste -s -d '​+'''​. Pentru a efectua calculul, folosiți comanda ''​bc''​. 
 + 
 +==== Fișiere ordonate după dimensiune ==== 
 + 
 +Listați primele 10 **fișiere obișnuite** (//regular files//) din ierarhia ''/​etc''​ (adică din toate directoarele,​ subdirectoarele și subdirectoarele acestora etc.) sortate în ordinea dimesiunii ocupate de fiecare fișier. 
 + 
 +<note tip> 
 +Folosiți ''​find''​ cu opțiunea ''​-exec'',​ ''​stat''​ (cu opțiunea ''​-c''​ și formatul necesar pentru afișarea numelui și dimensiuni ca argument către opțiunea ''​-exec''​ a lui ''​find''​),​ ''​sort''​ și ''​head''​. 
 + 
 +Exemplu de rulare pentru ''​find''​ cu ''​-exec''​ este<​code>​ 
 +find /etc/ -type f -exec ls -l {} \; 
 +</​code>​ 
 +</​note>​ 
 + 
 +==== Construire fișier cu informații binare ==== 
 + 
 +Creați un fișier care să conțină 2048 de octeți de zero (din ''/​dev/​zero''​) urmați de 2048 de octeți aleatori (din ''/​dev/​urandom''​) urmați de 2048 de octeți de zero și apoi urmați de 2048 de octeți din fișierul ''/​bin/​false''​ de la offsetul 4096 al fișierului. 
 + 
 +<note important>​ 
 +Argumentul pentru opțiunile ''​skip''​ și ''​seek''​ ale comenzii ''​dd''​ este dat în număr de blocuri, **nu** în număr de octeți. 
 +</​note>​ 
 + 
 +==== Generare fișiere multiple și conținut aleator ==== 
 + 
 +Folosiți ''/​dev/​urandom'',​ ''​dd''​ și ''​split''​ pentru a genera, într-un one liner, 100 de fișiere a câte 100 de octeți aleatori cu numele ''​partXYZ.dat''​ unde ''​XYZ''​ sunt valorile 000, 001, ..., 099. Adică ''​part000.dat'',​ ''​part001.dat'',​ ..., ''​part099.dat''​. 
 + 
 +<note tip> 
 +''​dd''​ poate scrie la standard output în **absența** opțiunii ''​of''​. 
 + 
 +''​split''​ poate citi de la standard input dacă se folosește construcția ''​-''​ (semnul minus) pentru numele fișierului. 
 +</​note>​ 
 + 
 +==== Compilare fișier ==== 
 + 
 +Creați un fișier ''​.c''​ care să afișeze mesajul ''​Hello,​ world!''​. Compilați-l pentru a obține un executabil. Verificați folosind comanda ''​file''​ că este un executabil format ELF (//​Executable and Linking Format//). Apoi rulați-l. 
 + 
 +==== chroot și executabile statice ==== 
 + 
 +Din fișierul ''​C''​ de mai sus creați un executabil static. 
 + 
 +<note tip> 
 +Pentru a compila static folosiți opțiunea ''​-static''​ la ''​gcc''​. Adică similar cu 
 +<​code>​ 
 +gcc -Wall -static hello.c -o hello-static 
 +</​code>​ 
 +</​note>​ 
 + 
 +<note tip> 
 +Un executabil static nu depinde de biblioteci externe. Puteți vedea acest lucru cu ajutorul comenzii ''​ldd''​ (list dynamic dependencies) peste un executabil static sau dinamic, similar rulării de mai jos: 
 +<​code>​ 
 +ldd ./hello 
 +ldd ./​hello-static 
 +</​code>​ 
 +</​note>​
  
-TODO+Puneți acel fișier în directorul ''/​tmp/​chroot/''​ (trebuie să-l creați în prealabil). Rulați executabilul obținut folosind comanda ''​chroot''​ (adică rulați-l având ca director rădăcină,​ chroot-at, directorul ''/​tmp/​chroot''​).
  
-==== TODO 2 ====+<note tip> 
 +Comanda ''​chroot''​ poate fi rulat doar de ''​root''​. Puteți rula în forma 
 +<​code>​ 
 +sudo chroot /tmp/chroot /​hello-static 
 +</​code>​ 
 +</​note>​
  
-TODO+Încercați apoi același lucru pe un executabil dinamic. Observați că nu funcționează. Copiați în directorul de chroot (''/​tmp/​chroot/''​) bibliotecile aferente în directoarele corespunzătoare,​ astfel încât să funcționeze.
  
-==== TODO 2 ====+<note tip> 
 +Bibliotecile le determinați cu ajutorul comenzii ''​ldd''​ peste executabilul dinamic. 
 +</​note>​
  
-TODO+<note tip> 
 +Folosiți opțiunea ''​%%--parents%%''​ pentru ''​cp''​ pentru a crea la destinație calea completă către fișierele de tip bibliotecă. 
 +</​note>​
  
 +Adăugați în fișierul ''​C''​ un apel de tipul ''​sleep''​ sau ''​pause''​ și refaceți pașii de mai sus. În timp ce executabilul rulează porniți, din altă consolă, o comandă ''​lsof''​ pentru a afișa fișierele deschide de acest proces. Observați directorul rădăcină al procesului (''​rtd''​).
medium-unix/capitole/capitol-03.1463409010.txt.gz · Last modified: 2016/05/16 17:30 by razvan