====== 17. Bune practici ======
==== Slide-uri ====
[[http://koala.cs.pub.ro/training/res/linux-admin/slides/cap-17.pdf|Slide-uri capitol 17]]
===== Exerciții =====
===== [1] Structură de directoare =====
Creați următoarea structură de directoare și de fișiere, denumite exact ca mai jos (în ''/home/training''):
În listing-ul de mai jos numele care se încheie cu ''/'' (//slash//) sunt nume de directoare. Numele care **nu** se încheie cu ''/'' (//slash//) sunt nume de fișiere obișnuite.
* ''seriale/'' (director). Acesta va conține fișierele:
* ''suits''
* ''grey's anatomy''
* ''dr. who''
* ''downton abbey''
* ''house md''
* ''carti/'' (director). Acesta va conține următoarele directoare:
* ''rusia/''
* ''dostoievski''
* ''tolstoi''
* ''marea britanie/''
* ''shakespeare''
* ''charles dickens''
* ''joanne k rowling/''
* ''john ronald reuel tolkien''
* ''franta/''
* ''balzac''
* ''jean de la fontaine''
Verificarea la acest exercițiu se face arătând trainerului **o singură comandă**, pentru directoarele ''seriale'' și ''carti''.
===== [2] Utilizatori și permisiuni =====
* Adăugați în sistem utilizatorii: ''harry'', ''meredith'', ''wilson'', ''gandalf'', ''vladimir''. Toți utilizatorii vor avea parola ''training''.
* Configurați permisiunile asupra directorului ''rusia'' astfel încât utilizatorul ''vladimir'' are drepturi depline și restul utilizatorilor (inclusiv grupul ce deține fișierul) nu au niciun drept.
* Configurați permisiunile astfel încât utilizatorul ''harry'' are drepturi depline asupra directorului ''joanne k rowling'' și ''gandalf'' are doar drepturi de citire (și de navigare în interiorul directorului, adică drept de execuție). Ceilalți nu au nici un drept asupra directorului.
===== [3] Utilizatori și procese =====
Scrieți un script care pentru un anumit nume de utilizator (exemplificați pe ''training'') afișează următoarele informații:
* home directory-ul lui
* identificatorul utilizatorului (UID)
* Dacă utilizatorul există în sistem: afișează procesele deținute de acesta și următoarele informații despre acestea: PID, PPID, CPU load, MEM load și comanda care a pornit procesul respectiv.
* Sortează procesele după câtă memorie au ocupat.
* Trimite semnalul ''SIGINT'' procesului care consumă cea mai multă memorie.
Încercați să prelucrați conținutul fișierului ''/etc/passwd'' pentru primele 2 subpuncte. Apoi înlănțuiți rezultatul prelucrării, folosind un anumit operator Bash cu o comandă ''ps''.
Pentru primele 2 bullet-uri puteți folosi și separat comenzile ''id'', respectiv ''finger''.
Deși ''htop'' este tool-ul cel mai potrivit pentru ultimele 2 bullet-uri, nu îl putem folosi decât în mod interactiv. Așa că avem nevoie de ''ps'' și să filtrăm output-ul comenzii, să folosim opțiunea ''%%--sort%%'' pentru sortare după coloanei de MEM load pentru a determina PID-ul procesului care consumă cele mai multe resurse.
===== [4] Servicii de rețea =====
* Instalați în sistem serverul web ''apache2'', apoi porniți daemon-ul aferent serviciului web ''apache2''. După ce serviciul e pornit, determinați pe ce port ascultă conexiuni serviciul web ''apache2''.
* Scanați ce porturi sunt deschise pe serverul ''rosedu.org''.
Când nu știți cum se numește un pachet, dar știți aproximativ ce cuvinte cheie conține numele pachetului sau descrierea lui folosiți comanda ''apt-cache search ''
Orice daemon/serviciu se pornește folosind fie comanda ''service'':
service start
service restart
service stop
sau folosind scriptul său aferent din ''/etc/init.d'':
/etc/init.d/ {start|stop|restart}
Aveți nevoie de drepturi privilegiate pentru a rula comanda.
Pentru a afișa informații despre serviciile locale (inclusiv porturile pe care acestea ascultă conexiuni). Folosiți opțiunile pentru afișarea PID-ului și a numelui procesului și pentru afișarea doar serviciilor care ascultă (//listen//) conexiuni în rețea.
Pentru a scana porturile deschise de un server la distanță folosiți comanda ''nmap'' cu opțiunile aferente.
===== [5] Montare de sisteme de fișiere =====
* Creați un folder ''/mnt/dummy''
* Creați un fișier care are doar octeți de zero de 100 MB numit ''zero100M.dat''. Creați un sistem de fișiere ''ext3'' peste fișierul ''zero100M.dat'' folosind comanda ''mkfs.ext3''.
* Montați un sistem de fișiere de tip ''ext3'' în ''/mnt/dummy''
Pentru montarea unui sistem de fișiere aflat pe un fișier (în cazul de față ''zero100M.dat'') folosiți opțiunea ''-o loop'' la comanda ''mount''.
===== [6] Logging =====
* Verificați dacă daemonul de ''syslog'' este instalat
* Configurați sistemul astfel încât TOATE mesajele din sistem sa fie înregistrate în ''/var/log/all_logs''. Verificați acest lucru.
în ''/etc/rsyslog.conf'' e nevoie de o intrare. Apoi serviciul/daemonul syslog trebuie repornit. Pentru a verifica faptul că mesajele se salvează în ''/var/log/all_logs'' puteți genera mesaje folosing comanda ''logger''.
* Configurați sistemul astfel încât fisierul ''/var/log/all_logs'' să fie rotit zilnic, folosind până la maxim 20 de fișiere, care ulterior să fie comprimate.
Configurația se face în ''/etc/logrotate.conf'', ''man logrotate'' pentru exemple
===== [7] System info at startup =====
Realizați configurațiile necesare astfel încât de fiecare dată când deschide terminalul, utilizatorul training să fie întâmpinat de mesajul:''Hello, training! Here are some statistics: data, our IP is $IP_ADDR, sysuptime, disk load''. Adresa IP va fi cea a interfeței ''eth0''.
În loc de ''data'' veți afișa data și ora sub forma: ''12-01-2015,21:17:59''.
În loc de ''sysuptime'' veți afișa informații despre când a avut loc ultimul boot (de cât timp este sistemul up), load average și câți useri sunt în prezent (si care) logați în sistem. Variabila ''$IP_ADDR'' va fi reținută în variabilă de mediu accesibilă oricărui proces și oricărui terminal!
În loc de ''diskload'' veți afișa informații despre primele 3 partiții care sunt cele mai încărcate, plus tipul sistemului de fișiere, ca spațiu ocupat.
Configurațiile se fac în fișierul ''/etc/bash.bashrc''
training@uso:~$ cat /etc/bash.bashrc
(...)
export IP_ADDR=$(ifconfig eth0 | grep inet | tr -s ' ' | head -n 1 | awk -F '[ :]+' ' { print $4 }')
date +%d-%m-%Y,%H:%M:%S
echo $(uptime)
echo $(who)
df -hT | tr -s ' ' | sort -t ' ' -k 3n -r | tail -n +2 | head -n 3
(...)
===== [8] Configurații de rețea (cont.) =====
* **(1p)** Configurați static lookup table astfel încât să nu fie necesară interogarea DNS pentru adresele: ''swarm.cs.pub.ro'', ''elf.cs.pub.ro'', ''ocw.cs.pub.ro''
* Primul pas este să determinați adresa IP pentru cele trei servere
===== [9] Mass user add script =====
Descărcați spreasheet-ul [[https://docs.google.com/spreadsheets/d/1z448_KQaH1h-Yqp0thEYKTnuCywPEhJGk0I649UWJLU/edit?usp=sharing|de aici]] în format CSV. Folosiți '','' ca separator. Pe baza CSV-ului realizați un script care:
* afișează studenții sortați alfabetic
* adaugă în sistem grupurile ce poartă numele facultății din care fac parte studenții
* adaugă în sistem utilizatorii sub forma ''prenume.nume'' și îi adaugă în grup conform facultății la care sunt studenți
* adaugă (neinteractiv) parola ''training'' pentru toți utilizatorii.
* Nu puteți folosi ''adduser'' în script