This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
advanced-unix:capitole:capitol-06 [2016/05/09 01:21] razvan created |
advanced-unix:capitole:capitol-06 [2016/05/12 12:44] (current) razvan [Schimbare parolă utilizatori] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== 6. Shell scripting ====== | ====== 6. Shell scripting ====== | ||
- | automatizare și prelucrare | + | Pentru funcționalități de automatizare folosim shell scripting. Un script shell este o înlănțiure de comenzi agregate pentru un scop final. Un shell script este o formă //quick'n'dirty// de automatizare. Pentru aspecte mai complexe, este util să se folosească forme avansate de automatizare precum Awk, Python, Perl sau altele. |
===== Subiecte abordate ===== | ===== Subiecte abordate ===== | ||
+ | |||
+ | * Ce este un script shell? | ||
+ | * Comenzi: comandă, argumente/parametri, input, output, valoare de retur | ||
+ | * Înlănțuirea comenzilor | ||
+ | * Filtre de text | ||
+ | * One linere | ||
+ | * Variabile în shell, expandarea în shell | ||
+ | * Comenzi pentru controlul fluxului | ||
+ | |||
+ | ==== Best practices ==== | ||
+ | |||
+ | * Comenzi neinteractive în shell | ||
+ | * Shell scripting este //quick'n'dirty// | ||
+ | * ''for'' vs. argumente în listă vs. ''while read'' | ||
+ | * ''if <command>'' | ||
+ | * ''tr'' vs. ''sed'' | ||
+ | * ''cut'' vs. ''awk'' | ||
+ | |||
+ | ==== Utilitare folosite ==== | ||
+ | |||
+ | * ''find'', ''stat'', ''basename'', ''dirname'' | ||
+ | * ''echo'', ''cat'', ''head'', ''tail'', ''nl'', ''tac'', ''rev'' | ||
+ | * ''cut'', ''tr'', ''sort'', ''uniq'', ''grep'', ''awk'', ''sed'' | ||
+ | * ''seq'', ''for'', ''if'', ''test'', ''while read'' | ||
===== Resurse utile ===== | ===== Resurse utile ===== | ||
Line 9: | Line 33: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
+ | ==== Demo: Folosire filtre de bază ==== | ||
+ | |||
+ | Folosire head, tail, sort, uniq, cut, tr. | ||
+ | |||
+ | ==== Demo: Folosire sed și awk ==== | ||
+ | |||
+ | Folosire sed pentru substituție. | ||
+ | |||
+ | Folosire sed pentru ștergere. | ||
+ | |||
+ | Folosire sed pentru interschimbare. | ||
+ | |||
+ | Folosire awk pentru afișarea unor coloane. | ||
+ | |||
+ | Folosire awk și expresii regulate pentru afișarea unor coloane. | ||
+ | |||
+ | ==== Demo: Folosire avansată grep și sort ==== | ||
+ | |||
+ | Afișați fișierele din ierarhia ''/usr/include'' în ordinea numărului de apariții ale **cuvântului** ''FILE''. | ||
+ | |||
+ | ==== Demo: Folosire while read ==== | ||
+ | |||
+ | Listați numele protocoalelor cu număr de port între 100 și 200. Portul se obține din fișierul ''/etc/services''. | ||
+ | |||
+ | ==== Demo: Creare directoare în home-urile mai multor utilizatori ==== | ||
+ | |||
+ | Pentru început adăugați în sistem utilizatorii ''ana'', ''bogdan'', ''corina'', ''dan'' și ''elena'' folosind utilitarul ''adduser''. | ||
+ | |||
+ | Ca root, parcurgeți utilizatorii sistemului care au home-ul în ''/home/'', și creați un director ''public_html'' în home-ul fiecăruia. | ||
+ | |||
+ | Realizați apoi un one-liner sau un script care să șteargă directorul ''public_html''. | ||
+ | |||
+ | ==== Creare directoare și schimbare permisiuni ==== | ||
+ | |||
+ | Ca root, parcurgeți utilizatorii sistemului care au home-ul în ''/home/'', și creați un director ''public_html'' în home-ul fiecăruia. Schimbați ownership-ul acelui director la utilizator folosind ''chown''. | ||
+ | |||
+ | ==== Creare directoare cu un alt nume ==== | ||
+ | |||
+ | Realizați pasul de mai sus doar că schimbați numele directorului nou creat în ''public_html_<UID>'' unde ''UID'' este numele de utilizator al utilizatorului. | ||
+ | |||
+ | ==== 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''. | ||
+ | |||
+ | Recomandăm pașii de mai jos. | ||
+ | |||
+ | Parcurgeți folosind ''for'' intrările din ''/usr/share/man/man5/''. | ||
+ | |||
+ | Folosiți comanda ''basename'' pentru a extrage doar numele de bază al fișierului. | ||
+ | |||
+ | <note tip> | ||
+ | Comanda ''basename'' ca argumente numele fișierului și extensia care va fi **eliminată** din numele fișierului, rămânând doar cu numele de bază. | ||
+ | |||
+ | Trebuie să scoateți extensia ''5.gz''. | ||
+ | </note> | ||
+ | |||
+ | Din lista de mai sus, extrageți doar comenzile care încep cu o anumită literă. Adică din outputul de mai sus, folosiți o comandă de forma ''grep '^a''' pentru a extrage liniile care încep cu litera ''a'' folosind ''grep''. | ||
+ | |||
+ | ==== Schimbare parolă utilizatori ==== | ||
+ | |||
+ | Vrem să schimbăm parola utilizatorilor care au directorul home în ''/home'' și să facem asta corect :-) Vom crea un script numit ''change-home-users-pw''. | ||
+ | |||
+ | Pentru început adăugați în sistem utilizatorii ''ana'', ''bogdan'', ''corina'', ''dan'' și ''elena'' folosind utilitarul ''adduser''. | ||
+ | |||
+ | În cadrul scriptului folosiți ''/etc/passwd'', ''while'' și ''read'' pentru a afișa doar numele utilizatorilor (//username//) care au home-ul în ''/home''. | ||
+ | |||
+ | <note tip> | ||
+ | În cadrul buclei ''while'', puteți folosi o construcție de forma ''echo $var | grep '^/home/''' pentru a afla dacă variabila ''var'' începe cu șirul ''/home''. | ||
+ | |||
+ | Sau dacă folosiți ''awk'' nu mai aveți nevoie de construcția de mai sus. | ||
+ | </note> | ||
+ | |||
+ | Pentru parole generați o parolă folosind utilitarul ''pwgen''. Parola trebuie să aibă 12 caractere și să conțină numere și caractere speciale. | ||
+ | |||
+ | <note tip> | ||
+ | Parcurgeți pagina de manual a comenzii ''pwgen'' sau exemplele de aici: http://www.maketecheasier.com/password-generators-for-linux/ | ||
+ | </note> | ||
+ | |||
+ | Schimbați, în mod neinteractiv, folosind comanda ''chpasswd'', parola pentru utilizatorii sistemului care au home-ul în ''/home''. După schimbarea parolei afișați la ieșirea standard, pentru fiecare utilizator, numele de utilizator și noua parolă. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți o construcție de forma ''%%echo ... | sudo chpasswd%%'' pentru schimbarea parolei în mod neinteractiv. Vedeți și exemplele de aici: http://linoxide.com/linux-command/change-passwords-batch-mode-chpasswd/ | ||
+ | </note> | ||