This shows you the differences between two versions of the page.
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''). |