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
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.
/recursive<Enter>
(<Enter>
denotă apăsarea tastei Enter
) înseamnă căutarea în fișierul afișat curent (probabil pagină de manual) a șirului recursive).ls
./^ +-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).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
.
?
(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).
/
, n
, N
, ?
) sunt folosite și în editorul Vim.
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.
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.
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
.
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
/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
.
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.
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/
.
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
Actualizați ierarhia de mai sus astfel:
rock/
și mutați intrările deja existente în acest director.manele/
și creați câteva intrări în director după preferințele personale.preferate
care să pointeze la directorul rock/
sau manele/
după preferințele personale.preferate-dupa-alcool
care să pointeze la directorul rock/
sau manele/
după preferințele personale după un consum suficient de mare.chris
, george
, cargo
și iris
.hammerfall
.ac_dc
în AC DC
(numele conține spațiu).
Adăugați în sistem utilizatorii ana
, bogdan
și grupul mayhem
și realizați următorele actualizări în ierarhia de mai sus:
phoenix
să fie deținut de ana
.slayer
să fie deținut de bogdan
si grupul mayhem
.AC DC
și intrările sale (recursiv) să fie deținut de ana
și grupul mayhem
.mark
să permită și lui bogdan
citire (fără a modifica ownership).dave
sa permită lui bogdan
citire și scriere (fără a modifica ownership).bon
să aiba permisiuni de execuție pentru toți utilizatorii.
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
.
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.
====== Î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".
--- Î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.
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.
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.
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:
find
pentru a afișa ierarhia din subdirectoare. (Hint: -mindepth
)find
pentru a afișa fișierele din ierarhia din subdirectoare cu extensia .sh
. (Hint: -name
, -type
)find
pentru a afișa fișierele din ierarhia din subdirectoare care nu au extensia .sh
. (Hint: OPERATORS
în pagina de manual)find
pentru a afișa fișierele din ierarhia din subdirectoare cu drept de execuție care nu au extensia .sh
. (Hint: -perm
)
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
.
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
.