This is an old revision of the document!
TODO
Dorim să afișăm anumite procese într-o anumită ordine.
Folosiți ps
cu opțiunea corectă pentru a afișa procesele care aparțin utilizatorului student
. Căutați în pagina de manual după șirul user.
Pentru procesele de mai sus afișați PID-ul, comanda completă (cale completă cu parametri), timpul de rulare pe procesor, memoria RAM consumată (RSS – resident set size). Pentru a selecta doar anumite atribute ale unui proces folosiți comanda ps
cu parametrul -o
urmat de opțiunile specifice; urmăriți și pagina de manual.
Sortați procesele de mai sus în ordinea inversă a memoriei RAM consumate (RSS – resident set size). Adică cele mai consumatoare de memorie procese la început.
Din procesele sortate rețineți doar primele 10 intrări. Să afișați și antetul oferit de ps
.
Dorim să lucrăm cu grupuri de procese care țin de un utilizator.
Pe un tab nou de terminal adăugăm utilizatorul ana
folosind comenzile
$ sudo su # adduser ana [...] # exit # sau puteti folosi combinatia de taste Ctrl+d $
În acel tab nou ne autentificăm ca utilizatorul ana
folosind comanda
$ su - ana
În cel nou tab, din contul utilizatorului ana
, porniți în background mai multe procese: sleep
, emacs
, gedit
etc.
Din primul tab, folosiți, ca root
, pkill
pentru o încheia execuția proceselor utilizatorului ana
; adică rulați sudo pkill ...
(cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul SIGKILL
ca să fie garantată încheierea execuției.
pkill
puteți folosi comanda killall
cu opțiunile potrivite.
Pe un tab nou de terminal porniți în background procese ca utilizatorul root
, student
și ana
.
În acel tab aflăm care este identificatorul terminalului curent folosind comanda
$ tty
Din primul tab, folosiți, ca root
, pkill
pentru o încheia execuția proceselor de pe al doilea terminal; adică rulați sudo pkill ...
(cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul SIGKILL
ca să fie garantată încheierea execuției.
Ne interesează pentru un proces dat care sunt fișierele deschise de un proces, sau, de fapt, descriptorii de fișier deschiși de un proces. De exemplu, dacă dorim să identificăm descriptorii de fișier deschiși de shell-ul curent folosim comanda
lsof -p $$
În fișierele deschise vom putea vedea descriptorii de fișier standard (0
, 1
sau 2
). Observăm că acești descriptori referă un dispozitiv de tip terminal, de forma /dev/pts/0
pentru că astfel interacționează procesul cu utilizatorul.
Dacă dorim să vizualizăm descriptorii deschiși de un proces daemon, de exemplu sshd
sudo lsof -p $(pidof sshd)
Observăm și descriptorii de fișier standard și sockeții TCP deschiși (2 sockeți care ascultă pe portul 22 atât pe IPv4 cât și pe IPv6).
Folosiți lsof
pentru a investiga și descriptorii deschiși de procesul init
.
Putem folosi lsof
pentru a verifica modul în care redirectarea afectează descriptorii unui proces.
Într-un tab de terminal porniți un proces sleep
folosind comanda
sleep 100
În alt tab, pentru a investiga descriptorii procesului sleep
folosim comanda
lsof -p $(pidof sleep)
Observăm că descriptorii standard referă terminalul în care a fost rulată comanda, moșteniți de la terminalul din shell-ul folosit.
Acum să invesigăm procesul sleep
cu redictări în diverse fișiere. Folosiți comanda
sleep 100 < /dev/zero > /dev/null 2> error.txt
Folosim comanda lsof
anterioară pentru a investiga descriptorii procesului sleep
. Putem observa unde pointează descriptorii standard de fișier pentru procesul pornit.
Folosiți lsof
pentru a investiga descriptorii deschiși de cele trei procese sleep
din cadrul comenzii
sleep 100 | sleep 120 | sleep 140
Urmăriți ce înseamnă operatorul pipe (|
) si ce impact are asupra descriptorilor de fișier ai unui proces.
Pentru a determina sockeții deschiși în cadrul sistemului folosim comanda netstat
. Modurile uzuale de lucru ale comenzii sunt:
netstat -tlpn netstat -tpn netstat -ulpn netstat -lpn
Aceleași opțiuni sunt folosite și pentru comanda ss
.
Urmăriți și din output-ul comenzilor și din pagina de manual ce efect au fiecare dintre comenzile de mai sus.
Dacă dorim deschiderea unui server/serviciu pe sistemul curent putem folosi comanda
netcat -l -p 12345
Comanda de mai sus va deschide un server TCP pe portul 12345
.
Pentru a deschide o conexiune către acest serviciu folosim comanda
netcat <hostname> 12345
unde <hostname>
este numele stației sau adresa IP a stației. Pentru o conexiune pe stația locală folosiți comanda
netcat localhost 12345
Investigați folosind comanda netstat
sau comanda s
conexiunea astfel deschisă.
Pachetul python
vine cu un server web simplu care poate fi pornit pentru a servi fisiere din directorul curent. Pentru pornirea sa folositi comanda
python -m SimpleHTTPServer
Investigati folosind netstat
si s
portul pe care asculta conexiuni (afisat si la pornirea sa) si pointati browser-ul la URL-ul http://localhost:8000/ pentru a putea urmari fisierele servite. Un coleg poate sa se conecteze la acest server web folosind in loc de localhost
adresa IP a statiei voastre.
In momentul in care un browser acceseaza un clip video acesta incepe sa faca streaming si sa descarce fisierul aferent in sistemul local de fisiere. Firefox descarca clip-urile video in directorul /tmp
, dar le sterge acel hard link
si nu pot fi obtinute direct. Putem insa sa le determinam si obtinem prin investigatie si folosind lsof
sau /proc
.
Pentru aceasta, accesati folosind Firefox un clip video de pe YouTube. Clipul va fi streamuit si puteti observa cum se descarca.
Pentru a vedea care sunt fisierele deschise de Firefox avem doua optiuni date de cele doua comenzi de mai jos:
lsof -p $(pidof firefox) ls /proc/$(pidof firefox)/fd
Printre fisierele deschise de procesul firefox putem observa si cel putin un fisier care se gaseste in /tmp
, fisier care insa nu exista. Avem insa un descriptor catre el; a fost sters hard link-ul din /tmp
dar nu si fisierul efectiv. Pentru a recupera fisierul, daca descriptorul sau este <FD>
vom folosi comanda
cp /proc/$(pidof firefox)/fd/<FD> myclip
Folosim comanda
vlc myclip
pentru a porni clipul.
Comanda strace
(system call trace) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește.
De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ls
folosim comanda
strace ls
Output-ul fiind destul de vast, ne preocupă să obținem doar informații despre fișierele deschide. Pentru aceasta folosim opțiunea -e
a comenzii strace
cu ajutorul căreia filtrăm tipuri de operații. În cazul de față folosim comanda
strace -e file ls
Observăm fișierele deschise.
Pentru a vedea diferența între comenzile ls
și ls -l
folosim comanda
strace -e file ls -l
Observăm că acum deschise și fișiere precum /etc/passwd
și /etc/group
pentru a determina username-ul și grupul aferent UID-ului și GID-ului din fișier.
Comanda
netstat -s
afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile.
Rulați comanda
strace -e open netstat -s
pentru a afla ce fișiere deschide comanda la rulare.
Care fișier este citit pentru a afla informații despre pachetele primite (packets received)? Vizualizați acel fișier (luați-o pe încercate).
strace
permite investigarea unui proces aflat deja în rulare. Numim acest lucru atașarea la un proces. Putem astfel investiga apelurile de sistem efectuate de un proces aflat în rulare și diagnostica anumite probleme ale acestuia. Pentru a ne putea atașa la un proces avem nevoie de PID-ul acestuia.
Deschideți două tab-uri de terminal (adică să aveți două deschise; dacă aveți deja unul mai deschideți încă unul).
Ctrl+Shift+t
.
Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda
echo $$
Pentru a investiga shell-ul, din celălalt tab folosim comanda
strace -p <PID>
unde <PID>
este PID-ul shell-ului determinat mai sus.
Acum dacă în celălalt shell rulăm comenzi vom vedea ce se întâmplă în cadrul shell-ului.
Observăm că se folosește apelul de sistem clone
pentru a crea un nou proces, dar nu apare apelul de sistem execve
care înlocuiește imaginea de proces. Pentru a vedea aceste apeluri de sistem trebuie să precizăm comenzii strace
să investigheze și procesele copil folosind opțiunea -f
(de la follow children
). Astfel, vom putea investiga folosind comanda
strace -f -p <PID>
Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda
strace -f -e process,file -p <PID>
Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie “omorât” ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon.
Pentru a detașa un proces de un terminal se folosesc comenzi precum nohup
, dtach
și disown
.
Folosiți comanda wget
pentru a descărca fișierul .torrent
de aici.
Porniți un proces BitTorrent
folosind comanda:
btdownloadheadless lin-prog.torrent
btdownloadheadless
instalat pe sistem instalați pachetul bittorrent
sudo apt-get install bittorrent
sau pachetul bittornado
sudo apt-get install bittornado
Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda disown
. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof
pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Apoi încheiați execuția acelui proces.
Folosiți comanda nohup
pentru a crea un proces BitTorrent precum cel de mai sus, detașat de terminal. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof
pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Trimiteți un semnal procesului pentru a-i încheia execuția și apoi reporniți-l sub nohup
astfel încât ieșirea standard (standard output, stdout) să fie redirectată la /dev/null
iar ieșirea de eroare standard (standard error, stderr) să fie redirectată în fișierul err.log
. Investigați cu lsof
unde pointează descriptorii standard ai procesului.
Pentru pornirea acesteia deschideți VirtualBox, apoi folosiți File → Import Appliance
și navigați în /mnt/sda5/uso/lab07/puccini-lab7.ova
de unde să importați mașina virtuală.
Mașina virtuală are pentru acces contul student
cu parola student
și este conectabilă la sistemul fizic pe interfața sa eth1
. Ar trebui ca pe interfața eth1
a mașinii virtuale sa aveți o adresă din rețeaua 192.168.56.0/24
, de obicei 192.168.56.101
.
Interfața pereche a interfeței eth1
de pe mașina virtuală este interfața vboxnet0
pe sistemul fizic. Aceasta are adresa 192.168.56.1
.
Încercați acum să vă conectați prin SSH de pe mașina virtuală pe sistemul fizic folosind comanda ssh
folosind o comandă de forma
ssh student@192.168.56.1
Parola este student
.
Acum încercați și invers, să vă conectați de la sistemul fizic la mașina virtuală. Veți întâmpina diverse tipuri de probleme. Rezolvați-le.
Apoi configurați autentificarea fără parolă (pe bază de chei) de la utilizatorul student
de pe sistemul fizic la utilizatorul student
și la utilizatorul root
de pe mașina virtuală. Va trebui să ajungă cheia publică a utilizatorului student
de pe sistemul fizic în fișierul ~/.ssh/authorized_keys
din directorul home al utilizatorilor student
și root
pe mașina virtuală.
Obiectivul acestui exercițiu este ca asistentul să ajungă pe mașina voastră virtuală de pe laptop-ul său. Pentru aceasta trebuie să faceți două lucruri:
student
de pe mașina virtuală.2222
pe sistemul fizic să ajungă pe portul 22
pe mașina virtuală.Pentru pasul 2, pe sistemul fizic folosiți o comandă de forma
sudo iptables -t nat -A PREROUTING -i ethX -p tcp --dport 2222 -j DNAT --to-destination <IP-vm>:22 sudo sysctl -w net.ipv4.ip_forward=1
unde:
ethX
este eth0
sau eth1
sau eth2
este interfața de Internet a sistemului fizic, cu o adresă din spațiul 172.16.4.0/22
<IP-vm>
este adresa IP a mașinii virtuale (adresa din rețeaua 192.168.56.0/24
Iar pe mașina virtuală rulați comanda de mai jos pentru a crea o rută din mașina virtuală către rețeaua fizică
sudo ip route add 172.16.4.0/22 via 192.168.56.1
Cu această rută veți permite pachetelor să se întoarcă din mașina virtuală către cheia SSH a asistentului.
Asistentul va încerca conexiunea la adresa IP a sistemului vostru fizic pe portul 2222
și, dacă e totul bine, va ajunge pe mașina voastră virtuală.
iptables
pentru DNAT găsiți în laboratorul 9 de RL: Translatarea de adrese.
sudo iptables -t nat -F
TODO
Configurați daemon-ul syslog de pe mașina virtuală să livreze mesajele de jurnalizare emise de SSH (de facilitatea auth
) către daemonul de syslog de pe sistemul fizic. Adică daemonul de syslog de pe sistemul fizic va fi listener pentru mesajele livrate de pe mașina virtuală.
Realizați conexiuni SSH de pe mașina fizică spre mașina virtuală pentru a declanșa mesaje de jurnalizare.
Realizați o conexiune SSH care folosește X Forwarding de la sistemul fizic la mașina virtuală. Porniți utilitarul xterm
. Instalați orice pachete sunt necesare pentru a permite rularea utilitarului xterm
.
Porniți manual, pe mașina virtuală, folosind executabilul /usr/sbin/sshd
ca să asculte conexiuni pe portul 22
. Încercați conexiuni către server de pe sistemul fizic.
Rulați serverul de SSH sub strace
(eventual folosind opțiunea -f
) și urmăriți ce se întâmplă atunci când se încearcă noi conexiuni.