~/uso-lab/
. Folosiți comanda:
cd ~/uso-lab
De multe ori dorim să salvăm rezultatul afișat de o comandă (output) într-un fișier pentru a-l consulta ulterior. Acest lucru este util pentru comenzile care afișează multe informații pe care nu le putem vizualiza ușor sau pentru a reține snapshot-uri ale rulării unei comenzi pe care să le comparăm între ele. De exemplu, dacă rulăm comanda
ls > out.txt
Vom obține în fișierul out.txt
rezultatul rulării comenzii ls. Putem verifica acest lucru cu ajutorul comenzii
cat out.txt
Operatorul >
din shell este numit operator de redirectare, cu ajutorul căruia redirectăm rezutatul comenzii (adică ieșirea standard, standard output) în fișierul trimis ca argument.
Un caz de utilizare este atunci când dorim să rulăm o comandă fără a ne preocupa rezultatul rulării acesteia. În acest caz redirectăm ieșirea standard a comenzii la fișierul special /dev/null
. Fișierul special /dev/null
este un fișier de tipul “gaură neagră”: orice informație redirectată acolo se pierde.
Pentru a exemplifica redirectarea în fișierul special /dev/null
vom folosi utilitarul/comanda strace
. Comanda strace
monitorizează apelurile pe care le face o altă comandă către sistemul de operare (strace
– system call tracing). Pentru început rulăm comanda de mai jos și obținem rezultatul indicat:
student@uso:~/uso-lab$ strace ls execve("/bin/ls", ["ls"], 0x7ffdde615410 /* 35 vars */) = 0 brk(NULL) = 0x5651b5da3000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 [...] write(1, "00-intro 01-fs 02-process 03-"..., 10900-intro 01-fs 02-process 03-user 04-appdev 05-cli 06-hw-boot 07-storage 08-net 09-vm 10-sec 11-ctf [...]
Comanda strace
primește ca argument o altă comandă și argumentele aceleia. În cazul de mai sus, a primit ca argument comanda ls
. Apoi comanda strace afișează la ieșirea standard (standard output) rezultatul comenzii primite ca argument (la noi ls
) iar la ieșirea de eroare standard (standard error) rezultatul propriu (adică sumarul apelurilor pe care îl face comanda primită ca argument la sistemul de operare).
strace
. O folosim ca să demonstrăm aspecte ale redirectării și pentru că scenariile pe care le prezentăm sunt practice și utile.
[1a] Ne dorim să afișăm la terminal doar rezultatul comenzii strace
, adică apelurile realizate de comanda primită ca argument, fără să ne preocupe rezultatul comenzii. Pentru aceasta redirectăm ieșirea standard la /dev/null
, adică în acel fișier special gaură neagră. Rulăm acum fără redirectare și cu redirectare comenzile de mai jos pentru a investiga fișierele deschise de comanda ls
:
student@uso:~/uso-lab$ strace -e openat ls openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 00-intro 01-fs 02-process 03-user 04-appdev 05-cli 06-hw-boot 07-storage 08-net 09-vm 10-sec 11-ctf strace.out +++ exited with 0 +++ student@uso:~/uso-lab$ strace -e openat ls > /dev/null openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +++ exited with 0 +++
În cazul redirectării ieșirii standard la fișierul special /dev/null
folosind operatorul >
, observăm că nu mai apare listarea de fișiere 00-intro …
reprezentând rezultatul comenzii ls
.
-e openat
al comenzii strace
ne permite să selectăm doar apelurile de deschidere de fișier pe care comanda primită ca argument (în cazul nostru ls
) le face la sistemul de operare.
[1b] Într-o situație ne interesează să redirectăm rezultatul comenzii strace
într-un fișier; adică acea înlănțuire de apeluri efectuate de comanda primită ca argument către sistemul de operare. Pentru aceasta, folosim operatorul 2>
de redirectare a ieșirii de eroare standard (standard error) ca mai jos:
student@uso:~/uso-lab$ strace -e openat ls 2> strace.out 00-intro 01-fs 02-process 03-user 04-appdev 05-cli 06-hw-boot 07-storage 08-net 09-vm 10-sec 11-ctf
În comanda de mai sus ieșirea de eroare standard (standard error) a fost redirectată în fișierul strace.out
; adică rezultatul comenzii strace
, adică șirul de apeluri ale comenzii ls
la sistemul de operare. La terminal a fost afișată ieșirea standard a comenzii, adică rezultatul comenzii ls.
Verificăm faptul că redirectarea a avut loc cu succes afișând conținutul fișierului strace.out
cu ajutorul comenzii
student@uso:~/uso-lab$ cat strace.out openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +++ exited with 0 +++
Observăm că, așa cum ne așteptam, rezultatul comenzii strace (lista de apeluri) a fost redirectată cu succes în fișier prin redirectarea ieșirii de eroare standard (standard error).
[1c] Ne poate interesa să redirectăm și rezultatul comenzii strace
într-un fișier și rezultatul comenzii primite ca argument. În acest caz folosim atât operatorul >
de redirectare a ieșirii standard (standard output) cât și operatorul 2>
de redirectare a ieșirii de eroare standard (standard error). Pentru aceasta folosim comanda:
student@uso:~/uso-lab$ strace -e openat ls 2> strace.out > ls.out
În comanda de mai sus am redirectat ieșirea standard (standard output), adică rezultatul comenzii ls
, în fișierul ls.out
și ieșirea de eroare standard (standard error), adică rezultatul comenzii strace
, în fișierul strace.out
. Putem verifica acest lucru prin afișarea conținutului celor două fișiere:
student@uso:~/uso-lab$ cat strace.out openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +++ exited with 0 +++ student@uso:~/uso-lab$ cat ls.out 00-intro 01-fs 02-process 03-user 04-appdev 05-cli 06-hw-boot 07-storage 08-net 09-vm 10-sec 11-ctf ls.out strace.out
Observăm că cele două fișiere obținute în urma redirectării (strace.out
și ls.out
) conțin rezultatele rulării comenzilor.
[1d] Construiți o comandă strace
care să nu afișeze nimic la terminal și să aibă în fișierul strace.out
apelurile de deschidere de fișiere realizate de comanda ps
.
ps
, adică să folosiți redirectarea către fișierul special /dev/null
.
[1e] Utilitarul grep
este folosit pentru a căuta un șir de caractere într-un fișier. De exemplu comanda de mai jos caută șirul root
în fișierul /etc/passwd
:
student@uso:~/uso-lab$ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
După rularea unei comenzi putem folosi comanda echo $?
pentru a vedea dacă s-a rulat cu succes. De exemplu, dacă după rularea comenzii grep
de mai sus, rulăm comanda de verificare a unei rulări cu succes, obținem:
student@uso:~/uso-lab$ echo $? 0
Rezultatul 0
înseamnă o comandă anterioară s-a rulat cu succes.
Construiți o comanda grep
cu redirectare care să nu afișeze nimic la terminal (nici standard output, nici standard error). Iar după rularea acelei comenzi să verificați rularea cu succes. Pentru a verifica faptul că ați construit comanda grep
cum trebuie, folosind secvența de comenzi de mai jos:
student@uso:~/uso-lab$ grep 'a' /etc/passwd TODO student@uso:~/uso-lab$ echo $? 0 student@uso:~/uso-lab$ grep 'aaa' /etc/passwd TODO student@uso:~/uso-lab$ echo $? 1 student@uso:~/uso-lab$ grep 'aaa' /etc/pass TODO student@uso:~/uso-lab$ echo $? 2
În loc de TODO
trebuie să completați cu acele părți din construcție care folosesc redirectre pentru a nu afișa nimic la terminal.
~/uso-lab/01-fs/
. Folosiți comanda:
cd ~/uso-lab/01-fs
[2a] Aflându-vă în directorul ~/uso-lab/01-fs
, creați o arhivă .zip
cu numele support-g.zip
și o arhivă .tar.gz
cu numele support-g.tar.gz
cu toate intrările (fișiere, directoare etc.) care încep cu litera g
din directorul support/
.
Verificați-vă folosind comanda de afișare a conținutului unei arhive .zip
, respectiv comanda de afișare a conținutului unei arhive .tar.gz
.
[2b] Aflându-vă în directorul ~/uso-lab/01-fs
, creați o arhivă .zip
cu numele 01-fs-g.zip
și o arhivă .tar.gz
cu numele 01-fs-g.tar.gz
cu toate intrările (fișiere, directoare etc.) care încep cu litera g
din directorul support/
și toate intrările (fișiere, directoare etc.) care încep cu litera g
din directorul wiki/
.
Verificați-vă folosind comanda de afișare a conținutului unei arhive .zip
, respectiv comanda de afișare a conținutului unei arhive .tar.gz
.
[2c] Putem actualiza o arhivă adăugând sau ștergând un fișier din cadrul ei. De exemplu în arhiva de 01-fs-g.zip
de mai sus putem adăuga fișierul wiki/recap.wiki
folosind comanda
student@uso:~/uso-lab/01-fs$ zip 01-fs-g.zip wiki/recap.wiki adding: wiki/recap.wiki (stored 0%)
Putem verifica adăugarea cu succes a fișierului wiki/recap.wiki
folosind comanda
student@uso:~/uso-lab/01-fs$ unzip -l 01-fs-g.zip Archive: 01-fs-g.zip Length Date Time Name --------- ---------- ----- ---- 0 2018-08-24 14:52 support/get-a-life/ 0 2018-08-24 14:52 support/get-a-life/3-template/ [...] 0 2018-08-24 14:52 wiki/get-a-life.wiki 0 2018-08-24 14:52 wiki/recap.wiki --------- ------- 12120 32 files
Observăm în rezultatul comenzii existența fișierului wiki/recap.wiki
, deci a fost adăugat cu succes.
Putem șterge fișiere dintr-o arhivă .zip
. De exemplu, pentru a șterge fișierul wiki/get-a-life.wiki
din arhiva 01-fs-g.zip
folosim opțiunea -d
a comenzii zip
:
student@uso:~/uso-lab/01-fs$ zip -d 01-fs-g.zip wiki/get-a-life.wiki updating: wiki/get-a-life.wiki (stored 0%)
[2d] Adăugați fișierele wiki/demo.wiki
și wiki/basics.wiki
la arhiva 01-fs-g.zip
. Ștergeți fișierele support/get-a-life/2-passwd/reader.c
și support/get-a-life/4-rename/4.tex
din arhiva 01-fs-g.zip
.
[2e] O arhivă .tar.gz
este de fapt o arhivă .tar
comprimată cu utilitarul gzip
. Fiind trecută prin două filtre de prelucrare, nu putem adăuga și șterge fișiere din acea arhivă. Putem face însă, acest lucru pe o arhivă .tar
.
Lucrul cu arhive .tar
este similar lucrului pe arhive .tar.gz
numai că acum lipsește opțiunea z
din comanda tar
. Adică:
.tar
folosind comandatar cvf my.tar file1 file2 dir1 dir2 ...
.tar
folosind comandatar xvf my.tar
.tar
folosind comandatar tf my.tar
Creați o arhivă 01-fs-g.tar
cu cu toate intrările (fișiere, directoare etc.) care încep cu litera g
din directorul support/
și toate intrările (fișiere, directoare etc.) care încep cu litera g
din directorul wiki/
. Listați conținutul arhivei.
[2f] Adăugați fișierele wiki/demo.wiki
și wiki/basics.wiki
la arhiva 01-fs-g.tar
. Ștergeți fișierele support/get-a-life/2-passwd/reader.c
și support/get-a-life/4-rename/4.tex
din arhiva 01-fs-g.tar
.
O situație frecventă în lucrul cu fișiere este să parcurgem toate fișierele dintr-o ierarhie. Eventual să facem apoi operații pe toate aceste fișiere: să schimbăm permisiuni, să afișăm informații, să ștergem unele fișiere. Pentru aceasta folosim utilitarul find
.
În mod implicit find
afișează recursiv toate intrările din directorul curent, așa cum se vede când rulăm comanda
student@uso:~/uso-lab/01-fs$ find . ./wiki ./wiki/basics.wiki ./wiki/concepts.wiki ./wiki/demo.wiki ./wiki/get-a-life.wiki ./wiki/nice-to-know.wiki ./wiki/recap.wiki ./wiki/need-to-know.wiki ./01-fs-g.zip ./support ./support/.gitignore ./support/get-a-life [...]
Dacă-i dăm un argument un director, va afișa recursiv toate intrările din acel director. De exemplu, comanda de mai jos afișează toate intrările din ierarhia /var/lib/apt/
:
student@uso:~/uso-lab/01-fs$ find /var/lib/apt /var/lib/apt /var/lib/apt/mirrors /var/lib/apt/mirrors/partial /var/lib/apt/daily_lock /var/lib/apt/lists [...]
[3a] Putem afișa folosind find
doar anumite tipuri de intrări, de exemplu doar fișiere. Pentru a afișa doar fișierele din directorul curent folosim opțiunea -type f
, la fel ca în comanda de mai jos:
student@uso:~/uso-lab/01-fs$ find -type f ./wiki/basics.wiki ./wiki/concepts.wiki ./wiki/demo.wiki ./wiki/get-a-life.wiki ./wiki/nice-to-know.wiki ./wiki/recap.wiki [...]
Observăm în output că sunt afișate numai fișiere, folosind opțiunea -type f
.
[3b] Putem afișa fișierele care corespund unui anumit pattern. De exemplu pentru a afișa toate fișierele cu extensia .tex
vom folosi opțiunea -name
, la fel în comanda de mai jos:
student@uso:~/uso-lab/01-fs$ find -type f -name '*.tex' ./support/nice-to-know/fruits/pear.tex ./support/get-a-life/4-rename/5.tex ./support/get-a-life/4-rename/3.tex [...]
Observăm că sunt afișate numai fișierele cu extensia .tex
.
[3c] Putem folosi comanda find
pentru a aplica o altă comandă pe intrările găsite. De exemplu dacă dorim să ștergem toate fișierele cu extensia .c
vom folosi opțiunea -exec
, la fel ca în comanda de mai jos:
student@uso:~/uso-lab/01-fs$ find -type f -name '*.c' ./support/nice-to-know/fruits/apple.c ./support/get-a-life/2-passwd/reader.c student@uso:~/uso-lab/01-fs$ find -type f -name '*.c' -exec rm {} \; student@uso:~/uso-lab/01-fs$ find -type f -name '*.c' student@uso:~/uso-lab/01-fs$
Dacă la început aveam două fișiere cu extensia .c
(./support/nice-to-know/fruits/apple.c
și ./support/get-a-life/2-passwd/reader.c
) după rularea comenzii find acele fișiere dispar.
-exec rm {} \;
este mai complicată și nu o vom explica în detaliu aici. Pe scurt:
-exec
este opțiunea care dictează comenzii find
să execute comanda primită ca argumentrm
este comanda rulată pentru fiecare fișier găsit, adică acea comandă care șterge fișierul{}
este o construcție specifică opțiunii -exec
care înlocuiește numele fișierului; practic înseamnă că rulăm rm <nume-fisier>
pentru fiecare fișier descoperit\;
este un terminator de comandă, spunând că aici se încheie comanda transmisă ca argument opțiunii -exec
[3d] Pe baza celor de mai sus, ștergeți toate fișierele temporare din ierarhia curentă.
~
(tildă).
În directorul ~/uso-lab/01-fs/support/nice-to-know/4-compile/
găsiți un set de fișiere și un fișier Makefile
pentru compilarea lor. Există o eroare ce ține de căi în sistemul de fișiere, astfel că nu merge compilarea în momentul rulării comenzii make
.
Corectați eroarea și obțineți fișierul executabil write_hello
.
Conectați un stick USB pe un port USB al sistemului vostru. Folosiți linia de comandă pentru a copia ierarhia curentă (~/uso-lab/01-fs/support/04-compile/
) pe stick.
mount
unde este montat, în ce director este accesibil.
După ce ați făcut copierea demontați stick-ul folosind comanda
sudo umount <mount-point>
unde <mount-point>
este directorul unde este montat stick-ul, unde ați copiat ierarhia curentă, afișat de comanda mount
după conectare.
Comenzile pe care le rulăm au la bază fișiere executabile în sistemul de fișiere. În momentul în care dăm o comandă, shell-ul caută într-o listă predefinită de directoare existența unui executabil cu ajutorul căruia să ruleze comanda respectivă. De exemplu, comanda ls
folosește executabilul /bin/ls
, astfel că rularea celor două comenzi de mai jos este echivalentă:
ls /bin/ls
Similar, comanda find
folosește executabilul /usr/bin/find
, comanda zip
folosește executabilul /usr/bin/zip
și așa mai departe.
Directoarele în care caută shell-ul executabile aferente unei comenzi se găsesc într-o construcție de tip variabilă de mediu numită PATH
. Vom vorbi mai multe despre variabile și variabile de mediu la un laborator viitor. Pe moment, este suficient să știm că pentru a afișa valoarea variabilei PATH
folosim comanda
student@uso:~/uso-lab/01-fs$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Directoarele afișate, conținute de variabila PATH
sunt afișate în rezultatul comenzii, separate prin caracterul :
(două puncte, colon). Asta înseamnă ca dacă un utilizator tastează comanda ls
, shell-ul va căuta, în ordine, existența executabilului /usr/local/sbin/ls
, apoi /usr/local/bin/ls
, apoi /usr/sbin/ls
și așa mai departe. Când găsește un executabil îl va rula, ducând la afișarea rezultatului comenzii la terminal.
Calea către executabilul aferent unei comenzi poate fi afișată folosind comanda which
urmată de numele comnezii, ca mai jos:
student@uso:~/uso-lab/01-fs$ which ls /bin/ls student@uso:~/uso-lab/01-fs$ which find /usr/bin/find student@uso:~/uso-lab/01-fs$ which zip /usr/bin/zip
În rulările celor trei comenzi which
de mai sus am obținut calea către fișierele executabilele aferente respectiv comenzilor ls
, find
și zip
.
Putem verifica faptul că acele fișiere sunt executabile prin folosirea comenzii file
urmată de calea către fișierul executabil, ca mai jos:
student@uso:~/uso-lab/01-fs$ file /bin/ls /bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9567f9a28e66f4d7ec4baf31cfbf68d0410f0ae6, stripped student@uso:~/uso-lab/01-fs$ file /usr/bin/find /usr/bin/find: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=b920f53e0c67a31d8ef07b84b1344f87a0e82d71, stripped student@uso:~/uso-lab/01-fs$ file /usr/bin/zip /usr/bin/zip: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c828586e6e7cf929500a5b9c04faece9eceed5cc, stripped
În rezultatul rulării celor trei comenzi file
de mai sus vedem că apare informația ELF
, dynamically linked
. Fără a intra în detalii, acest lucru este indiciul că aceste fișiere sunt, într-adevăr, fișiere executabile.
[6a] Găsiți fișierele executabilele aferente comenzilor useradd
, iotop
, tar
, gzip
. Verificați că cele patru fișiere indicate sunt fișiere executabile.
Bonus: De ce fișierele executabile pentru useradd
și iotop
se găsesc într-un director care conține sbin/
pe când tar
și gzip
se găsesc într-un director care conține bin/
(fără s
)? Folosiți Internetul și Google pentru aflarea răspunsului.