Laborator 01: Introducere și procese

Comenzi utile: ls, ls -l, cd, pwd, vi, chown, chmod, recursive, su, tar, zip, sudo, rm, touch, cp, mv, mkdir, stat, ln, ln -s, who, id, apt-get, apt-cache, man, less, cat, find

01. Folosire man/less cu căutare

Pentru documentarea într-un sistem Linux folosim pagini de manual. De exemplu pentru accesarea paginii de manual a comenzii ls folosim comanda man:

$ man ls

Pentru accesarea paginii de manual a comenzii passwd folosim comanda

$ man passwd

Paginile de manual au secțiuni. Pentru a vedea care este semnificatia fiecarei sectiuni, consultati comanda

$ man man

. Astfel dacă dorim să accesăm pagina de manual a fișierului /etc/passwd folosim comanda

$ man 5 passwd

La fel dacă dorim să accesăm pagina de manual a comenzilor printf și write folosim comenzile

$ man printf
$ man write

pe când dacă dorim să accesăm paginile de manual ale apelurilor de bibliotecă printf și write folosim comenzile

$ man 3 printf
$ man 2 write

O abilitate importantă este căutarea în paginile de manual pentru identificarea unor informații conceptuale sau a unor opțiuni pentru comenzi. Căutarea se face în cadrul pager-ului (utilitarului de afișare). Pager-ul comun pe sistemele Unix/Linux este less.

Pentru căutarea în paginile de manual folosim / (tasta slash) urmată de șirul de căutare și apoi tasta Enter pentru căutarea șirului (de fapt a expresiei regulate) în fișierul curent.

  • Exemplu: /recursive<Enter> (<Enter> denotă apăsarea tastei Enter) înseamnă căutarea în fișierul afișat curent (probabil pagină de manual) a șirului recursive).
    • Puteți testa acest lucru în pagina de manual a comenzii ls.
  • Exemplu: /^ +-s<Enter> înseamnă căutarea în fișierul afișat curent (probabil o pagină de manual) a șirului -s aflat la începutul rândului (precedat de cel puțin un spațiu).
    • Puteți testa acest lucru în pagina de manual a comenzii du.

De multe ori prima potrivire (match) nu este ceea ce căutăm și dorim să ajungem la următoarea. Pentru aceasta folosim tasta n (de la next) pentru următoarea potrivire. Și tot așa. Dacă vrem să găsim potrivirea precedentă folosim tasta N.

Dacă este nevoie să căutăm înapoi un șir sau o expresie folosim tasta ? (semnul întrebării) în locul tastei /. Adică o expresie de genul ?access time<Enter> va conduce la căutarea înapoi în cadrul fișierului curent a șirului access time.

În acest caz tasta n va fi folosită pentru căutarea în continuare (adică înapoi), iar tasta N va fi folosită pentru căutarea în sens invers (adică înainte).

Aceste mecanisme de căutare (folosind /, n, N, ?) sunt folosite și în editorul Vim.

Exerciții

Pentru exercițiile de mai jos, va trebui să investigați în pagina de manual pentru a determina opțiunile necesare pentru comenzile indicate.

Folosiți comanda ls cu opțiunea -l și o altă opțiune (de determinat) pentru a afișa spațiul ocupat de intrările din directorul curent.

Folosiți comanda du cu argumentul potrivit pentru a afla spațiul ocupat de directorul /etc. Indicație: Căutați după opțiune de sumarizare (summarize).

Folosiți comanda stat pentru a afișa doar dimensiunea (în octeți) a fișierului /etc/passwd.

Folosiți comanda stat pentru a afișa doar numele și dimensiunea (în octeți) a fișierelor din directorul /etc.

Folosiți comanda date pentru a afișa data curentă în formatul YYYY-MM-DD_HH:mm.

Folosiți comanda touch pentru a schimba timpii de acces/modificare/schimbare ai unui fișier oarecare în 2010-10-31 12:13.

Folosiți comanda pwgen pentru a genera 3 parole a câte 16 caractere care să conțină cel puțin un caracter special, cel puțin o cifră și cel puțin o literă mare.

Bonus: Folosiți o construcție de tipul stat … | paste … | bc pentru a calcula spațiul ocupat de fișierele cu extensia din directorul /etc cu extensia *.conf. Indicație: Urmăriți și postarea de aici.

02. Fisiere

a) Investigarea ierarhiei de fișiere

Ierarhia de fișiere în Unix/Linux este dată de Filesystem Hierarchy Standard. Fiecare director din vârful ierarhiei are un rol predeterminat. Un pachet instalat în sistemul curent, duce la actualizarea sistemului de fișiere în diferite locuri ale ierarhiei.

De exemplu, rularea comenzii

$ dpkg -L pwgen

duce la afișarea componentelor din sistemul de fișiere care aparțin pachetului pwgen. Un pachet ajunge să completeze intrări pentru binare/executabile (în /bin sau, mai des, în /usr/bin), fișiere de configurare (în /etc), fișiere de documentare sau generaliste (în /usr/share), biblioteci (în /lib sau, mai des, în /usr/lib), fișierele de jurnalizare (în /var/log) și așa mai departe.

Putem afla informații despre intrări din sistemul local de fișiere folosind comenzi precum ls -l, stat, file.

Comanda which urmată de o comandă afișează calea completă a comenzii respective.

Exerciții

Identificați componentele din sistemul de fișiere care aparțin pachetului grub-common. Verificați ce tip de fișiere sunt și ce reprezintă.

Investigați care este editorul folosit în mod implicit de shell prin investigarea comenzii editor. Indicație: Porniți de la which și apoi folosiți ls -l sau file.

Folosiți comanda

$ sudo apt-get install zoo

pentru a instala pachetul zoo. Investigați în ierarhia /var unde a fost descărcat pachetul .deb pentru a fi apoi instalat în sistem. Indicație: Porniți de la directorul /var/lib.

b) Căi relative și absolute

Căile în sistemul de fișiere pot fi abolute (încep de la directorul rădăcină) sau pot fi relative (sunt relative la directorul curent).

Exemple de căi absolute:

  • /etc/apt/sources.lists
  • /usr/bin/pwgen
  • /boot/grub/grub.cfg
  • /var/lib/apt/

Exemple de căi relative:

  • repo.git/cursuri/curs-01/
  • ../../projects/events/message.txt
  • ./a.out

Exerciții

Înainte de orice exercițiu plasați-vă în directorul /tmp folosind comanda

$ cd /tmp

Folosiți o cale absolută și o cale relativă pentru a ajunge în directorul /boot/grub.

Folosiți o cale relativă și o cale absolută pentru a afișa conținutul directorului Downloads/ din directorul home al utilizatorului student.

Folosiți o cale relativă și o cale absolută pentru a afișa ultimele 10 linii din fișierul de jurnalizare a sistemului (syslog). Indicație: Fișierul se găsește în /var/log iar comanda pentru afișarea ultimelor 10 linii este tail.

c) Globbing, văzut fișiere care corespund unei expresii

Cu ajutorul globbing-ului putem să vedem fișiere care corespund unui șir. De principiu cea mai uzuală folosire este pentru sistemul de fișiere și acolo caracterul cel mai folosit este * (steluță, star) numit și wildcard.

Exerciții

Folosiți un glob pentru a afișa toate fișierele cu extensia .gz din directorul /var/log/.

Folosiți un glob pentru a afișa toate fișierele care se încheie în forma .XY.gz din directorul /var/log/, unde X și Y sunt numere. (este osibil să nu fie nici unul)

Folosiți un glob pentru comanda dpkg -l … pentru a afișa pachetele din sistem care conțin șirul jdk.

Afișați toate fișierele cu extensia .conf din toate primele subdirectoare din /etc (adică din primul nivel de subdirectoare: init/, systemd/, security/.

d) Crearea unei ierarhii locale

Creați ierarhia de mai jos într-un director cu numele music/.

.
|-- ac_dc/
|   |-- angus
|   |-- bon
|   |-- brian
|   |-- chris
|   |-- cliff
|   |-- dave
|   |-- george
|   |-- malcom
|   |-- mark
|   `-- phil
|-- cargo
|-- hammerfall/
|   |-- anders
|   |-- jesper
|   |-- joacim
|   |-- magnus
|   |-- oscar
|   |-- pontus
|   `-- stefan
|-- iris
|-- nightwish
|-- phoenix
`-- slayer

e) Actualizarea ierarhiei

Actualizați ierarhia de mai sus astfel:

  • Creați un subdirector rock/ și mutați intrările deja existente în acest director.
  • Creați un subdirector numit manele/ și creați câteva intrări în director după preferințele personale.
  • Creați un link simbolic numit preferate care să pointeze la directorul rock/ sau manele/ după preferințele personale.
  • Creați un link simbolic numit preferate-dupa-alcool care să pointeze la directorul rock/ sau manele/ după preferințele personale după un consum suficient de mare.
  • Ștergeți fișierele chris, george, cargo și iris.
  • Ștergeți întreg directorul hammerfall.
  • Schimbați numele directorului ac_dc în AC DC (numele conține spațiu).

f) Schimbat de permisiuni pe fișiere

Adăugați în sistem utilizatorii ana, bogdan și grupul mayhem și realizați următorele actualizări în ierarhia de mai sus:

  • Fișierul phoenix să fie deținut de ana.
  • Fișierul slayer să fie deținut de bogdan si grupul mayhem.
  • Directorul AC DC și intrările sale (recursiv) să fie deținut de ana și grupul mayhem.
  • Permisiunile pe fișierul mark să permită și lui bogdan citire (fără a modifica ownership).
  • Permisiunile pe fișierul dave sa permită lui bogdan citire și scriere (fără a modifica ownership).
  • Fișierul bon să aiba permisiuni de execuție pentru toți utilizatorii.

g) Folosirea find

Folosiți comanda find pentru a parcurge ierarhia creată mai sus.

Folosiți comanda find pentru a afișa doar fișierele din ierarhia de mai sus. Folosiți comanda find pentru a afișa doar directoarele din ierarhia de mai sus.

Folosiți comanda find pe ierarhia de mai sus pentru a afișa doar intrările care încep cu litera a.

03. Vim Sk1llz

Dacă exercițiile de mai jos vă iau mai mult timp decât este indicat, să faceți o trecere prin tutorialul de Vim: adică să porniți comanda vimtutor.

Puteți să ignorați scrierea cu diacritice.

În 30 de secunde, porniți Vim pentru a crea/edita fișierul poveste.txt, scrieți textul "A fost o dată ca niciodată că dacă nu ar fi nu s-ar povesti." și salvați textul și părăsiți editorul.

În 120 de secunde, porniți Vim scrieți textul de mai sus în fișierul capitolul-01.txt și apoi tot în Vim (fără a părăsi editorul scrieți textul "Va urma" în fișierul capitolul-02.txt și textul "Sfârșit" în fișierul capitolul-03.txt.

Descărcați fișierul de mai jos (mesaj.txt) și, în 180 de secunde editați-l în Vim pentru a obține forma de dedesubt (mesaj-modificat.txt). Analizați ce trebuie să faceți înainte de a contoriza editarea.

mesaj.txt
====== Împărțire semigrupe ======
 
Pentru împărțirea orelor de laborator de GSR, vom deschide două thread-uri pe [[http://cs.curs.pub.ro/2015/mod/forum/view.php?id=654|forumul de discuții generale]]. Pe fiecare thread vă veți putea înscrie la unul dintre cele două intervale de laborator:
  * joi, 16:00-18:00, sala EG106
  * joi, 20:00-22:00, sala EG106
 
Vom deschide thread-urile miercuri, 14 octombrie 2015, la ora 12:30 (la prânz).
 
Limita de locuri pe laborator este de 18 persoane. Va fi "first post, first served".
mesaj-modificat.txt
--- Împărțire semigrupe
 
Pentru împărțirea orelor de laborator de GSR, vom deschide două fire de discuție pe forumul de discuții generale. Pe fiecare thread vă veți putea înscrie la unul dintre cele două intervale de laborator:
  * vineri, 16-12, sala EG306
  * vineri, 20-22, sala EG306
 
Vom deschide thread-urile miercuri, 14 noiembrie 2015, la ora 19:30 (pe seară).
 
Limita de locuri pe laborator este de 12 persoane. Va fi "primul venit, primul servit".

În 30 de secunde copiați codul de aici în Vim într-un fișier numit dual-mapping.c și asigurând indentarea codului.

04. Procese

a) Afișare procese

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.

b) Procesele unui utilizator

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.

În locul comenzii pkill puteți folosi comanda killall cu opțiunile potrivite.

c) Procesele unui terminal

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.

05. Investigarea descriptorilor de fișiere

a) lsof

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.

b) Investigarea redirectării

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.

c) Investigarea operatorului pipe

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.

d) netstat și ss

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.

e) netcat

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ă.

f) SimpleHTTPServer

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.

06. Instalat, dezinstalat de pachete

Dezinstalați pachetul zoo instalat anterior. Folosiți opțiunea de purge pentru a șterge și fișierele de configurare.

Folosiți comanda dpkg -l * pentru a identifica 2 pachete neinstalate și instalați-le.

Folosiți comanda dpkg -L ... pentru a afișa conținutul celor 2 pachete proaspăt instalate.

Bonus: find avansat

Folosiți find pentru a identifica fișierele cu drept de execuție care nu au extensia .sh aflate în subdirectoarele directorului din arhiva de aici.

Pași ajutățori:

  1. Folosiți find pentru a afișa ierarhia din subdirectoare. (Hint: -mindepth)
  2. Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare cu extensia .sh. (Hint: -name, -type)
  3. Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare care nu au extensia .sh. (Hint: OPERATORS în pagina de manual)
  4. Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare cu drept de execuție care nu au extensia .sh. (Hint: -perm)

Bonus: dpkg

Afișați din ce pachet face parte utilitarul printf. Aflați întâi calea către utilitar folosind comanda which.

Ce pachet este folosit pentru a putea vizualiza paginile de manual, adică ce pachet conține fișierul /usr/lib/man-db/libman.so.

Bonus: apt-file

Folosiți apt-file pentru a afla ce pachete conțin biblioteca standard C, adică fișierul libc.so.

Folosiți apt-file pentru a afla pachetul/pachetele care conțin header-ul gdk.h.

gsr/laboratoare/laborator-01.txt · Last modified: 2016/10/13 20:27 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0