Need to know

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

Fără a mai tasta din nou comanda de mai sus, putem folosi !! 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$

Observați că variabila 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

Redirectarea datelor de intrare, ieșire și erorile

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
(...)

Uzual, erorile sunt redirectate către fișierul special /dev/null.

  1. Adăugați o regulă în fișierul 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.

Comunicare interprocese

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.

Filtre de procesare

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
(...)

Argumentul -f1 specifică faptul că vrem prima coloană, iar argumentul -d: specifică delimitatorul de coloane, în cazul nostru :.

  1. Pornind de la comanda de mai sus, afișați numele utilizatorilor sortați alfabetic. (Hint: man sort)
  2. Folosind utilitarul wc, obțineți numărul de utilizatori din sistem.
  3. Să afișeze cele mai consumatoare de memorie 10 procese din sistem. (Hint: folosiți | ș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
  1. Folosind filtrul 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$
  1. Folosindu-vă de fișierul /dev/random, generați o parolă aleatoare de 32 de caractere. Vă puteți inspira de aici.

Înlănțuirea comenzilor

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$
  1. Alegeți 2 aplicații de aici și instalați-le folosind o singură comandă.

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

  1. Mutați-vă la calea ~/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?)
uso/laboratoare/new/05-cli/need-to-know.txt · Last modified: 2020/11/10 21:53 by liza_elena.babu
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