====== 6. Shell scripting ====== 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 ===== * 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 '' * ''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 ===== ===== 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_'' 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. 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''. 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''. Î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. Pentru parole generați o parolă folosind utilitarul ''pwgen''. Parola trebuie să aibă 12 caractere și să conțină numere și caractere speciale. Parcurgeți pagina de manual a comenzii ''pwgen'' sau exemplele de aici: http://www.maketecheasier.com/password-generators-for-linux/ 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ă. 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/