Pentru pregătirea suportului de laborator, rulați următoarele comenzi în ordine:
student@uso:~$ cd ~ student@uso:~$ wget http://elf.cs.pub.ro/uso/res/labs/lab3/lab3.zip --2021-10-18 22:44:01-- http://elf.cs.pub.ro/uso/res/labs/lab3/lab3.zip Resolving elf.cs.pub.ro (elf.cs.pub.ro)... 141.85.227.116 Connecting to elf.cs.pub.ro (elf.cs.pub.ro)|141.85.227.116|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 14908126 (14M) [application/zip] Saving to: ‘lab3.zip’ lab3.zip 100%[===============================================================================================================>] 14,22M 7,61MB/s in 1,9s 2021-10-18 22:44:03 (7,61 MB/s) - ‘lab3.zip’ saved [14908126/14908126] student@uso:~$ unzip lab3.zip Archive: lab3.zip creating: archive/ inflating: archive/inregistrare_lab03.mp4 inflating: archive/inregistrare_lab01.mp4 inflating: archive/inregistrare_lab04.mp4 inflating: archive/inregistrare_lab02.mp4 creating: redirection/ inflating: redirection/RL inflating: redirection/USO inflating: redirection/EGC # Când vi se cere parola pentru student, scrieți: student și apăsați enter. # Nu va apărea pe ecran nimic în timp ce tastați. student@uso:~$ sudo apt -y install vlc [sudo] password for student:
Până acum am dat comenzi în terminal și am urmărit outputul (rezultatul) lor. Outputul (rezultatul) este afișat în terminal. Dacă voiam să salvăm outputul undeva (de obicei într-un fișier) trebuia să copiem outputul, să creăm un fișier nou sau să folosim unul deja existent, să îl deschidem, să lipim textul în el și să salvăm modificările. Trecerea prin toți acești pași durează și devenim ineficienți în lucrul în terminal.
Interpretorul de comenzi (shellul) are opțiunea de a direcționa afișarea rezultatului direct într-un fișier.
Rezultatul unei comenzi este format din două fluxuri de informații: informații de ieșire (standard output, stdout) și de eroare (standard error, stderr). Avem opțiunea de a direcționa (redirecta) doar ieșirea, doar eroarea sau ambele fluxuri într-un fișier.
Mergem în directorul ~/redirection
rulând comanda cd ~/redirection
. Acolo avem mai multe fișiere, câte unul pentru fiecare materie. Afișăm fișierele folosind comanda ls
:
student@uso:~$ cd ~/redirection student@uso:~/redirection$ ls -lh total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO
Salvăm outputul comenzii ls -lh
de mai sus folosind caracterul >
, astfel:
student@uso:~/redirection$ ls -lh > lista_materii student@uso:~/redirection$ ls EGC lista_materii RL USO
Observăm că acțiunea de mai sus a făcut două lucruri: a creat fișierul lista_materii
și a introdus în conținutul fișierului rezultatul comenzii ls -lh
.
Caracterul >
așteaptă un șir de caractere după el care este numele fișierului în care vrem să scriem outputul. Șirul este, de fapt, calea către un fișier. Șirul lista_materii
este calea relativă până la fișierul lista_materii
care se află în directorul curent /home/student
.
Fișierul lista_materii
nu exista. Prin direcționarea outputului am creat fișierul lista_materii
.
Vizualizăm conținutul fișierului lista_materii
folosind comanda cat
:
student@uso:~/redirection$ cat lista_materii total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 224K Aug 19 12:00 lista_materii -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO
Ștergem fișierul lista_materii
folosind comanda rm lista_materii
Îl vom crea din nou în următoarele momente.
Folosirea caracterului >
suprascrie conținutul fișierului:
student@uso:~/redirection$ mkdir -p comenzi/mkdir student@uso:~/redirection$ cd comenzi/mkdir student@uso:~/redirection/comenzi/mkdir$ cat lista_materii cat: lista_materii: No such file or directory student@uso:~/redirection/comenzi/mkdir$ ls -l /usr/ > lista_materii student@uso:~/redirection/comenzi/mkdir$ cat lista_materii total 72 drwxr-xr-x 2 root root 61440 Sep 9 14:07 bin drwxr-xr-x 2 root root 4096 Aug 31 2015 games drwxr-xr-x 34 root root 16384 Sep 9 14:06 include drwxr-xr-x 74 root root 4096 Sep 9 14:07 lib drwxr-xr-x 3 root root 4096 Nov 21 2015 lib32 drwxr-xr-x 2 root root 4096 Nov 21 2015 libexec drwxr-xr-x 3 root root 12288 Nov 21 2015 libx32 drwxrwsr-x 10 root root 4096 Nov 21 2015 local drwxr-xr-x 2 root root 12288 Sep 9 14:07 sbin drwxr-xr-x 137 root root 12288 Sep 9 14:07 share drwxr-xr-x 2 root root 4096 Aug 31 2015 src student@uso:~/redirection/comenzi/mkdir$ echo "cats" > lista_materii student@uso:~/redirection/comenzi/mkdir$ cat lista_materii cats student@uso:~/redirection/comenzi/mkdir$ cd ../../ student@uso:~/redirection$ rm -r comenzi/
Fișierul lista_materii
nu era creat inițial. În urma comenzii ls -l /usr/ > lista_materii
, fișierul lista_materii
a fost creat și populat cu ieșirea comenzii ls -l /usr/
. Comanda echo "cats" > lista_materii
suprascrie conținutul inițial al fișierului, înlocuindu-l cu rezultatul comenzii echo "cats"
.
tree
pentru a afișa ierarhia de fișiere pornind de la /home/student
;tree
pentru afișarea aceleiași ierarhii, dar de data asta direcționați-o în fișierul ierarhie_student
;
Putem direcționa rezultatul comenzii, fără a suprascrie fișierul. Facem acest lucru folosim caracterele >>
folosind fișierul creat anterior lista_materii
:
student@uso:~/redirection$ ls >> lista_materii student@uso:~/redirection$ ls EGC lista_materii RL USO student@uso:~/redirection$ cat lista_materii total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 209K Aug 19 12:00 lista_materii -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO EGC lista_materii RL USO
Acum avem în fișierul lista_materii
, pe lângă conținutul vechi, și outputul comenzii ls
.
tree
pentru a afișa ierarhia de fișiere pornind de la /tmp
;tree
pentru a afișa aceeași ierarhie, dar de data asta direcționați-o prin anexare la fișierul ierarhie_student
creat anterior;ierarhie_student
folosind comanda cat
.tree
pentru a afișa ierarhia de fișiere pornind de la /usr
;ierarhie_student
folosit anterior;ierarhie_student
folosind comanda cat
. Mai exista conținutul inițial al fișierului?
Atunci când direcționăm ieșirea unei comenzi folosind >
sau >>
, ne referim doar la ieșirea standard, nu și la erori.
Folosim caracterele 2>
pentru a direcționa ieșirea de eroare către un fișier:
student@uso:~/redirection$ ls EGC lista_materii RL USO student@uso:~/redirection$ cat lista_materie cat: lista_materie: No such file or directory
Am vrut să afișăm conținutul fișierului lista_materie
, însă acest fișier nu există. Am primit informația No such file or directory, și aceasta este afișată sub formă de eroare.
Direcționăm conținutul fișierului SO2
în fișierul materii
:
student@uso:~/redirection$ cat SO2 > materii cat: SO2: No such file or directory
Vedem că dacă folosim direcționarea simplă >
, eroarea tot este afișată.
student@uso:~/redirection$ cat SO2 2> materii student@uso:~/redirection$ cat materii cat: SO2: No such file or directory
Observăm că nu am primit eroare la prima comandă unde am încercat să afișăm conținutul unui fișier inexistent. Informațiile de eroare au fost direcționate în fișier.
Redirectările de eroare și ieșire pot fi folosite simultan folosind caracterele specifice >
pentru ieșire și 2>
pentru eroare. Putem folosi sintaxa comanda > fișier_ieșire 2> fișier_erori
pentru a face acest lucru.
student@uso:~/redirection$ cat USO SO2 USO is the b3st! USO Rullz cat: SO2: No such file or directory
În exemplul de mai sus încercăm să afișăm conținutul fișierelor USO
și SO2
, dar cu fișierul SO2
neexistent. Liniile USO is the b3st!
și USO Rullz
sunt conținutul fișierelului USO
. Comanda cat
ne-a arătat conținutul celor 2 fișiere. Tot comanda cat
a încercat să afișeze conținutul fișierului SO2
, însă el nu există și a afișat eroarea No such file or directory
.
În continuare vom face o separare a fluxurilor: direcționăm ieșirea în fișierul continut_materii
și erorile în fișierul erori_comenzi
. Ca să redirectăm și outputul și erorile de la o comandă folosim și >
și 2>
ca mai jos:
student@uso:~/redirection$ cat USO SO2 > continut_materii 2> erori_comenzi student@uso:~/redirection$ cat continut_materii USO is the b3st! USO Rullz student@uso:~/redirection$ cat erori_comenzi cat: SO2: No such file or directory
Observăm cum după executarea primei comenzi, la ecran nu mai apare nimic; atât ieșirea standard cât și erorile au fost direcționate în fișiere. În continuare am verificat conținutul acestor fișiere pentru a demonstra corectitudinea operației.
/etc/passwd
într-un fișier cu numele utilizatori_si_grupuri
./etc/group
în același fișier./etc/shadow
în fișierul parole
și afișați conținutul fișierului. HINT: Puteți folosi sudo!
Se poate întâmpla să vrem să aflăm dacă într-o ierarhie de fișiere găsim un anumit fișier și, dacă există, vrem să aflăm unde se află. Spre exemplu, serviciul ssh
folosește un fișier de configurare numit ssh_config
, dar nu mai ținem minte calea exactă până la acel fișier.
Linux ne oferă două utilitare, locate
și find
, care pot fi de ajutor în situația descrisă mai sus.
În mod obișnuit, numele fișierelor de configurare pentru servicii se termină în extensia conf
. Găsim toate fișierele de configurare ale serviciului ssh
de pe sistem folosind comanda find
:
student@uso:~$ mkdir comenzi student@uso:~$ cd comenzi/ student@uso:~/comenzi$ sudo find / -iname "*ssh*conf" /usr/share/upstart/sessions/ssh-agent.conf /usr/lib/tmpfiles.d/sshd.conf /etc/init/ssh.conf
Am căutat în calea /
(root) orice fișier ce conține ssh
și se termină cu conf
. Am folosit comanda sudo
pentru că suntem un utilizator neprivilegiat și nu putem căuta în directorul (root).
Utilitarul find
caută în ierarhia de fișiere care începe de la calea dată ca parametru în jos. În cazul nostru, de la /
(root) în jos, adică în tot sistemul de fișiere.
Mai multe informații și exemple de utilizări vom vedea în capitolul Interfața în linia de comandă
.
Atunci când vrem să căutăm într-o ierarhie mare de fișiere, utilitarul find
nu este cea mai bună soluție deoarece este încet.
Utilitarul locate
ne poate ajuta în astfel de situații.
Acesta funcționează în 2 pași:
updatedb
. Aceasta conține intrări cu toate fișierele din sistem și locatia acestora.locate
. Această căutare se reduce la interogarea bazei de date create anterior cu updatedb
.
Performanța utilitarului este foarte bună, superioară lui find
. Partea negativă este că la fiecare căutare trebuie folosit utilitarul updatedb
.
Încercăm să căutăm fișiere ce conțin ssh
și se termină cu conf
în sistemul de fișiere folosind locate
:
student@uso:~/comenzi$ sudo updatedb student@uso:~/comenzi$ locate "*ssh*conf" /etc/init/ssh.conf /usr/lib/tmpfiles.d/sshd.conf /usr/share/upstart/sessions/ssh-agent.conf
Actualizăm baza de date folosind updatedb
și apoi căutăm fișierul de configurare cu utilitarul locate
. Răspunsul comenzii este instant.
Acum ne dorim să găsim toate arhivele de tip tar
de pe stația noastră. Vom folosi iar utilitarul locate
alături de șirul de caractere *.tar
.
student@uso:~$ locate *.tar /home/student/inregistrari.tar /home/student/usr_bin.tar
Acesta este un presupus output al utilitarului locate
. Au fost găsite arhivele înregistrări.tar
și usr_bin.tar
pe care le aveam în sistemul de fișiere de la secțiunea anterioară.
Găsim mai multe informații și exemple în capitolul Interfață în linia de comandă.
Până acum am învățat câteva comenzi utile: ls
, cd
, find
, locate
.
Utilitarele sunt de fapt programe (executabile) care se află undeva în sistemul de fișiere.
Shell-ul știe să ruleze utilitarele din orice loc în care ne aflăm (din ierarhia de fișiere). Se întâmplă acest lucru pentru că shell-ul are o listă de câteva directoare în care se uită după utilitarele pe care le folosim. Spre exemplu, atunci când rulăm utilitarul ls
, el caută programul ls
în lista pe care o are, îl găsește și îl rulează.
Această listă se găsește în variabila de mediu1) PATH
.
Afișăm valoarea variabilei de mediu PATH
a sistemului folosind utilitarul echo
.
$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/games
Variabila PATH
are patru căi din sistem, despărțite de caracterul :
. Astfel, sistemul verifică dacă utilitarul este prezent în calea /usr/local/bin
. Dacă nu-l găsește, merge la următoarea calea /usr/bin
. Se caută utilitarul la toate căile disponibile. Dacă nu-l găsește va apărea în shell-ul curent un mesaj de eroare.
Există cazuri când vrem să găsim locația exactă a unui utilitar: vrem să aflăm ce permisiuni are, cine îl deține sau ce dimensiune are.
Acest utilitar identifică calea programelor din sistem.
Căutăm calea la care se află utilitarul ls
folosind comanda which
:
student@uso:~$ which ls /bin/ls student@uso:~$ which pwd /bin/pwd student@uso:~$ which man /usr/bin/man
which
folosește variabila de mediu PATH
pentru a găsi utilitarul cerut și va afișa rezultatele în ordinea directoarelor din PATH
.
Aflăm mai multe detalii despre utilitarul which
în capitolul Interfața în linia de comandă
pwd
în pwd_backup
. Puteți să mai executați comanda pwd
? Dar pwd_backup
?