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-06 [2016/05/19 11:34] razvan [Creare directoare și schimbare permisiuni] |
medium-unix:capitole:capitol-06 [2016/05/19 13:04] (current) razvan [Generare parole aleatoare] |
||
---|---|---|---|
Line 137: | Line 137: | ||
</code> | </code> | ||
unde ''<path/to/folder>'' este calea către directorul pe care dorim să-l verificăm. | unde ''<path/to/folder>'' este calea către directorul pe care dorim să-l verificăm. | ||
+ | |||
+ | Pentru afișarea tuturor directoarelor ''public_html'' din home-urile utilizatorilor puteți folosi un glob în forma<code> | ||
+ | ls -ld /home/*/public_html/ | ||
+ | </code> | ||
</note> | </note> | ||
+ | |||
==== Creare directoare și schimbare permisiuni ==== | ==== Creare directoare și schimbare permisiuni ==== | ||
Line 156: | Line 161: | ||
</code> | </code> | ||
unde ''<path/to/folder>'' este calea către directorul pentru care dorim să verificăm ownership-ul. | unde ''<path/to/folder>'' este calea către directorul pentru care dorim să verificăm ownership-ul. | ||
+ | |||
+ | Pentru afișarea de informații despre directoarele ''public_html'' din home-urile utilizatorilor puteți folosi un glob în forma<code> | ||
+ | ls -ld /home/*/public_html/ | ||
+ | </code> | ||
</note> | </note> | ||
+ | |||
+ | |||
==== Numele paginilor de manual dintr-o anumită secțiune ==== | ==== Numele paginilor de manual dintr-o anumită secțiune ==== | ||
- | Afișați numele paginilor de manual din secțiunea 5. Numele sunt partea fără extensie din fișierele existente în ''/usr/share/man/man5/''. De exemplu, pentru fișierul ''issue.5.gz'', numele este ''issue''. | + | Afișați numele paginilor de manual din secțiunea 5. Numele sunt partea fără extensie din fișierele existente în directorul ''/usr/share/man/man5/''. De exemplu, pentru fișierul ''issue.5.gz'', numele este ''issue''. |
Recomandăm pașii de mai jos. | Recomandăm pașii de mai jos. | ||
Line 165: | Line 176: | ||
Construiți glob-ul care să afișeze toate fișierele cu extensia ''.5.gz'' din directorul ''/usr/share/man/man5/''. | Construiți glob-ul care să afișeze toate fișierele cu extensia ''.5.gz'' din directorul ''/usr/share/man/man5/''. | ||
- | Folosiți comanda ''basename'' pentru a extrage doar numele de bază al fișierului. folosiți | + | <note important> |
+ | **Nu** este nevoie să folosiți ''find'', puteți folosi un glob. | ||
+ | </note> | ||
+ | |||
+ | Folosiți comanda ''basename'' pentru a extrage doar numele de bază al fișierului. | ||
<note tip> | <note tip> | ||
Comanda ''basename'' ca argumente numele fișierulelor. Pentru a elimina extensia folosiți opțiunea ''-s'' a comenzii ''basename''. | Comanda ''basename'' ca argumente numele fișierulelor. Pentru a elimina extensia folosiți opțiunea ''-s'' a comenzii ''basename''. | ||
- | Trebuie să scoateți extensia ''5.gz''. | + | Opțiunea ''-s'' a comenzii ''basename'' primește ca argument extensia ce trebuie scoasă. Trebuie să scoateți extensia ''5.gz''. |
</note> | </note> | ||
Line 187: | Line 202: | ||
Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '','' (virgulă) pentru fișierele din ierarhia ''/etc/'' care au extensia ''.conf''. | 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''. | + | Calculați totalul de octeți ocupat de fișierele din ierarhia ''/etc/'' care au extensia ''.conf''. |
+ | <note tip> | ||
+ | Dacă aveți numere (câte unul pe linie) pe care vreți să le adunați, folosiți construcția filtrați output-ul prin comanda ''%%paste -s -d '+'%%''. Adică ceva de forma | ||
+ | <code> | ||
+ | stat ... | paste -s -d '+' | ||
+ | </code> | ||
+ | Output-ul comenzii de mai sus este acum o expresie aritmetică ce poate fi evaluată. Comanda ''%%paste -s -d '+'%%'' serializează liniile (opțiunea ''-s'') punând între ele caracterul ''+'' (pentru adunare). | ||
+ | |||
+ | Pentru a efectua calculul, filtrați expresia aritmetică folosită mai sus prin comanda ''bc''. Comanda ''bc'' (un calculator în linia de comandă) primește o expresia aritmetică la standard input și o afișează la standard output. Adică o constructție de forma | ||
+ | <code> | ||
+ | stat ... | paste -s -d '+' | bc | ||
+ | </code> | ||
+ | </note> | ||
==== Fișiere ordonate după dimensiune ==== | ==== Fișiere ordonate după dimensiune ==== | ||
Line 194: | Line 221: | ||
<note tip> | <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''. | + | Folosiți find pentru a extrage fișierele. Apoi folosiți expandarea comenzii și ''stat'' pentru a afișa doar numele și dimensiunea fișierului. Adică o construcție de forma |
+ | <code> | ||
+ | stat -c ... $(find ...) | ||
+ | </code> | ||
- | Exemplu de rulare pentru ''find'' cu ''-exec'' este<code> | + | Apoi filtrați output-ul comenzii de mai sus cu ajutorul comenzii ''sort'' pentru a sorta **numeric** în funcție de dimensiunea fișierului. Adică o construcție de forma: |
- | find /etc/ -type f -exec ls -l {} \; | + | <code> |
+ | stat -c ... $(find ...) | sort ... | ||
</code> | </code> | ||
- | </note> | ||
+ | Apoi filtrați output-ul prin comanda ''tail'' pentru a extrage doar primele ''10'' fișiere, în ordinea dimensiunii. Adică o construcție de forma: | ||
+ | <code> | ||
+ | stat -c ... $(find ...) | sort ... | tail | ||
+ | </code> | ||
+ | </note> | ||
==== Construire fișier cu informații binare ==== | ==== 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. | 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 tip> | ||
+ | Folosim opțiunile ''skip'' și ''seek'' ale ''dd'' pentru a putea sări peste regiuni din fișierul de la intrare și din fișierul de la ieșire. Mai multe informații mai jos. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Sintaxa comenzii poate fi la modul | ||
+ | <code> | ||
+ | dd if=/dev/zero of=myfile.out bs=512 count=4 | ||
+ | </code> | ||
+ | Comanda de mai sus copiază din fișierul de intrare (''if'': //input file//) ''/dev/zero'' la fișierul de ieșire (''of'': //output file//) ''myfile.out'', un număr (//count//) de ''4'' blocuri de dimensiune ''512'' (''bs'': //block size//). | ||
+ | |||
+ | Pentru exercițiul curent este recomandat să folosiți dimensiunea blocului de ''2048'' de octeți (''bs=2048''). | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Ca să investigăm conținutul binar al unui fișier folosind comanda ''xxd'' într-o construcție de forma | ||
+ | <code> | ||
+ | xxd myfile.out | ||
+ | </code> | ||
+ | Output-ul este pe două zone: prima zonă (din stânga) sunt afișate datele în format hexazecimal, iar în a doua zonă (din dreapta) în format ASCII, acolo unde se poate. | ||
+ | </note> | ||
<note important> | <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. | 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> | ||
+ | Opțiunea ''seek'' este pentru a sări peste zone din fișierul de ieșire, iar opțiunea ''skip'' este pentru a sări peste zone din fișierul din intrare. | ||
+ | </note> | ||
==== Generare fișiere multiple și conținut aleator ==== | ==== 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''. | 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 important> | ||
+ | **Nu** este nevoie să creați fișiere. Le creează comanda ''split''. | ||
+ | |||
+ | **Nu** este nevoie de ''for'', ''seq'' sau ''touch''. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a genera ''100'' de fișiere a câte ''100'' de octeți va trebui să generați cu comanda ''dd'' conținut de ''100 x 100 = 10000'' (zece mii) de octeți. | ||
+ | </note> | ||
+ | |||
<note tip> | <note tip> | ||
Line 217: | Line 286: | ||
''split'' poate citi de la standard input dacă se folosește construcția ''-'' (semnul minus) pentru numele fișierului. | ''split'' poate citi de la standard input dacă se folosește construcția ''-'' (semnul minus) pentru numele fișierului. | ||
+ | |||
+ | Adică veți trece output-ul comenzii ''dd'' în input-ul comenzii ''split''. | ||
+ | |||
+ | Adică trebuie să aveți o construcție de forma | ||
+ | <code> | ||
+ | dd if=/dev/urandom bs=... count=... | split ... - <prefix> | ||
+ | </code> | ||
+ | Folosiți ca **ultimele** două argumente pentru comanda ''split'' construcția ''-'' (semnul minus) însemnând că citește de la standard input și ''<prefix>'' reprezentând prefixul pe care vreți să îl puneți fișierelor nou create, adică șirul ''part''. | ||
+ | |||
+ | Pentru ''split'' trebuie să folosiți opțiunile care: | ||
+ | * specifică cât de mulți octeți să fie în fiecare fișier generat | ||
+ | * specifică prefixul fișierelor nou create (în cazul nostru ''part'') | ||
+ | * specifică sufixul suplimentar al fișierelor nou create (în cazul nostru ''.dat'' | ||
+ | * specifică faptul că se folosește sufix numeric (''XYZ'' este numeric) | ||
+ | * specifică faptul că se folosește sufix pe 3 caractere (''XYZ'' are trei caractere) | ||
+ | |||
</note> | </note> | ||
==== Căutare cu grep ==== | ==== Căutare cu grep ==== | ||
- | Folosiți ''grep'' pentru a selecta alias-urile cu destinația de forma ''nume.prenume@gmail.com'' din fișierul ''liases'' din [[http://koala.cs.pub.ro/training/res/medium-unix/arc/cap-06-res.zip|arhiva capitolului]]. Intrările din fișierul ''aliases'' se consideră de forma ''alias: destinație''. | + | Folosiți ''grep'' pentru a selecta alias-urile cu destinația de forma ''nume.prenume@gmail.com'' din fișierul ''aliases'' din [[http://koala.cs.pub.ro/training/res/medium-unix/arc/cap-06-res.zip|arhiva capitolului]]. Intrările din fișierul ''aliases'' se consideră de forma ''alias: destinație''. |
==== Generare parole aleatoare ==== | ==== Generare parole aleatoare ==== | ||
Line 234: | Line 319: | ||
Actualizați comanda de mai sus pentru a genera ''20'' de parola a câte ''16'' caractere. | Actualizați comanda de mai sus pentru a genera ''20'' de parola a câte ''16'' caractere. | ||
+ | |||
+ | <note important> | ||
+ | Recomandăm să **nu** folosiți ''for'' (merge, dar vrem să folosim ''fold'' :-P). Vedeți indicațiile legate de folosirea comenzii ''fold'' de mai jos. | ||
+ | </note> | ||
<note tip> | <note tip> | ||
- | Extrageți ''20*16 = 320'' caractere aleatoare și apoi folosiți comanda ''fmt'' cu opțiunea ''-w'' pentru a le grupa în seturi de câte ''16''. | + | Comanda ''fold'' împarte informațiile primite la intrarea standard în linii pe care le afișează la ieșirea standard. Poate să extragă linii de dimensiune dată. Uzual se folosește în forma |
+ | <code> | ||
+ | <command> | fold | ||
+ | </code> | ||
+ | unde ''<command>'' este o comandă care generează informații pe care apoi să le prelucreze comanda ''fold''. | ||
+ | |||
+ | Extrageți ''20*16 = 320'' caractere aleatoare și apoi folosiți comanda ''fold'' cu opțiunea ''-w'' pentru a le grupa în seturi de câte ''16''. Adică o construcție de forma | ||
+ | <code> | ||
+ | cat /dev/urandom | ... | fold -w 16 | ||
+ | </code> | ||
</note> | </note> |