Pentru a afișa toate partițiile unui sistem folosim comanda fdisk -l
. La rularea acestei comenzi
observăm că nu avem dreptul să vedem aceste informații dacă nu suntem logați ca un utilizator privilegiat
sau dacă nu folosim construcția sudo
.
student@uso:~/uso-lab$ fdisk -l fdisk: cannot open /dev/loop0: Permission denied fdisk: cannot open /dev/loop1: Permission denied fdisk: cannot open /dev/loop2: Permission denied fdisk: cannot open /dev/loop3: Permission denied fdisk: cannot open /dev/loop4: Permission denied fdisk: cannot open /dev/loop5: Permission denied fdisk: cannot open /dev/loop6: Permission denied fdisk: cannot open /dev/loop7: Permission denied fdisk: cannot open /dev/sda: Permission denied fdisk: cannot open /dev/loop8: Permission denied fdisk: cannot open /dev/loop9: Permission denied fdisk: cannot open /dev/loop10: Permission denied fdisk: cannot open /dev/loop11: Permission denied
!!
care ține locul ultimei comenzi pe care
am dat-o, în cazul nostru sudo !!
expandat înseamnă sudo fdisk -l
.
student@uso:~/uso-lab$ sudo !! sudo fdisk -l [sudo] password for student: Disk /dev/loop0: 2.3 MiB, 2433024 bytes, 4752 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop1: 13 MiB, 13619200 bytes, 26600 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop2: 13 MiB, 13619200 bytes, 26600 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes (...)
Shell-ul operează cu diferite variabile (pentru detalii, reveniți la secțiunea Concepte). Avem posibilitatea să ne definim propriile variabile în shell. Pentru a defini o nouă variabilă procedăm în felul următor:
student@uso:~/uso-lab$ x=4 student@uso:~/uso-lab$ echo $x 4
Pentru a inspecta valoarea variabilei x
folosim comanda echo
. Deschideți un nou terminal
și rulați comanda echo $x
.
student@uso:~/uso-lab$ echo $x student@uso:~/uso-lab$
x
este vizibilă acum doar în cadrul terminalul în care a fost definită.
Vom crea acum un script care să folosească variabila x
. Urmăriți pașii de mai jos pentru a realiza acest
lucru. Creați un script cu numele script.sh
care să conțină următoarele linii:
#!/bin/bash echo $x
Acest script afișează valoarea variabilei x
definită mai devreme. Dați drept de execuție pentru
acest script folosind comanda chmod
și asigurați-vă că aveți drept să îl rulați. Pentru a rula un
script folosim comanda ./script.sh
.
student@uso:~/uso-lab$ ./script.sh student@uso:~/uso-lab$
Observăm că deși variabila x
este definită din acest terminal, la rulare nu obținem nicio valoare. Acest
lucru nu se întâmplă deoarece variabila x
, așa cum a fost definită, nu este vizibilă subproceselor pornite
din cadrul acestui terminal. Pentru a face acest lucru posibil, trebuie să o exportăm.
student@uso:~/uso-lab$ export x=4
Rulați din nou scriptul și observați diferențele.
student@uso:~/uso-lab$ ./script.sh 4
Pentru a urmări acest tutorial, mutați-vă în directorul ~/uso-lab/05-cli/support/need-to-know
.
Listăm conținutul directorul și observăm că avem un program C și un Makefile. Compilăm programul
folosind comanda make
. Folosiți comanda make run
pentru a rula program și introduceți inputul
care vi se cere.
student@uso:~/.../05-cli/support/need-to-know$ ls dummy_check.c Makefile student@uso:~/.../05-cli/support/need-to-know$ make gcc dummy_check.c -o out student@uso:~/.../05-cli/support/need-to-know$ make run ./out (...)
Încercați să introduceți și date care nu se potrivesc cerințelor. Programul va produce erori care ne deranjează și
pe care vrem să le separăm de datele de ieșire standard. Pentru a face acest lucru putem redirecta erorile
într-un fișier. Rulați comanda make run_redirect_err
care va redirecta eventualele erori apărute în
fișierul err.txt
.
student@uso:~/.../05-cli/support/need-to-know$ make run_redirect_err ./out 2> err.txt (...)
/dev/null
.
Makefile
care să ruleze același program și să redirecteze atât intrările, cât și erorile, într-o singură comandă. Pentru intrări, creați un fișier numit input.txt
care să conțină informațiile pe care le cere programul. Folosiți operatorul <
. Pentru erori, redirectați în fișierul errors.txt
. Observați că pentru a redirecta ieșirile sau erorile, fișierul va fi creat automat.
Mai devreme am văzut cum putem redirecta intrarea standard astfel încât programul să preia dintr-un
fișier datele de care are nevoie. Putem obține același efect folosind operatorul |
(pipe).
student@uso:~/.../05-cli/support/need-to-know$ cat input.txt | ./out Enter your name. Make sure it only contains letters: Now enter your surname. Make sure it only contains letters: Can I have your email? And last, give me your age: [log] Thanks! You're good to go..
Diferența dintre cele 2 exemple de mai sus o face numărul de procese create. În cazul redirectării,
este creat un singur proces, pe când în cel de-al doilea sunt create două procese, primul pornit de comanda
cat input.txt
și al doilea de ./out
care se ocupă de rularea binarului. Este de reținut faptul că ieșirea
primului proces este servită drept intrare pentru cel de-al doilea.
Să ne amintim de fișierul /etc/passwd
conține informații despre toți utilizatorii din sistem.
student@uso:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin (...)
În Linux există filtrul de text cut
prin care putem extrage doar anumite informații dintr-un output.
Să zicem că vrem să extragem doar numele utilizatorilor, fără informațiile legate de grupuri sau home directory.
student@uso:~/uso-lab$ cat /etc/passwd | cut -f1 -d":" root daemon bin (...)
-f1
specifică faptul că vrem prima coloană, iar argumentul -d:
specifică delimitatorul
de coloane, în cazul nostru :
.
man sort
)wc
, obțineți numărul de utilizatori din sistem.|
și tail
).
Comanda stat
ne afișează mai multe informații despre un fișier din sistem. Vrem să extragem din outputul
acestei comenzi doar data ultimei modificări. Vom folosi utilitaturl grep pentru a extrage linia pe care se
află informațiile despre data ultimei modificări.
student@uso:~/uso-lab$ cd ~/uso-lab/05-cli/support/need-to-know student@uso:~/.../05-cli/support/need-to-know$ stat Makefile | grep "Modify" Modify: 2018-10-29 23:40:49.942659138 +0200
cut
extrageți din ieșirea comenzii anterioare doar data modificării.
Fișierul special /dev/urandom
conține bytes aleatori. Listați conținutul acestui fișier. Folosiți
combinația de taste CTRL + C
pentru a opri acest proces.
student@uso:~/uso-lab$ cat /dev/urandom (...) ^C student@uso:~/uso-lab$
/dev/random
, generați o parolă aleatoare de 32 de caractere. Vă puteți inspira de aici.
Pentru a înlănțui 2 sau mai multe comenzi folosim operatorul ;
. Cele două procese pornite sunt
independente și se vor executa indiferent de finalitatea celei care se execută prima.
student@uso:~/uso-lab$ cd ~/uso-lab/05-cli/support/need-to-know; ls -l total 8 -rw-rw-r-- 1 student student 122 Oct 29 23:40 Makefile -rw-rw-r-- 1 student student 1463 Oct 29 23:39 dummy_check.c student@uso:~/.../05-cli/support/need-to-know$
În continuare, vom folosi comanda ping www.google.com
pentru a testa dacă avem conectivitate la
Internet. În cazul în care avem, vrem să deschidem un browser pe pagina www.google.com
. Vom folosi
operatorul &&
.
student@uso:~/uso-lab$ ping -c 1 www.google.com && firefox www.google.com
Acum încercați să înlocuiți www.google.com
cu www.random-webiste.xyz
și &&
cu ||
.
Observați ce se întâmplă.
~/uso-lab/05-cli/support/need-to-know/err-file
și, folosind o singură comandă, compilați și rulați programul simple_pow.c
. În cazul în care apar erori de compilare, vrem să nu rulăm executabilul. Rezolvați eroarea astfel încât programul să compileze cu succes și rulați-l. (Hint: ce bibliotecă folosește programul simple_pow.c
?)