Differences

This shows you the differences between two versions of the page.

Link to this comparison view

uso:cursuri:curs-10 [2018/12/02 22:03]
razvan.deaconescu
uso:cursuri:curs-10 [2022/12/12 20:02] (current)
sergiu.weisz
Line 1: Line 1:
-====== Curs 10 - Securitatea ​sistemului ​=======+====== Curs 10 - Securitatea ​Sistemului ​=======
  
-  * [[https://drive.google.com/​open?id=14sVjHvKTdhGXl_T2jrcr7y8nqGeXKk0P|Slide-uri curs]] +  * [[https://docs.google.com/​presentation/​d/​1_cb_aQCGOEsTfP7r1LXgiLpus9DMM9Fk/​edit#​slide=id.p1| Slide-uri curs]] 
-  * **Cuvinte cheie**: ​+  * **Suport de curs** 
 +    * [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor de operare]] 
 +        * Secțiunea 12 - Securitatea Sistemului 
 + 
 +<​HTML>​ 
 +<iframe src="​https://​docs.google.com/​presentation/​d/​e/​2PACX-1vRwHKFfa4yloqUMRxpZYvfYyvOJ7f7iRwFaGZpIPSmkA7z7XxNlais1y2uK3NqXzg/​embed?​start=false&​loop=false&​delayms=3000"​ frameborder="​0"​ width="​480"​ height="​389"​ allowfullscreen="​true"​ mozallowfullscreen="​true"​ webkitallowfullscreen="​true"></​iframe>​ 
 +</​HTML>​ 
 + 
 +/* 
 + 
 +====== Curs 09 - Considerente hardware. Mașini virtuale ======= 
 + 
 +  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-09/​curs-09-handout.pdf ​| Slide-uri curs]] 
 +  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-09/​curs-09-handout-4on1-notes.pdf | Handout 4on1 and notes space]] 
 +  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-09/​curs-09-handout-8on1.pdf | Handout 8on1]] 
 +  * **Cuvinte cheie**: ​hardware, placă de bază, magistrală (//bus//), procesor, memorie (RAM), hard disk, \cmd{dd}, system on a chip, mașină virtuală, //host//, //guest//, //​hypervisor//,​ VMware, VirtualBox, ''​.vmdk'',​ ''​.vmx'',​ ''​.vdi'',​ ''​.vbox'',​ ''​vboxmanage'',​ NAT, //​host-only//,​ //​bridged//,​ Open Virtualization Format
   * **Suport de curs**   * **Suport de curs**
-    * [[http://​elf.cs.pub.ro/​uso/​res/​carte/​uso_cap-12-sec.pdf|Capitolul 12: Securitatea sistemului]] 
     * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC | Introducere în sisteme de operare]]     * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC | Introducere în sisteme de operare]]
-      * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA279 | Capitolul ​10 Elemente de securitate]]+      * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA185 | Capitolul ​Analiza hardware a sistemului]] 
 +    * [[http://​www.amazon.com/​Virtual-Machines-Versatile-Platforms-Architecture/​dp/​1558609105 | Virtual Machines -- Versatile Platforms for Systems and Processes]] 
 +      * Capitolul 1 -- Introduction to Virtual Machines 
 +      * Capitolul 8 -- System Virtual Machines 
 +  * **Alte resurse** 
 +    * http://​www.binarytides.com/​linux-commands-hardware-info/​ 
 +    * http://​www.binarytides.com/​linux-command-check-disk-partitions/​ 
 +    * http://​www.cyberciti.biz/​faq/​linux-command-to-find-the-system-configuration-and-hardware-information/​ 
 +    * https://​www.virtualbox.org/​manual/​ch08.html 
 + 
 +<​HTML>​ 
 +  <​center>​ 
 +    <iframe src="​http://​docs.google.com/​viewer?​url=http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-09/​curs-09-handout.pdf&​embedded=true"​ width="​600"​ height="​480"​ style="​border:​ none;">​ 
 +    </​iframe>​ 
 +  </​center>​ 
 +</​HTML>​
  
 ===== Demo-uri ===== ===== Demo-uri =====
Line 42: Line 71:
 </​note>​ </​note>​
  
-==== Folosire umask pentru configurarea permisiunilor ​de creare ​====+==== Afișarea ​de informații despre placa de bază ====
  
-Unul dintre cele mai importante principii în securitate ​este principiul celui mai mic privilegiu (//least privilege//​)Pentru aceasta, inclusiv în sistemul ​de fișiere (fișiere, directoare),​ se recomandă permisiuni ​(drepturi de acces minime). Acestea pot fi schimbate folosind comanda ​''​chmod''​. Dorimînsă, să putem configura permisiunile implicite la crearea intrărilor în sistemul de fișiere. Pentru aceasta folosim comanda ​''​umask''​.+Placa de bază este suportul pentru alte componente hardwarePlaca de bază dispune de socluri ​(''​socket'',​ ''​slot''​) unde pot fi adăugate alte componente hardware (precum procesor sau module de memorie) sau controllere care fac legătura cu alte componente (precum controller SCSI pentru hard disk).
  
-La o rulare simplă, comanda ​''​umask'' ​ne afișează valoarea sa:<​code>​ +Comenzi prin care putem afișa informații despre componentele hardware conectate la magistralele (''​bus''​) plăcii de bază sunt ''​lspci'' ​și ''​lsusb''​. Rularea acestor comenzi în mașina virtuală duce la afișarea componentelor hardware **virtuale** conectate la placa de bază:<​code>​ 
-student@uso-demo:​~$ ​umask +student@uso-demo:​~$ ​lspci 
-0022+00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) 
 +00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/​Triton II] 
 +00:01.1 IDE interface: Intel Corporation 82371AB/​EB/​MB PIIX4 IDE (rev 01) 
 +00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter 
 +00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 
 +00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service 
 +00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01) 
 +00:06.0 USB controller: Apple Inc. KeyLargo/​Intrepid USB 
 +00:07.0 Bridge: Intel Corporation 82371AB/​EB/​MB PIIX4 ACPI (rev 08) 
 +00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 
 +00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/​ICH8M-E) SATA Controller [AHCI mode] (rev 02) 
 + 
 +student@uso-demo:​~$ lsusb 
 +Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet 
 +Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 </​code>​ </​code>​
-Comanda ''​umask''​ indică permisiunile care vor fi **absente** în momentul creării unor intrări. Regulile de stabilire a permisiunilor de creare sunt: 
-  * pentru fișiere: 666 & ~umask (adică 666 **ȘI logic** cu masca negată) 
-  * pentru directoare: 777 & ~umask (adică 777 **ȘI logic** cu masca negată) 
  
-Pentru ''​umask = 0022''​''​~umask = 7755''​. Rezultă permisiunile ​de creare+În output-ul comenzii putem vedea informații despre hardware-ul expus de mașina virtualăîn special controllerele care se regăsesc pe placa de rețea. Observăm controllere pentru
-  * pentru fișiere: ​''​666 & 7755 = 0644''​ +  * placa video (''​VGA''​) 
-  * pentru directoare: ''​777 & 7755 = 0755''​+  * plăcile de rețea (''​Ethernet''​) de 1 Gb (gigabit)sunt două plăci de rețea, expuse prin interfețele de rețea ​''​eth0'' ​și ''​eth1''​ 
 +  * SATA (controller pentru hard disk)
  
-Putem verifica acest lucru creând un fișier și un director:<​code>​ +Pentru a afișa informații extinse hardware despre componentele sistemului, cel mai bine este să folosim comanda ''​lshw''​. Pentru început, pe mașina virtuală, trebuie să instalăm pachetul ''​lshw''​:<​code>​ 
-student@uso-demo:​~$ ​touch test-file +student@uso-demo:​~$ ​sudo apt-get install lshw
-student@uso-demo:​~$ mkdir test-dir +
-student@uso-demo:​~$ ls -l +
-total 4 +
-drwxr-xr-x 2 student student 4096 Jan  5 11:31 test-dir +
--rw-r--r-- 1 student student ​   0 Jan  5 11:31 test-file+
 </​code>​ </​code>​
-Observăm că fișierul (''​test-file''​) a fost creat cu permisiunile ''​%%rw-r--r--%%''​ (adică ''​644''​) iar directorul (''​test-dir''​) a fost creat cu permisiunile ''​%%rwxr-xr-x%%''​ (adică ''​755''​). Adică valorile așteptate. 
  
-În ideea de //least privilege//,​ este uzual să oferim permisiuni doar utilizatorului (''​user''​și nici o permisiune pentru ''​group''​ și ''​others''​. Pentru aceasta stabilim valoarea ''​umask''​ la ''​077'',​ folosind comanda<​code>​ +Printr-o simplă rulare a comenzii ​''​lshw'' ​vom afișa informații despre întreg hardware-ul sistemului<​code>​ 
-student@uso-demo:​~$ ​umask 077 +student@uso-demo:​~$ ​sudo lshw  
-student@uso-demo:~$ umask +uso-demo ​                  
-0077+    descriptionComputer 
 +    width: 32 bits 
 +    ​capabilities:​ smbios-2.5 
 +  *-core 
 +[...]
 </​code>​ </​code>​
-Observăm din a doua comandă că acum valoarea ''​umask''​ este alta. 
  
-Creăm un nou fișier și un nou director și verificăm aplicarea noii valori a ''​umask'' ​pentru stabilirea permisiunilor de creare:<​code>​ +Pentru a afișa informații despre hardware în format tabelar, mai ușor de urmărit, folosim opțiunea ​''​-short''​ la comanda ''​lshw''<​code>​ 
-student@uso-demo:​~$ ​touch test-file-2 +student@uso-demo:​~$ ​sudo lshw -short 
-student@uso-demo:​~$ mkdir test-dir-2 +H/W path        Device ​     Class       ​Description 
-student@uso-demo:​~$ ls -l  +=================================================== 
-total +                            system ​     Computer 
-drwxr-xr-student student 4096 Jan  5 11:31 test-dir +/0                          bus         ​Motherboard 
-drwx------ ​student student 4096 Jan  5 11:36 test-dir-2 +/0/0                        memory ​     500MiB System memory 
--rw-r--r-- ​student student ​   ​0 ​Jan  ​11:31 test-file +/0/1                        processor ​  ​Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
--rw------- 1 student student ​   ​Jan  5 11:36 test-file-2+/​0/​100 ​                     bridge ​     440FX 82441FX PMC [Natoma] 
 +/​0/​100/​1 ​                   bridge ​     82371SB PIIX3 ISA [Natoma/​Triton II] 
 +/​0/​100/​1.1 ​                 storage ​    ​82371AB/​EB/​MB PIIX4 IDE 
 +/0/100/                   ​display ​    ​VirtualBox Graphics Adapter 
 +/​0/​100/​3 ​       eth0        network ​    ​82540EM Gigabit Ethernet Controller 
 +/​0/​100/​4 ​                   generic ​    ​VirtualBox Guest Service 
 +/​0/​100/​5 ​                   multimedia ​ 82801AA AC'97 Audio Controller 
 +/​0/​100/​6 ​                   bus         ​KeyLargo/​Intrepid USB 
 +/​0/​100/​6/​1 ​     usb1        bus         OHCI PCI host controller 
 +/​0/​100/​6/​1/​1 ​               input       USB Tablet 
 +/​0/​100/​7 ​                   bridge ​     82371AB/​EB/​MB PIIX4 ACPI 
 +/0/100/       ​eth1 ​       network ​    ​82540EM Gigabit Ethernet Controller 
 +/​0/​100/​d ​                   storage ​    ​82801HM/​HEM (ICH8M/​ICH8M-E) SATA Controller [AHCI mode] 
 +/0/           ​scsi0 ​      ​storage ​     
 +/0/2/​0.0.0 ​     /​dev/​sda ​   disk        8589MB VBOX HARDDISK 
 +/0/2/0.0.0/1    ​/​dev/​sda1 ​  ​volume ​     7806MiB EXT4 volume 
 +/0/​2/​0.0.0/​2 ​   /​dev/​sda2 ​  ​volume ​     383MiB Extended partition 
 +/​0/​2/​0.0.0/​2/​ /​dev/​sda5 ​  ​volume ​     383MiB Linux swap / Solaris partition 
 +/0/3            scsi2       ​storage ​     
 +/​0/​3/​0.0.0 ​     /​dev/​cdrom ​ disk        DVD reader
 </​code>​ </​code>​
-Observăm că fișierul (''​test-file-2''​) a fost creat cu permisiunile ''​%%rw-------%%''​ (adică ''​600''​) iar directorul (''​test-dir''​) a fost creat cu permisiunile ''​%%rwx------%%''​ (adică ''​700''​). Adică valorile așteptaterezultate în urma calculului:​ +Ni se afișează informații despre componentele hardware ale sistemului: placă de bază, controllere,​ memorie RAM, hard disk. Putem afișa informații detaliate ​și despre fiecare componentă în parte, așa cum vom vedea mai jos.
-  * pentru fișier: ''​%%666 & ~umask = 666 & ~0077 = 666 & 7700 = 600 = rw-------%%''​ +
-  * pentru director: ''​%%777 & ~umask =777 & ~0077 = 777 & 7700 = 700 = rwx------%%''​ +
- +
-Valoarea ''​umask''​ este configurată funcție de nevoile utilizatorului ținând cont și de principiul celui mai mic privilegiu.+
  
 <​note>​ <​note>​
-Valoarea ''​umask''​ este pe 4 cifre în octal. Prima cifră este aferentă biților speciali (''​setuid'',​ ''​setgid''​''​sticky''​) folosiți în permisiuniNu insistăm pe acest lucru. Puteți găsi informații în secțiunile aferente din [[http://​man7.org/​linux/​man-pages/man1/​chmod.1.html|pagina de manual a chmod]].+Alte comenzi care afișează informații despre componentele hardware ale sistemului sunt comenzile ​''​dmidecode'',​ ''​inxi'' ​și ''​hwinfo''​. ​Dacă nu sunt instalate le puteți instala folosind comenzi precum cele de mai jos:<​code>​ 
 +sudo apt-get install dmidecode 
 +sudo apt-get install inxi 
 +sudo apt-get install hwinfo 
 +</code>
 </​note>​ </​note>​
  
 <​note>​ <​note>​
-Pentru configurarea persistentă a valorii ''​umask''​ se recomandă plasarea comenzii ​de configurare într-un fișier de configurare a sesiunii ​de shell (precum ''​~/.bashrc''​).+Detalii despre comnezile ​de afișare de informații despre hard discuri găsiți și la link-ul indicat ca resursă utilă în partea ​de sus a paginii: http://www.binarytides.com/​linux-commands-hardware-info/​
 </​note>​ </​note>​
-==== Folosire John the Ripper pentru password cracking ​====+==== Afișarea de informații despre procesor ​====
  
-Din perspectiva atacatorului (sau unui [[http://​www.computerhope.com/​jargon/​e/​ethihack.htm|hacker etic]]) este util să putem "​sparge"​ parolele dintr-un sistem. Dacă ajungem să avem acces la baza de date cu parole ​unui sistem ​putem încerca spargerea acestora. Un utilitar pentru acest lucru este [[http://​www.openwall.com/​john/​|John the Ripper]]. +Pentru ​afișinformații despre procesorul sistemului ​putem folosi ​comanda ​''​lscpu''<​code>​ 
- +student@uso-demo:​~$ ​lscpu 
-Pentru a folosi ''​john'' ​întâi îl vom instala:<​code>​ +Architecture: ​         i686 
-student@uso-demo:​~$ ​sudo apt-get install john +CPU op-mode(s): ​       32-bit 
-Reading package lists... Done +Byte Order: ​           Little Endian 
-Building dependency tree        +CPU(s):                ​1 
-[...] +On-line CPU(slist:   0 
-Setting up john-data ​(1.8.0-2... +Thread(s) per core:    ​1 
-Setting up john (1.8.0-2...+Core(s) per socket: ​   1 
 +Socket(s): ​            1 
 +Vendor ID:             ​GenuineIntel 
 +CPU family: ​           6 
 +Model: ​                42 
 +Model name:            Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
 +Stepping: ​             7 
 +CPU MHz:               2491.852 
 +BogoMIPS: ​             4983.70 
 +Hypervisor vendor: ​    KVM 
 +Virtualization type:   ​full 
 +L1d cache: ​            32K 
 +L1i cache: ​            32K 
 +L2 cache: ​             256K 
 +L3 cache: ​             3072K
 </​code>​ </​code>​
  
-John vine în mod implicit cu un dicționar ​de parole comune de folosit în fișierul ''/​usr/​share/​john/​password.lst''<​code>​ +Comanda ne afișează tipul procesorului expus de mașina virtualăAcesta este un procesor single coreși este mapat direct peste procesorul fizic (adică al sistemului fizic peste care rulează mașina virtuală). De aceeaoutput-ul acestei comenzi va diferi depinzând de sistemul fizic pe care rulează mașina virtuală.
-student@uso-demo:​~$ head -20 /​usr/​share/​john/​password.lst  +
-#!comment: This list has been compiled by Solar Designer of Openwall Project +
-#!comment: in 1996 through 2011.  It is assumed to be in the public domain. +
-#​!comment:​ +
-#!comment: This list is based on passwords most commonly seen on a set of Unix +
-#!comment: systems in mid-1990'​ssorted for decreasing number of occurrences +
-#​!comment: ​(that is, more common passwords are listed first).  It has been +
-#!comment: revised to also include common website passwords from public lists +
-#!comment: of "top N passwords"​ from major community website compromises that +
-#!comment: occurred in 2006 through 2010. +
-#​!comment:​ +
-#!comment: Last update: 2011/11/20 (3546 entries) +
-#​!comment:​ +
-#!comment: For more wordlistssee http://​www.openwall.com/​wordlists/​ +
-123456 +
-12345 +
-password +
-password1 +
-123456789 +
-12345678 +
-1234567890 +
-student@uso-demo:~$ wc -l /​usr/​share/​john/​password.lst +
-3559 /​usr/​share/​john/​password.lst +
-</​code>​ +
-Există fișiere de parole mai bune care, în general, costă bani.+
  
-Aceste parole ​sunt parole frecvente folosite ​de utilizatori și care pot fi ușor sparte cu John.+În output-ul comenzii ne sunt afișate informații despre procesor, precum numărul ​de core-uri, numărul modelului, frecvența, dimensiunea memoriei cache.
  
-Pentru verificare, să creăm doi utilizatori (''​ana'' ​și ''​bogdan''​) ​cu parole relativ comune ​''​test123'' ​și ''​qazwsx'':​<​code>​ +Aceste informații pot fi afișate ​și cu ajutorul comenzii ​''​lshw''<​code>​ 
-student@uso-demo:​~$ sudo useradd ​--d /home/ana -s /bin/bash ana +student@uso-demo:​~$ sudo lshw -class cpu 
-student@uso-demo:~$ sudo useradd ​-m -d /​home/​bogdan -s /bin/bash bogdan +  *-cpu                    
-student@uso-demo:~$ less /​usr/​share/​john/​password.lst +       productIntel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
-student@uso-demo:~$ echo "ana:test123"​ | sudo chpasswd +       vendorIntel Corp
-student@uso-demo:~$ echo "​bogdan:qazwsx"​ | sudo chpasswd +       physical id
-student@uso-demo:~$ id ana +       bus infocpu@0 
-uid=1001(ana) gid=1001(ana) groups=1001(ana) +       version6.10.7 
-student@uso-demo:~$ id bogdan +       ​serial0002-06A7-0000-0000-0000-0000 
-uid=1002(bogdan) gid=1002(bogdan) groups=1002(bogdan)+       size2500MHz 
 +       width: 32 bits 
 +       capabilitiesfpu fpu_exception wp vme de pse tsc msr mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 rdtscp constant_tsc nonstop_tsc pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm
 </​code>​ </​code>​
  
-Mai sus am creat cei doi utilizatori cu parolele dorite.+Informațiile despre procesor sunt accesibile, în mod tradițional,​ în sistemul de fișiere ''/​proc'',​ prin intermediul fișierului ''/​proc/​cpuinfo'':<​code>​ 
 +student@uso-demo:​~$ cat /​proc/​cpuinfo  
 +processor : 0 
 +vendor_id : GenuineIntel 
 +cpu family : 6 
 +model : 42 
 +model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
 +[...] 
 +</​code>​
  
 <​note>​ <​note>​
-Comanda ''​chpasswd'' ​este o comandă care schimbă/​actualizează parola unuia sau mai mulți utilizatori. Parola primește la intarea standard linii în forma ''<​username>:<​password>''​ și actualizează parola utilizatorului ''<​username>''​ cu valoarea ''<​password>''​.+Folosirea oricăror dintre cele trei comenzi de mai sus este aproximativ echivalentă. O folosim pe cea cu care ne simțim cel mai confortabil.
 </​note>​ </​note>​
  
-Parolele utilizatorilor sunt stocate în forma criptată (//hash//) în fișierul ''/​etc/​shadow''​accesibil doar cu permisiuni privilegiate<​code>​ +Dacă ne interesează să aflăm pe scurt, numărul de core-uri/procesoare din sistem, respectiv arhitectura hardware a sistemuluifolosim comenzile<​code>​ 
-student@uso-demo:​~$ ​tail -2 /etc/shadow +student@uso-demo:​~$ ​nproc 
-tail: cannot open ‘/​etc/​shadow’ for reading: Permission denied +1
-student@uso-demo:​~$ ls -l /​etc/​shadow +
--rw-r----- ​root shadow 1276 Jan  5 11:59 /​etc/​shadow +
-student@uso-demo:​~$ sudo tail -2 /​etc/​shadow +
-ana:​$6$Lz4VGpO.$NhGn3XzSJ8dRd.EURfPRnPPlU3rvTG5C7xEvvh8taiPCLEFb0V2LAFG.6s.GlXWZqby326wvZm91QMDoCXCoU0:​16805:​0:​99999:​7:::​ +
-bogdan:​$6$AJ8cjSHz$QdI1KrolofQtAk4F2bHweL7vxzGYcM3gHxfLgRiUzR7UtEugUZyWARc66zo8YMEiMmAWob5PJMlaoUyA8rfCx.:​16805:​0:​99999:​7:::​ +
-</​code>​ +
-Dacă avem acces la hash-urile parolelor putem încerca spargerea lor cu John. În cazul de față vom reuși pentru că parolele sunt foarte simple:<​code>​ +
-student@uso-demo:​~$ sudo tail -2 /etc/shadow > shadow-entries +
-student@uso-demo:​~$ cat shadow-entries  +
-ana:​$6$Lz4VGpO.$NhGn3XzSJ8dRd.EURfPRnPPlU3rvTG5C7xEvvh8taiPCLEFb0V2LAFG.6s.GlXWZqby326wvZm91QMDoCXCoU0:​16805:​0:​99999:​7:::​ +
-bogdan:​$6$AJ8cjSHz$QdI1KrolofQtAk4F2bHweL7vxzGYcM3gHxfLgRiUzR7UtEugUZyWARc66zo8YMEiMmAWob5PJMlaoUyA8rfCx.:​16805:​0:​99999:​7:::​+
  
-student@uso-demo:​~$ ​/​usr/​sbin/​john -wordlist:/​usr/​share/​john/​password.lst shadow-entries +student@uso-demo:​~$ ​arch 
-Created directory: /​home/​student/​.john +i686
-Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/32]) +
-Press '​q'​ or Ctrl-C to abort, almost any other key for status +
-test123 ​         (ana) +
-qazwsx ​          ​(bogdan) +
-2g 0:00:00:33 100% 0.05959g/s 62.93p/s 71.51c/s 71.51C/s pretty..celtic +
-Use the "​--show"​ option to display all of the cracked passwords reliably +
-Session completed+
 </​code>​ </​code>​
-Mai sus, pentru început, am extras cele două intrări din ''/​etc/​shadow''​ și apoi am folosit John ca să încercăm spargerea lor. În mod așteptat, parolele fiind simple, John a reușit spargerea lor. 
- 
-În general, un atacator va încerca să obțină accesul la baza de date cu parole. Chiar dacă acestea sunt criptate, atacatorul va încerca să le spargă. Doar parolele puternice (cu multe caractere dintr-un set mai mare) pot supraviețui suficient de mult timp unui atacator. Chiar și așa, se recomandă actualizarea parolelor după o perioadă de 6 luni sau 1 an. 
  
 <​note>​ <​note>​
-John are diverse opțiuni care permit scheme de alterare a parolelor din wordlist-uri. Aceste scheme prelungesc posibilitățile de parole încercate; de exemplu înlocuirea ​''​a'' ​cu ''​@'' ​sau ''​e'' ​cu ''​3''​. Cu un word list bun, multe parole pot fi sparte relativ rapid.+La fel cum am precizat mai sus, informații depsre procesor putem afla și folosind comenzile ​''​dmidecode''​''​inxi'' ​și ''​hwinfo''​.
 </​note>​ </​note>​
-==== Criptare/​decriptare folosind chei simetrice ==== 
  
-Pentru securizarea informației transmise sau stocate este recomandat ca aceasta ​să fie criptată. În Internetfoarte multe site-uri folosesc acum ''​HTTPS''​ (HTTP securizat). Pentru date locale se pot folosi utilitare de criptare.+Dacă dorim să vedem încărcarea sistemului și utilizarea procesoruluiputem folosi comanda ​''​top'' ​sau ''​htop''​. Aceste comenzi au avantajul că ne afișează și procesele sistemului și putem identifica procesele care consumă procesor și care afectează performanța sistemului ​(așa numitele //CPU hogs//).
  
-Un utilitar folosit pentru criptare (și alte operații criptografice) este ''​openssl''​. ​Cu ''​openssl''​ putem cripta și folosind chei simetrice și chei asimetrice.+Pentru a afișa sumar informații despre utilizarea procesorului putem folosi comanda ​''​mpstat''​:<​code>​ 
 +student@uso-demo:​~$ mpstat 
 +Linux 3.16.0-4-586 (uso-demo) 12/05/2015 _i686_ (1 CPU)
  
-Pentru testare, să creăm un fișier //plain text// (ușor de citit):<​code>​ +06:02:14 PM  CPU    %usr   ​%nice ​   %sys %iowait ​   %irq   ​%soft ​ %steal ​ %guest ​ %gnice ​  %idle 
-student@uso-demo:~$ echo "This is my life's biggest secretI have no life" > plain.txt +06:02:14 PM  all    0.25    0.00    0.13    0.70    0.00    0.02    0.00    0.00    0.00   98.91
-student@uso-demo:​~$ cat plain.txt  +
-This is my life's biggest secret: I have no life+
 </​code>​ </​code>​
 +În output-ul de mai sus, mare parte din procesor este liberă (''​idle''​):​ ''​98.91%''​ din timpul de procesor este marcat ''​idle''​.
 +==== Afișarea de informații despre memorie ====
  
-Pentru a cripta accest fișier, folosim algoritmul ​''​AES'' ​(//Advanced Encryption Standard//​),​ un standard de facto de criptare, cu ajutorul comenzii<​code>​ +Pentru a afla informații despre memoria RAM a sistemului putem folosi comanda ​''​lshw''​:<​code>​ 
-student@uso-demo:​~$ ​openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.dat +student@uso-demo:​~$ ​sudo lshw -class memory 
-enter aes-256-cbc encryption password: +  ​*-memory ​               ​ 
-Verifying - enter aes-256-cbc encryption password: +       descriptionSystem memory 
-student@uso-demo:​~$ ls -l encrypted.dat  +       physical id0 
--rw------- 1 student student 80 Jan  5 12:17 encrypted.dat +       size500Mi
-student@uso-demo:~$ xxd encrypted.dat ​ +
-00000005361 6c74 6564 5f5f 6b32 c1b2 6580 bcfe  Salted__k2..e... +
-0000010f988 bd4d 4432 9aa3 8925 0097 4262 1732  ...MD2...%..Bb.2 +
-0000020119a c5c8 f5de bca0 3a9e 4d96 57c7 1e1f  ........:​.M.W... +
-0000030: 3e22 e8ec eeec 3905 4e93 3ee8 fb5e c04a  >"​....9.N.>​..^.J +
-0000040: e443 955f c693 7171 fa10 f5ac ded1 f947  .C._..qq.......G+
 </​code>​ </​code>​
-În prima comandă am realizat criptarea fișierului ''​plain.txt''​ în fișierul ''​encrypted.dat''​. Utilitarul ne-a cerut cheia de criptare și apoi a realizat criptarea în fișierul ''​encrypted.dat''​. Fișierul este un fișier binar; putem urmări conținutul său folosind comanda ''​xxd''​. 
  
-De obicei vom șterge fișierul ''​plain.txt'' ​și apoi vom decriptala nevoie, fișierul ​''​encrypted.dat''​. ​Facem acest lucru folosind comenzile de mai jos<​code>​ +Din păcate comanda ne oferă informații minimale despre memoria RAMDacă ne interesează viteza de acces, numărul de module ​și alte informațiiputem folosi comanda ​''​dmidecode''​. ​Din păcate, pe mașina virtuală nu afișează informații extinse, dar putem afla informații ​mai multe rulând comanda pe un sistem Linux instalat nativ:<​code>​ 
-student@uso-demo:~$ rm plain.txt  +razvan@einherjar:~$ sudo dmidecode ​--type memory 
-student@uso-demo:~$ openssl enc -d -aes-256-cbc -in encrypted.dat -out plain.txt +# dmidecode 3.
-enter aes-256-cbc decryption password: +Getting SMBIOS data from sysfs
-student@uso-demo:​~$ cat plain.txt  +SMBIOS 2.6 present.
-This is my life's biggest secret: I have no life +
-</​code>​ +
-Observăm că, după ștergerea fișierului //plain text// inițial, și după operația de decriptare căreia i-am transmis cheia folosită la pasul anterior, am obținut fișierul inițial.+
  
-<​note>​ +Handle 0x0005, DMI type 16, 15 bytes 
-Sunt și alți algoritmi posibili pentru criptare simetrică folosind comanda ''​openssl''​. Pentru a-i determina folosim comanda<​code>​ +Physical Memory Array 
-student@uso-demo:~$ openssl enc -help + LocationSystem Board Or Motherboard 
-</​code>​ + Use: System Memory 
-</​note>​+ Error Correction Type: None 
 + Maximum Capacity: 8 GB 
 + Error Information Handle: Not Provided 
 + Number Of Devices: 2
  
-Dacă dorim să stocăm fișierul criptat într-o formă de fișier text (dar tot criptat) putem realiza o codificare [[https://​en.wikipedia.org/​wiki/​Base64|base64]] a acestuia. Pentru aceastafolosim pentru criptare și decriptare comenzile în forma de mai jos:<​code>​ +Handle 0x0006DMI type 17, 28 bytes 
-student@uso-demo:~$ openssl enc -e -base64 -aes-256-cbc -in plain.txt -out encrypted.dat +Memory Device 
-enter aes-256-cbc encryption password+ Array Handle0x0005 
-Verifying - enter aes-256-cbc encryption password+ Error Information HandleNot Provided 
-student@uso-demo:~$ cat encrypted.dat ​ + Total Width64 bits 
-U2FsdGVkX18HD7U8AkSTfWFQEryHAjfJ7hQlWZQSdMvmdwZSES76zQz7JioIultg + Data Width64 bits 
-x4sLDHbAA6xTo8ioX3gG/​L+7REMUuN46hUXCBB+G1c4= + Size4096 MB 
- + Form Factor: SODIMM 
-student@uso-demo:~$ openssl enc -d -base64 -aes-256-cbc -in encrypted.dat -out plain.txt + Set: None 
-enter aes-256-cbc decryption password+ LocatorChannelA-DIMM0 
-student@uso-demo:~$ cat plain.txt ​ + Bank LocatorBANK 0 
-This is my life's biggest secretI have no life + TypeDDR3 
-</​code>​ + Type DetailSynchronous 
- + Speed: 1333 MHz 
-Observăm mai sus că avem o formă ASCII a fișierului criptat ''​encrypted.dat''​. + ManufacturerSamsung 
-==== Criptare/​decriptare folosind chei asimetrice ==== + Serial Number66313530 
- + Asset TagUnknown 
-Criptarea cu chei simetrice are avantajul vitezei dar dezavantajul că trebuie știută (și partajată între cel care criptează și cel care decriptează) cheia de criptare. Mai mult, dacă acea cheie este slabă, un atacator poate sparge cheia și decripta fișierul. + Part NumberM471B5273CH0-CH9  ​ 
- + RankUnknown
-Criptarea cu chei asimetrice folosește cheia publică pentru criptare; oricine poate astfel cripta. Pentru decriptare se folosește cheia privată și doar cel care o deține poate decripta. +
- +
-Pentru aceasta, vom folosi tot utilitarul ''​openssl''​. Vom folosi algoritmul ''​RSA''​ (//​Rivest-Shamir-Adleman//​) pentru criptarea asimetrică. Pentru început vom genera cheia privată și cheia publică:<​code>​ +
-student@uso-demo:~$ openssl genrsa -out privkey 2048 +
-Generating RSA private key, 2048 bit long modulus +
-......................................................+++ +
-.....................+++ +
-e is 65537 (0x10001) +
-student@uso-demo:~$ cat privkey ​ +
------BEGIN RSA PRIVATE KEY----- +
-MIIEowIBAAKCAQEA4o1PEkzZawYItZFdxsPwA/​7kbffcDLQOSCtbdORA23uO6zk8 +
-[...] +
------END RSA PRIVATE KEY----- +
-student@uso-demo:~$ openssl rsa -pubout -in privkey -out pubkey +
-writing RSA key +
-student@uso-demo:~$ cat pubkey  +
------BEGIN PUBLIC KEY----- +
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4o1PEkzZawYItZFdxsPw +
-A/​7kbffcDLQOSCtbdORA23uO6zk8+4WLYrc1tgh827N2qcW28UsIxaA2YlowXJu7+
 [...] [...]
------END PUBLIC KEY----- 
 </​code>​ </​code>​
 +În output-ul comenzii ''​dmidecode''​ putem afla numărul de sloturi (''​bank''​),​ fabricantul,​ viteza, tipul.
  
-Mai sus am generat cheia privată în fișierul ​''​privkey''​ și cheia publică în fișierul ''​pubkey''​. Cheia publică este derivată din cheia privată. Formatul în care sunt stocate cele 2 cheie se numește PEM (//​Privacy-enhanced Electronic Mail//). +Tot cu ajutorul comenzii ​''​dmidecode'' ​putem afișa informații despre memoria cache a sistemului:<​code>​ 
- +razvan@einherjar:~$ sudo dmidecode ​-t cache
-Ca să criptăm fișierul ''​plain.txt''​ folosind cheia publică din fișierul ''​pubkey'',​ vom rula comanda<​code>​ +
-student@uso-demo:~$ openssl rsautl ​-encrypt -in plain.txt -out encrypted.dat -pubin -inkey pubkey  +
- +
-student@uso-demo:​~$ xxd encrypted.dat  +
-0000000: 97e7 bc72 4d76 708f 5b2b 7437 b698 2937  ...rMvp.[+t7..)7 +
-[...] +
-00000f0: dfd0 3bfc f5b1 9a17 9655 2b9b e441 7bba  ..;​......U+..A{.+
 </​code>​ </​code>​
  
-Fișierul criptat este un fișier binar; îl putem vizualiza folosind ​comanda ''​xxd''​+Dacă ne interesează informații despre utilizarea memoriei sistemului, ​putem folosi ​comanda ''​free'':<​code>​ 
- +student@uso-demo:​~$ ​free -
-Pentru a decripta fișierul ''​encrypted.dat''​ înapoi în fișierul ''​plain.txt''​ folosind cheia privată din fișierul ''​privkey''​ vom rula comanda de mai jos:<​code>​ +             ​total ​      ​used ​      ​free ​    ​shared ​   buffers ​    ​cached 
-student@uso-demo:​~$ ​openssl rsautl ​-decrypt -in encrypted.dat -out plain.txt -inkey privkey +Mem:           ​500 ​       270        230          4         ​24 ​       196 
-student@uso-demo:~$ cat plain.txt ​ +-/+ buffers/​cache        48        451 
-This is my life's biggest secretI have no life+Swap         ​382 ​         0        382
 </​code>​ </​code>​
 +Comanda afișează totalul de memorie RAM a sistemului și cât din acesta este folosit. În cazul nostru avem ''​500''​ de MB de memorie RAM, dintre care sunt folosiți ''​270''​ MB și sunt disponibili ''​230''​ MB.
  
-<​note>​ +Detalii despre utilizarea memoriei RAM găsim în fișierul ''​/​proc/​meminfo''​:<​code>​ 
-Cheia privată, la fel cum este cheia/​parola ​în criptare simetrică, trebuie ținută în siguranță. O recomandare este ca o cheie privată să fie protejată și de un passphrase. Introducerea passphrase-ului condiționează folosirea cheii private. O altă recomandare este folosirea unui [[http://​lifehacker.com/​5529133/​five-best-password-managers|Password manager]] care să rețină toate parolele și cheile în mod sigur (să nu fie scrise plain text undeva) sub protecția unui master password. +student@uso-demo:​~$ ​cat /​proc/​meminfo ​ 
-</​note>​ +MemTotal: ​        ​512596 kB 
-==== Semnare/​verificare folosind chei asimetrice ==== +MemFree         ​236044 kB 
- +MemAvailable: ​    ​468944 kB 
-Un alt scenariu de folosire a cheilor asimetrice este pentru semnarea unor mesaje. Semnarea se face cu ajutorul cheii private (doar posesorul are acces) iar verificarea cu ajutorul cheii publice (oricine poate verifica). De obicei se transmite mesajul în plain text dar este de știut că cel care a trimis mesajul chiar este cel care l-a trimis, și pentru aceea se atașează ​fișierul ​de tip semnătură mesajului. +Buffers: ​          25296 kB 
- +Cached          201248 kB
-Vom folosi tot cheia privată ​''​privkey'' ​și cheia publică ''​pubkey''​ de mai sus. +
- +
-Pentru semnarea mesajului vom folosi<​code>​ +
-student@uso-demo:​~$ ​openssl rsautl -sign -in plain.txt -out signature -inkey privkey ​ +
-student@uso-demo:~$ xxd signature ​ +
-0000000910f be3f 6a47 b150 f239 8105 3d64 a60d  ...?​jG.P.9..=d..+
 [...] [...]
-00000f0: 7ffd 183f 26e4 221f c9dc 90b5 9510 7eca  ...?&​."​.......~. 
 </​code>​ </​code>​
  
-Pentru verificarea semnăturii vom folosi comanda<​code>​ +Informații despre utilizarea memoriei sistemului aflăm și prin folosirea comenzilor ''​top''​ sau ''​htop''​. Aceste comenzi au avantajul că ne afișează și procesele sistemului și putem identifica procesele care consumă memorie și care afectează performanța sistemului (așa numitele //memory hogs//).  
-student@uso-demo:​~$ ​openssl rsautl ​-verify ​-in signature ​-pubin -inkey pubkey ​ +==== Afișarea de informații despre discuri ==== 
-This is my life's biggest secret: I have no life+ 
 +La fel ca mai sus pentru afișa informații detaliate despre discurile sistemului putem folosi comanda ​''​lshw'':​<​code>​ 
 +student@uso-demo:​~$ ​sudo lshw -class disk -class storage ​-class volume ​-short 
 +H/W path        Device ​     Class       ​Description 
 +=================================================== 
 +/​0/​100/​1.1 ​                 storage ​    ​82371AB/​EB/​MB PIIX4 IDE 
 +/​0/​100/​d ​                   storage ​    ​82801HM/​HEM (ICH8M/​ICH8M-E) SATA Controller [AHCI mode] 
 +/0/2            scsi0       ​storage ​     
 +/​0/​2/​0.0.0 ​     /​dev/​sda ​   disk        8589MB VBOX HARDDISK 
 +/​0/​2/​0.0.0/​1 ​   /​dev/​sda1 ​  ​volume ​     7806MiB EXT4 volume 
 +/​0/​2/​0.0.0/​2 ​   /​dev/​sda2 ​  ​volume ​     383MiB Extended partition 
 +/​0/​2/​0.0.0/​2/​5 ​ /​dev/​sda5 ​  ​volume ​     383MiB Linux swap / Solaris partition 
 +/0/3            scsi2       ​storage ​     
 +/​0/​3/​0.0.0 ​     /​dev/​cdrom ​ disk        DVD reader
 </​code>​ </​code>​
  
-<note+Alte comenzi cu un output similar sunt:<code
-Pentru criptare/​decriptare și semnare/​verifcare cu chei asimetrice putem folosi și suita [[https://​www.gnupg.org/​|GnuPG]] (//GNU Privacy Guard//). +student@uso-demo:~$ sudo fdisk -l
-</​note>​+
  
-/*+Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 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 
 +Disklabel type: dos 
 +Disk identifier: 0x1aaa7728
  
-====== Curs 10 - Shell scripting =======+Device ​    ​Boot ​   Start      End  Sectors ​ Size Id Type 
 +/​dev/​sda1 ​ *        2048 15988735 15986688 ​ 7.6G 83 Linux 
 +/​dev/​sda2 ​      ​15990782 16775167 ​  ​784386 ​ 383M  5 Extended 
 +/​dev/​sda5 ​      ​15990784 16775167 ​  ​784384 ​ 383M 82 Linux swap / Solaris
  
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout.pdf | Slide-uri curs]] +student@uso-demo:~$ sudo parted ​-l 
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-4on1-notes.pdf | Handout 4on1 and notes space]] +ModelATA VBOX HARDDISK (scsi) 
-  * [[http://elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-8on1.pdf | Handout 8on1]] +Disk /dev/sda8590MB 
-  * **Cuvinte cheie**variabile, variabile de mediu, escaping, expandare, one liner, filtru de text, script shell, ''​IFS'',​ ''​while read'',​ ''​for'',​ ''​if'',​ expresii regulate, metacaractere,​ globbing, ''​grep'',​ prelucrare de date, automatizare +Sector size (logical/​physical): 512B/512B 
-  * **Suport de curs** +Partition Tablemsdos 
-    * Suport ​(Introducere în sisteme de operare) +Disk Flags: ​
-      * Capitolul 12 -- Shell scripting +
-        * Secțiunile 12.4, 12.5, 12.6, 12.9 +
-    * [[http://​www.amazon.com/​Regular-Expressions-Cookbook-Jan-Goyvaerts/​dp/​1449319432|Regular Expressions Cookbook]] +
-      * Puteți descărca fișierul PDF aferent de [[https://​github.com/​shihyu/​Regular_Expressions|aici]]. +
-      * Capitolul 1 -- Introduction to Regular Expressions +
-      * Capitolul 2 -- Basic Regular Expression Skills+
  
-<​HTML>​ +Number ​ Start   ​End ​    ​Size ​   Type      File system ​    Flags 
-  <​center>​ + 1      1049kB ​ 8186MB ​ 8185MB ​ primary ​  ​ext4 ​           boot 
-    <iframe src="​https://​docs.google.com/​viewer?​url=http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout.pdf&​embedded=true"​ width="​600"​ height="​480"​ style="​border:​ none;">​ + 2      8187MB ​ 8589MB ​ 402MB   ​extended 
-    </​iframe>​ + 5      8187MB ​ 8589MB ​ 402MB   ​logical ​  ​linux-swap(v1)
-  ​</​center>​ +
-</​HTML>​+
  
-===== Demo-uri ===== 
  
-Pentru rularea ​demo-urilor de mai jos folosim [[http://​repository.grid.pub.ro/cs/​uso/​USO%20Demo.ova|mașina virtuală USO Demo]]. Mașina virtuală (în format OVA) poate fi importată în VirtualBox. Comenzile le vom rula în cadrul mașinii virtuale.+student@uso-demo:~$ sudo lsblk 
 +NAME   ​MAJ:​MIN RM  SIZE RO TYPE MOUNTPOINT 
 +sda      8:0    0    8G  0 disk  
 +├─sda1 ​  ​8:​1 ​   0  7.6G  0 part / 
 +├─sda2 ​  ​8:​2 ​   0    1K  0 part  
 +└─sda5 ​  ​8:​5 ​   0  383M  0 part [SWAP] 
 +sr0     ​11:​0 ​   1 1024M  0 rom  ​
  
-Mașina virtuală deține două interfețe de rețea+student@uso-demo:~$ sudo lsblk -f 
-  * ''​eth0''​ pentru accesul la Internet (interfață de tipul NAT) +NAME   ​FSTYPE LABEL UUID                                 ​MOUNTPOINT 
-  * ''​eth1''​ pentru comunicarea cu sistemul fizic (gazdă, //host//) (interfață de tipul //Host-only Adapter//)+sda                                                       
 +├─sda1 ext4         ​4c03932f-ebdc-4d7d-bf4e-aa65f3889d73 ​/ 
 +├─sda2 ​                                                   
 +└─sda5 swap         ​709a57ff-ffc5-4cf2-bfd7-2850a842e41f [SWAP] 
 +sr0                                                      ​
  
-Pentru a rula demo-ul avem două opțiuni+student@uso-demo:~$ sudo hwinfo ​--block --short 
-  ​- Folosim direct consola mașinii virtuale. +disk                                                          ​ 
-  ​- Aflăm adresa IP de pe interfața ''​eth1''​ a mașinii virtuale și ne conectăm prin SSH, de pe sistemul fizic, folosind comanda<​code>​ +  ​/​dev/​sda ​            VBOX HARDDISK 
-ssh student@<​adresa-IP-vm-eth1>​ +partition: 
-</code> unde ''<​adresa-IP-vm-eth1>''​ este adresa IP a interfeței ''​eth1''​ din cadrul mașinii virtuale. +  ​/​dev/​sda1 ​           Partition 
- +  /​dev/​sda2 ​           Partition 
-Pentru conectarea la mașina virtuală folosim numele de utilizator ''​student''​ cu parola ''​student''​. Contul ''​student''​ are permsiuni de ''​sudo''​. Folosind comanda<​code>​ +  /dev/​sda5 ​           Partition 
-sudo su -+cdrom: 
 +  /​dev/​sr0 ​            VBOX CD-ROM
 </​code>​ </​code>​
-obținem permisiuni privilegiate (de ''​root''​) în shell. 
  
-<​note>​ +Comenzile de mai sus ne afișează partițiile sistemului, cu diverse informații precum numele lor, spațiul ocupat, tipul de sistem de fișiere cu care este formatată partiția.
-Dacă dorim să ne conectăm pe SSH iar mașina virtuală nu are adresă IP configurată pe interfața ''​eth1''​ atunci folosim comanda<​code>​ +
-sudo dhclient eth1 +
-</​code>​ +
-pentru a obține o adresă IP. +
-</​note>​+
  
-<​note>​ +Dacă dorim să afișăm informații despre utilizarea spațiului despre partițiile sistemului putem face acest lucru doar pentru partițiile montate ​folosim ​comanda ''​df''​:<​code>​ 
-Dacă optăm pentru rularea prin SSH iar sistemul fizic rulează Windows, putem folosi [[http://​www.chiark.greenend.org.uk/​~sgtatham/​putty/​|Putty]] pe post de client SSH pe sistemul fizic. +student@uso-demo:​~$ ​df -hT 
-</​note>​ +Filesystem ​    ​Type ​     Size  Used Avail Use% Mounted on 
- +/dev/sda1      ext4      7.4G  1.6G  5.5G  23% / 
-<​note>​ +udev           ​devtmpfs ​  ​10M ​    ​0 ​  ​10M ​  ​0% ​/dev 
-Comenzile folosite sunt de uz general. Actualizând adresele IP cu adrese potrivite, putem rula cu succes comenzile pe orice sistem sau mașină virtuală Linux. +tmpfs          tmpfs     ​101M ​ 4.4M   ​96M ​  5% /run 
-</​note>​ +tmpfs          tmpfs     ​251M ​    ​0 ​ 251M   ​0% ​/dev/shm 
- +tmpfs          tmpfs     5.0M     ​0 ​ 5.0M   ​0% ​/run/lock 
-==== Obținere arhivă ==== +tmpfs          tmpfs     ​251M ​    ​0 ​ 251M   ​0% ​/sys/​fs/​cgroup
- +
-Pentru parcurgerea demo-urilor, ​folosim ​[[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-demo.zip|arhiva aferentă]]. Descărcăm arhiva în mașina virtuală (sau în orice alt mediu Linux) folosind comanda<​code ​bash+
-student@uso-demo:​~$ ​wget http://elf.cs.pub.ro/uso/res/​cursuri/​curs-10/​curs-10-demo.zip +
-[...] +
-</code> și apoi dezarhivăm arhiva<​code bash> +
-student@uso-demo:​~$ unzip curs-10-demo.zip  +
-[...] +
-</code> și accesăm directorul rezultat în urma dezarhivării<​code bash> +
-student@uso-demo:​~$ cd curs-10-demo+
-student@uso-demo:​~/curs-10-demo$ ls +
-user-results.csv+
 </​code>​ </​code>​
  
-Acum putem parcurge secțiunile cu demo-uri de mai jos. Vom folosi resursele din directorul rezultat în urma dezarhivării. +O afișare ceva mai estetică obținem cu ajutorul comenzii ​''​pydf''​. Pentru aceasta ​instalăm în prealabil pachetul ​''​pydf''​:<​code>​ 
- +student@uso-demo:​~$ ​sudo apt-get install pydf
-==== Splitting folosind cut ==== +
- +
-Pentru splitting simplu de date tabelare putem folosi utilitarul ''​cut''​. Acesta permite precizarea unui delimitator ​și a unui câmp sau a mai multor câmpuri (coloane) care să fie selectate din tabel. +
- +
-Din fișierul ​''​user-results.csv'' ​(format CSV -- //Comma Separated Values//) dorim să selectăm doar numele grupurilor. Pentru aceasta ​selectăm doar a doua coloană și folosim separatorul ​''​,'' ​(virgulă) folosind comanda<​code>​ +
-student@uso-demo:​~/​curs-11-democut -d ','​ -f 2 < user-results.csv +
-Liceul Teoretic Ștefan Odobleja +
-Colegiul Național Ion Maiorescu +
-Colegiul Tehnic Toma Socolescu +
-Colegiul Național Nichita Stănescu +
-Liceul Teoretic Benjamin Franklin +
-Colegiul Național I.L. Caragiale +
-Colegiul Național Zinca Golescu+
 [...] [...]
-</​code>​ 
  
-Dacă dorim să "​unicizăm"​ rezultatele și să afișăm doar numele liceelor putem conecta comanda de mai sus la o comandă ''​sort'':<​code>​ +student@uso-demo:​~$ ​pydf 
-student@uso-demo:​~/​curs-11-democut -d ','​ -f 2 < user-results.csv | sort -u +Filesystem ​ Size  Used Avail Use%                                                    Mounted on 
- +/​dev/​sda1 ​ 7555M 1589M 5560M 21.0 [##########​......................................] 
-Colegiul Economic Virgil Madgearu +
-Colegiul Național Alexandru Odobescu +
-Colegiul Național Barbu Știrbei +
-Colegiul Național Cantemir Vodă +
-Colegiul Național Carol I +
-Colegiul Național Gheorghe Lazăr +
-[...]+
 </​code>​ </​code>​
-În urma rulării comenzii de mai sus ne sunt afișate doar numele liceelor. 
  
-Dacă ne interesează să afișăm **doar** identificatorii utilizatorilor ​și punctajele obținuteatunci folosim comanda<​code>​ +Comenzile ''​df''​ sau ''​pydf'' ​ne afișează dimensiunea totală a unei partiții spațiul ocupat ​și spațiul disponibilîmpreună cu un procent de utilizare a spațiului.
-student@uso-demo:​~/​curs-11-demo$ cut -d ','​ -f 1,4 < user-results.csv | head +
-ionut.asimionesei,​0 +
-laura.matei,​66 +
-alin.dascalu,​285 +
-dragos.konnerth,​42 +
-alexandru.corneanu,​247 +
-alexandru.tittes,​154 +
-[...+
-</​code>​+
  
 <​note>​ <​note>​
-Utilitarul ''​cut'' ​are două opțiuni frecvent folosite: +Detalii despre comnezile de afișare de informații despre hard discuri găsiți și la link-ul indicat ca resursă utilă în partea ​de sus a paginii: http://www.binarytides.com/linux-command-check-disk-partitions/
-  * opțiunea ''​-d''​ care precizează delimitatorul ​de câmpuri (//field delimiter// sau //field separator//​) +
-  * opțiunea ''​-f''​ care precizează ce câmpuri/coloane dorim să extragem+
 </​note>​ </​note>​
 +==== Generarea de fișiere folosind comanda dd ====
  
-==== Splitting ​și prelucrare folosind while read ====+Pentru situații de testare putem avea nevoie de fișiere de diferite dimensiuni. Pentru a genera astfel de fișiere putem folosi comanda ''​dd''​ și intrările speciale ''/​dev/​urandom'' ​și ''/​dev/​zero''​.
  
-Utilitarul ''​cut''​ are dezavantajul că face doar splitting și extrage câmpuri/​coloane. Nu putem condiționa extragerea unor câmpuri. ​De exemplu, dacă dorim extragerea conturilor care au punctaj mai mare ca 500, nu vom putea folosi ''​cut''​. Putem însă folosi construcția ​''​while read'' ​într-un script shell.+De exemplu, dacă dorim să generăm un fișier de ''​10MB'' ​plin cu zero-uri, vom folosi comanda<​code>​ 
 +student@uso-demo:​~$ dd if=/​dev/​zero of=zero-1OMB bs=1M count=10 
 +10+0 records in 
 +10+0 records out 
 +10485760 bytes (10 MB) copied, 0.0233232 s, 450 MB/s
  
-Pentru a extrage conturile care au punctaj mai mare ca 500, vom folosi scriptul ''​extract-points-500''​ de mai jos: +student@uso-demo:~$ ls -lh zero-1OMB  
-<file Bash extract-points-500> +-rw-r--r-- 1 student student 10M Dec  5 18:09 zero-1OMB
-#​!/​bin/​bash +
- +
-IFS=','​ +
-while read uid school date points; do +
-    if test "​$points" ​-ge 500; then +
-        echo "​$uid"​ +
-    fi +
-done < user-results.csv +
-</​file>​ +
-Rulăm scriptul folosind comanda<​code>​ +
-student@uso-demo:~/curs-11-demo$ ./extract-points-500  +
-mihaela.croitoru +
-andreea.cismas +
-elvis.titirca +
-mihaela.serbana +
-anjie.teodorescu +
-[...]+
 </​code>​ </​code>​
-În scriptul ​''​extract-points-500'' ​am folosit construcția ​''​while read'' ​pentru a face split la cele patru coloane din fișierul ''​user-results.csv''​. ​Separatorul (delimitatorul) l-am definit cu ajutorul variabilei ​''​IFS'' ​(//Input Field Separator//​) pe care am inițializat-o la ''​,''​ (virgulă). După split am folosit construcția ​''​if''​ pentru a afișa doar conturile utilizatorilor cu punctaj peste ''​500''​.+Comanda ​''​dd'' ​citește din intrarea specială ​''​/dev/zero'' ​zero-uri și le scrie în fișierul ''​zero-1OMB''​. ​Face acest lucru în ''​10'' ​copieri de blocuri de câte ''​1M''​ (''​bs'' ​înseamnă //block size//).
  
-Dacă dorim să afișăm și punctajul obținut (nu doar contul) atunci trebuie doar să modificăm linia de afișare (care folosește comanda ​''​echo''​). Rezultatul va fi scriptul actualizat și cu rularea de mai jos:<​code>​ +Dacă dorim să generăm un fișier de ''​5MB'' ​plin cu date aleatoare, vom folosi comanda<​code>​ 
-student@uso-demo:​~/​curs-11-demo$ cat extract-points-500 ​ +student@uso-demo:​~$ dd if=/dev/urandom of=random-5MB bs=1M count=5 
-#!/bin/bash+5+0 records in 
 +5+0 records out 
 +5242880 bytes (5.2 MB) copied, 0.56655 s, 9.3 MB/s
  
-IFS=','​ +student@uso-demo:​~$ ls -lh random-5MB  
-while read uid school date points; do +-rw-r--r-- 1 student student 5.0M Dec  5 18:11 random-5MB
-    if test "​$points"​ -ge 500; then +
-        echo "​$uid,​$points"​ +
-    fi +
-done < user-results.csv +
- +
-student@uso-demo:​~/curs-11-demo$ ./extract-points-500 +
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-elvis.titirca,​501 +
-mihaela.serbana,​526 +
-anjie.teodorescu,​666 +
-georgiana.ciobanica,​1047 +
-[...]+
 </​code>​ </​code>​
 +Comanda ''​dd''​ citește din intrarea specială ''/​dev/​urandom''​ date aleatoare și le scrie în fișierul ''​random-5MB''​. Face acest lucru în ''​5''​ copieri de blocuri de câte ''​1M''​ (''​bs''​ înseamnă //block size//).
  
-Dacă în output-ul de mai sus dorim să avem sortare în ordine descrescătoare a punctajului,​ înlănțuim o comandă ​''​sort'' ​care să sorteze numericdescrescător după a doua coloană<​code>​ +Putem folosi comanda ​''​dd'' ​și pentru dispozitive fizice. De exempludacă vrem să extragem sectorul 0 de pe un hard disc (adică primii 512 octeți) folosim comanda:<​code>​ 
-student@uso-demo:​~/​curs-11-demo./extract-points-500 | sort -t ','​ -k 2,2rn +student@uso-demo:​~$ ​sudo dd if=/dev/sda of=mbr count=1 
-radu.dumitru5227,​21433 +1+0 records in 
-mihaela.catai,​13623 +1+0 records out 
-stefania.oprea,9547 +512 bytes (512 B) copied0.00355612 s144 kB/s
-alexandra.calinescu,5266 +
-george.ungureanu,​3846 +
-dragos.totu,​2040 +
-monica.cirisanu,​1815 +
-</code> +
-În comanda de mai sus, comanda ''​sort''​ sortează output-ul scriptului folosind ca separator virgulă (construcția ''​%%-t ','​%%''​ după a două coloană (construcția ''​-k 2,​2''​) descrescător numeric (construcția ''​rn''​).+
  
-<​note>​ +student@uso-demo:​~$ ls -lh mbr  
-Construcția ''​while read''​ este folosită pentru a putea face prelucrări pe fiecare linie procesată, nu doar splitting, așa cum face comanda ''​cut''​. +-rw-r--r-- 1 root root 512 Dec  5 18:13 mbr
-</​note>​ +
- +
-==== Splitting și prelucrare folosind awk ==== +
- +
-Construcția ''​while read''​ este utilă pentru realizarea de splitting și de prelucări minimale. Prelucrările pe care le poate face țin de facilitățile pe care le oferă shell-ul. +
- +
-Pentru prelucrări mai avansate recomandăm folosirea utilitarului ''​awk''​. Utilitarul ''​awk''​ are în spate un limbaj propriu, asemănător limbajului C, și are suport de expresii regulate. Este un utilitar puternic util pentru prelucrarea datelor în format text. +
- +
-Pentru a obține același efect cu al scriptului ''​extract-points-500''​ putem folosi oneliner-ul de mai jos:<​code>​ +
-student@uso-demo:​~/curs-11-demo$ awk -F ','​ '{ if ($4 >= 500) print $1;}' < user-results.csv  +
-mihaela.croitoru +
-andreea.cismas +
-elvis.titirca +
-mihaela.serbana +
-anjie.teodorescu +
-georgiana.ciobanica +
-[...]+
 </​code>​ </​code>​
 +Comanda ''​dd''​ citește din intrarea specială ''/​dev/​sda''​ date și le scrie în fișierul ''​random-5MB''​. Face acest lucru într-o singură copiere de bloc de date; dimensiunea blocului este în mod implicit ''​512''​ așa că se vor copia exact ''​512''​ octeți. A fost nevoie de permisiuni de ''​root''​ (prefixarea comenzii folosind ''​sudo''​) pentru că doar cu permisiuni dedicate putem citi de pe dispozitivile ce identifică discul sistemului.
  
-Pentru a afișa și punctajul folosim one liner-ul:<​code>​ +Putem valida că am extras sectorul 0 al hard discului folosind comanda ''​xxd''​ (care face //dump// în hexadecimal). Întrucât sectorul 0 este sectorul de boot acesta se va încheia cu semnătura de sector de boot, adică ''​0x55aa'',​ lucru observabil în output-ul comenzii ''​xxd''​:<​code>​ 
-student@uso-demo:​~/​curs-11-demoawk -F ','​ '{ if ($4 >= 500) print $1 ","​ $4;}' < user-results.csv  +student@uso-demo:​~$ ​xxd mbr
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-elvis.titirca,​501 +
-mihaela.serbana,​526 +
-anjie.teodorescu,​666 +
-georgiana.ciobanica,​104+
 [...] [...]
 +00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.
 </​code>​ </​code>​
  
-Observăm că pentru ​''​awk'' ​separatorul este dat de opțiunea ''​-F'',​ iar sintaxa este similară cu cea a limbajului C. Un câmp/​coloană este indicat ​de construcția ''​$N''​ unde ''​N''​ este indexul câmpului; în cazul nostru am folosit ''​$1'' ​și ''​$4''​ pentru cont și punctaj, respectiv. +Tot folosind comanda ​''​dd'' ​un sistem ce posedă unitate ​de CD și are un CD în unitate poate crea o imagine ​de tip ''​.iso'' ​a CD-ului. Pentru aceasta folosim comanda<​code>​ 
- +dd if=/dev/cdrom of=myimage.iso
-După cum am precizat, ''​awk'' ​are suport de expresii regulate. Dacă, de exemplu, din output-ul de mai sus dorim să extragem doar liniile care au un nume de cont al cărui nume de familie începe cu litera ​''​c''​, vom folosi construcția:​<​code>​ +
-student@uso-demo:​~/curs-11-demo$ awk -F ','​ '$1 ~ /[^\.]+\.c/ { if ($4 >500) print $1 ","​ $4;}' < user-results.csv  +
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-georgiana.ciobanica,​1047 +
-ion.camasa,​502 +
-mihaela.catai,​13623 +
-alexandra.cismaru,​860 +
-[...]+
 </​code>​ </​code>​
-În one liner-ul de mai sus, am selectat doar acele linii pentru care primul câmp (''​$1''​) face match pe expresia regulată ''​%%[^\.]+\.c%%'' ​(adică numele ​de familie începe cu litera ''​c''​).+Cu această comandă creăm fișierul ​''​myimage.iso'' ​ca fișier imagine al CD-ului aflat în unitatea ​de CD.
  
-<​note>​ +<​note ​warning
-În awk, sed și alte utilitare similare expresiile regulate ​se plasează între slash-uri; mai sus a fost vorba de ''​%%/[^\.]+\.c/%%''​.+Atenție la folosirea comenzii ''​dd'' ​și care este fișierul destinație (în care se scrie). Există riscul să vă corupeți (potențial iremediabil) hard discul dacă folosiți ​''/​dev/sda'' ​pe post de fișier destinație.
 </​note>​ </​note>​
 +==== Crearea unei mașini virtuale în VirtualBox ====
  
-Același rezultat ​ca mai sus putea fi realizat ​și cu ajutorul comenzii ''​grep''​ legată de la comanda ''​awk'',​ ca mai jos:<​code>​ +Pentru crarea unei mașini virtuale în VirtualBox folosim, de regulă, interfața grafică a VirtualBox. Pentru aceasta urmăm ​ca pași principali
-student@uso-demo:~/​curs-11-demo$ awk -F ',' '{ if ($4 >= 500) print $1 "," $4;}' < user-results.csv | grep '​^[^\.]\+\.c'​ +  * Crearea specificațiilor mașinii virtualememoriehard disctip de sisteme de operare 
-mihaela.croitoru,516 +  * Alegerea unui mediu de bootde obicei o imagine de CD bootabil în format ​''​.iso''​ 
-andreea.cismas,​803 +  * Pornirea mașinii virtuale (bootarea acesteia) ​și pornirea procesului de instalare
-georgiana.ciobanica,​1047 +
-ion.camasa,​502 +
-mihaela.catai,​13623 +
-alexandra.cismaru,​860 +
-[...] +
-</​code>​ +
-Rezultatul este același și poate părea mai simplu să folosim ''​grep''​. ​Doar că ''​awk''​ permite match cu expresie regulată pe un câmp specific primit la intrare; se poate forța acest lucru și cu ''​grep''​ dar devine mai puțin clar.+
  
-În momentul ​în care un script ''​awk''​ devine ​mai complicatpoate fi plasat într-un script shell, așa cum este în fișierul ''​extract-points-500-awk''​: +Acești pași sunt descriși ​în video-ul de tip screencast de mai josaccesibil direct la adresa https://youtu.be/​xFkkeVoOC_A.
-<file Bash extract-points-500-awk>​ +
-#!/bin/bash+
  
-awk -F ','​ ' +<​html>​ 
-$1 ~ /[^\.]+\.c+<​center>​ 
-    if ($4 >500) +<iframe width="​560"​ height="​315"​ src="​https:/​/www.youtube.com/embed/​xFkkeVoOC_A"​ frameborder="0" ​allowfullscreen>​ 
-        print $1 "," ​$4; +</iframe
-    } +</center
-' < user-results.csv +</html>
-</file+
-Rulăm scriptul folosind comanda<code> +
-student@uso-demo:​~/​curs-11-demo$ ./​extract-points-500-awk +
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-georgiana.ciobanica,​1047 +
-[...] +
-</code> +
-Scriptul ''​extract-points-500-awk''​ face același lucru ca one liner-ul anterior doar că este mai lizibil.+
  
-<​note>​ +==== Afișarea de informații despre ​mașinile virtuale VirtualBox ​====
-În general, dacă utilizatorul dorește să obțină un efect rapid și cu șanse mici de repetare, va folosi un one liner. Altfel, va folosi un script shell pe care îl poate actualiza șî rula în mod repetat. +
-</​note>​ +
- +
-==== Splitting ​și prelucrare folosind Python ==== +
- +
-Pentru prelucrări complexe sau pentru integrarea prelucrărilor cu alte componente ale unei aplicații, inclusiv ''​awk''​ poate fi insuficient. În acest caz programatorul va apela la un limbaj specific precum Python, Perl, Ruby, Lua, Java, JavaScript sau altul. +
- +
-În fișierul ''​extract-points-500.py'' ​de mai jos avem implementarea în Python a aceleiași funcționalități ca mai sus pentru ''​awk''​ +
-<file Python extract-points-500.py>​ +
-#​!/​usr/​bin/​env python +
- +
-import sys +
-import re +
- +
- +
-def main(): +
-    for line in open("​user-results.csv",​ "​rt"​):​ +
-        line = line.rstrip("​\n"​) +
-        uid, school, date, points = line.split(","​) +
-        if re.match("​[^\.]+\.c",​ uid): +
-            if int(points) >= 500: +
-                print "​%s,​%s"​ % (uid,​points) +
- +
- +
-if __name__ == "​__main__":​ +
-    sys.exit(main()) +
-</​file>​ +
-În cadrul scriptului citim linie cu linie conținutul fișierului ''​user-results.csv''​ și apoi este splitted și se extrag liniile pentru care numele contului are un nume de familie care începe cu litere ''​c''​ și punctajul este mai mare ca ''​500''​. +
- +
-Rularea scriptului Python conduce la același rezultat ca în cazul folosirii ''​awk'':<​code>​ +
-student@uso-demo:​~/​curs-11-demo$ ./​extract-points-500.py  +
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-georgiana.ciobanica,​1047 +
-ion.camasa,​502 +
-mihaela.catai,​13623 +
-alexandra.cismaru,​860 +
-[...] +
-</​code>​ +
- +
-Python oferă o flexibilitate superioară ''​awk''​ cu dezavantajul unei complexități mai mari a codului. Pentru acțiuni rapide, integrabile cu shell scripting, ''​awk''​ este o bună alegere (sau ''​while read''​);​ pentru acțiuni mai complexe, un limbaj de programare dedicat, precum Python poate fi o soluție. +
- +
-De exemplu, putem augmenta scriptul anterior pentru a afișa doar informații despre ​acele conturi care s-au autentificat prima oară în luna aprilie. Adică al treilea câmp este din luna aprilie. Pentru aceasta folosim scriptul ''​extract-points-500-date.py''​ din director: +
-<file Python extract-points-500-date.py>​ +
-#​!/​usr/​bin/​env python +
- +
-import sys +
-import re +
-from datetime import datetime +
- +
- +
-def main(): +
-    for line in open("​user-results.csv",​ "​rt"​):​ +
-        line line.rstrip("​\n"​) +
-        uid, school, date, points ​line.split(","​) +
-        date_compare ​datetime.strptime("​2015-04-01 00:​00:​00",​ "​%Y-%m-%d %H:​%M:​%S"​) +
-        try: +
-            date_in_format ​datetime.strptime(date,​ "​%Y-%m-%d %H:​%M:​%S"​) +
-        except: +
-            continue +
-        if re.match("​[^\.]+\.c",​ uid): +
-            if int(points) >= 500: +
-                if date_in_format > date_compare:​ +
-                    print "​%s,​%s,​%s"​ % (uid,​date,​points) +
- +
- +
-if __name__ == "​__main__":​ +
-    sys.exit(main()) +
-</​file>​ +
-În scriptul de mai sus am comparat data (al treilea câmp) cu data de 1 aprilie 2015 și am afișat acele câmpuri pentru care câmpul dată era mai târziu de 1 aprilie 2015. Acest lucru ar fi putut fi realizat în ''​awk''​ dar ar fi complicat scriptul. +
- +
-Pentru rularea scriptului, folosim construcția<​code>​ +
-student@uso-demo:​~/​curs-11-demo$ ./​extract-points-500-date.py  +
-mihaela.catai,​2015-04-16 12:​29:​26,​13623 +
-andra.cristiev,​2015-04-22 13:​08:​57,​865 +
-</​code>​+
  
 <​note>​ <​note>​
-Decizia de folosire ''​cut''​ sau ''​while read''​ sau ''​awk''​ sau Python ține atât de datele și complexitatea problemei cât și de experiența utilizatorului/​dezvoltatorului. În general, recomandăm "use the best tool for the best job"; dacă un utilitar simplu poate face ce aveți nevoie, folosiți-l ​pe acela, chiar dacă un utilitar mai complex are mai multe caracteristici;​ dacă acele caracteristici nu sunt utile, nu are sens să-l folosiți.+Comenzile indicate mai jos pot fi rulate doar pe un sistem fizic (Linux sau Windows) în cadrul căruia a fost instalat VirtualBox.
 </​note>​ </​note>​
  
-==== Folosire expresii regulate ​în sed ====+În afara interfeței grafice ​în VirtualBox putem folosi comanda ''​vboxmanage''​ pentru a afișa informații și pentru a configura mașini virtuale VirtualBox.
  
-Mai sus am folosit cu ''​awk''​''​grep'' ​și Python expresii regulate. Adesea, în linia de comandă veți folosi expresii regulate folosind comanda ''​grep''​. Dar șîn alte situațiifie în linie de comandă, fie în scripting, fie în limbaje de programare, expresiile regulate sunt utile. +De exemplupentru a afișa mașinile virtuale existente ​în VirtualBoxrulăm comanda<​code>​ 
- +razvan@einherjar:~$ vboxmanage list vms 
-În particular, utilitarul ''​sed''​ folosește expresii regulate. Unul dintre cazurile frecvente de utilizare a ''​sed''​ este pe post de editor neinteractiv,​ care să înlocuiască (substituie) elemente de pe o linie cu alte elemente. +"​Windows-7" {2a9b2719-2c6c-42df-9f19-5febff6172bf} 
- +"​Debian"​ {18565cc7-101d-4ac4-91b4-2ee317b7f9ae} 
-Dacă dorim, de exemplu, să înlocuim toate prenumele din numele de cont nu șirul ''​aaa''​ vom folosi un one liner precum cel de mai jos:<​code>​ +"​Debian 32 bit" {562696b3-efb8-42e4-8a66-519a98aa5ac8} 
-student@uso-demo:~/curs-11-demo$ sed '​s/​^[^\.]\+/​aaa/​g'​ < user-results.csv +"​Xubuntu-14.04" {cd57aa75-82b0-4f07-8236-81517f2ee87d} 
-aaa.asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:18:01,0 +"SSS - Debian 32bit" {fa9dd108-fe13-4d12-adcd-84e29bcc3232} 
-aaa.matei,​Colegiul Național Ion Maiorescu,​2015-03-17 11:04:49,66 +"​SSS ​Windows 7 32bit" {4f27ec11-33a8-400d-a898-d252169ab52f} 
-aaa.dascalu,​Colegiul Tehnic Toma Socolescu,​None,​285 +"​Training - Linux Kernel Dev" {3645e7b4-482e-4bd2-aa73-f29e8b15288f} 
-aaa.konnerth,​Colegiul Național Nichita Stănescu,​None,​42 +"GSR Debian"​ {409a6ad1-3998-443b-9297-e46aa1d944e5} 
-aaa.corneanu,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:​26:​21,​247 +"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} 
-[...]+"IOCLA Linux" {5ee0048a-6bd1-4dc6-bf1b-daffc1729066} 
 +"USO Linux" {845446cb-0210-4f3b-8df0-91cd1c67b5e2}
 </​code>​ </​code>​
-La fel ca în cazul ''​awk''​ expresia regulată se plasează între slash-uri. Expresia regulată folosită ''​%%^[^\.]\+%%''​ face match pe începutul de linie și pe șiruri de cel puțin o literă care nu conțin punct (''​.'', ​//dot//). Adică exact pe prenumele din numele de cont.+Comanda afișează mașinile virtuale existente ​în sistemul gazdă împreună cu un identificator unic al acestora (numit UUID -- //Universally Unique Identifier//).
  
-Dacă dorim să eliminăm prenumele (împreună cu punctul) din numele de cont vom folosi o construcție precum<​code>​ +Dacă vrem să afisăm doar mașinile virtuale care rulează, folosim comanda<​code>​ 
-student@uso-demo:~/​curs-11-demosed '​s/​^[^\.]\+\.//​g'​ < user-results.csv +razvan@einherjar:!vboxmanage list runningvms 
-asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 +"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} 
-matei,​Colegiul Național Ion Maiorescu,​2015-03-17 11:​04:​49,​66 +<​code>​
-dascalu,​Colegiul Tehnic Toma Socolescu,​None,​285 +
-konnerth,​Colegiul Național Nichita Stănescu,​None,​42 +
-corneanu,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:​26:​21,​247 +
-[...] +
-</code> +
-În one liner-ul de mai sus am lăsat ca șir care substituie șirul vid (adică două slash-uri consecutive). Adică înlocuim partea pe care face match expresia regulată (adică prenumele din cont și caracterul punct) cu nimic, adică o ștergem.+
  
-O situație poate fi să fie înlocuită construcția ''​prenume.nume''​ cu ''​nume.prenume''​ în numele contului. Pentru aceasta folosim construcția<​code>​ +Dacă ne interesează ​să aflăm informații detaliate despre o mașină virtuală rulăm comanda<​code>​ 
-student@uso-demo:~/​curs-11-demosed 's/^\([^\.]\+\)\.\([^\,​]\+\),/​\2.\1,/​g'​ < user-results.csv +razvan@einherjar:~$ vboxmanage showvminfo "USO Demo"​ 
-asimionesei.ionut,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 +Name:            USO Demo 
-matei.laura,​Colegiul Național Ion Maiorescu,​2015-03-17 11:04:49,66 +Groups: ​         ​/ 
-dascalu.alin,​Colegiul Tehnic Toma Socolescu,​None,​285 +Guest OS:        Debian ​(32-bit) 
-konnerth.dragos,​Colegiul Național Nichita Stănescu,​None,​42 +UUID:            e04f00a6-7530-45d0-95e6-56ba46d6810a 
-corneanu.alexandru,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:26:21,247+Config file:     /​home/​razvan/​vm/​vbox/​USO Demo/USO Demo.vbox 
 +Snapshot folder: /​home/​razvan/​vm/​vbox/​USO Demo/​Snapshots 
 +Log folder: ​     /​home/​razvan/​vm/​vbox/​USO Demo/Logs 
 +Hardware UUID:   ​e04f00a6-7530-45d0-95e6-56ba46d6810a 
 +Memory size    512MB
 [...] [...]
 </​code>​ </​code>​
-Expresia regulată folosită mai sus (''​%%^\([^\.]\+\)\.\([^\,​]\+\),​%%''​) ​decodificăm în următoarele componente:​ +Comanda afișează o multitudine ​de informații despre mașina virtuală, practic tot ceea ce definește.
-  * ''​%%^%%'':​ început ​de linie +
-  * ''​%%\([^\.]\+\)%%'':​ face match pe prenume, adică șirul format din cel puțin un caracter diferit de punct; reține acest șir într-o variabilă (variabila este referită prin construcția ''​%%\1%%''​) +
-  * ''​%%\.%%'':​ face match pe caracterul punct (''​.''​//dot//) care separă prenumele de nume în cont +
-  * ''​%%\([^\,​]\+\)%%'':​ face match pe nume, adică șirul format din cel puțin un caracter diferit de virgulă; reține acest șir într-variabilă (variabila este referită prin construcția ''​%%\2%%''​) +
-  * ''​%%,​%%'':​ face match pe caracterul virgulă ('','',​ //comma//) care urmează după cont +
- +
-Partea de înlocuit este ''​\2.\1,''​ adică numele de cont este înlocuit cu nume, urmat de punct, urmat de prenume, urmat de virgulă, așa cum ne-am dorit.+
  
 <​note>​ <​note>​
-La fel ca în cazul ''​awk''​, ''​sed''​ este un utilitar adecvat pentru one linere, acțiuni rapide ​și încorporare în shell scriptingPentru scenarii de utilizare mai complexerecomandăm folosirea unor limbaje dedicate precum Python, Perl, Ruby, Java, JavaScript.+Comanda ​''​vboxmanage'' ​are o mulțime de subcomenzi care pot fi folosite pentru inspectarea ​și configurarea mașinilor virtualePuteți folosi comanda<​code>​ 
 +vboxmanage --help 
 +</​code>​ 
 +pentru a le parcurge pe toatesau puteți consulta pagina de manual a comenzii<​code>​ 
 +man vboxmanage 
 +</​code>​ sau puteți accesa [[https://​www.virtualbox.org/​manual/​ch08.html|documentația VirtualBox]].
 </​note>​ </​note>​
-==== Automatizare folosind shell scripting ==== 
- 
-Folosirea shell scripting și a one line-erelor are, de principiu, 3 scenarii de utilizare: 
-  * conectarea/​înlănțuirea mai multor comenzi pentru a obține un rezultat nou pentru un caz punctual de utilizare 
-  * automatizarea unei acțiuni: acțiunile pot fi repetitive și atunci o implmentare poate fi rulată de mai multe ori 
-  * prelucrarea datelor: folosind comenzi și construcții de tip filtre de text (''​cut'',​ ''​while read'',​ ''​tr'',​ ''​grep'',​ ''​sort'',​ ''​awk'',​ ''​sed''​) se prelucrează date în format text 
- 
-Partea de automatizare este utilă atunci când vrem să executăm o acțiune în mod repetat. Un caz de utilizare este când vrem să prelucrăm în același mod mai multe fișiere. 
- 
-De exemplu, având în vedere conținutul subdirectorului ''​horde/'',​ vrem să creăm copii de lucru ale fișierelor de configurare de distribuție. Fișierele de distribuție au extensia ''​.dist''​ (de exemplu ''​conf.php.dist''​);​ o copie de lucru este un fișier fără extensia ''​.dist''​ (de exemplu: ''​conf.php''​). 
- 
-Pentru a crea copie de lucru putem folosi următorul one liner, construit pas cu pas:<​code>​ 
-student@uso-demo:​~/​curs-11-demo$ find horde/ -name '​*.dist'​ 
-horde/​ingo/​config/​hooks.php.dist 
-horde/​ingo/​config/​prefs.php.dist 
-[...] 
- 
-student@uso-demo:​~/​curs-11-demo$ for f in $(find horde/ -name '​*.dist'​);​ do echo "​$f";​ done 
-horde/​ingo/​config/​hooks.php.dist 
-horde/​ingo/​config/​prefs.php.dist 
-[...] 
- 
-student@uso-demo:​~/​curs-11-demo$ for f in $(find horde/ -name '​*.dist'​);​ do echo "​${f/​.dist/​}";​ done 
-horde/​ingo/​config/​hooks.php 
-horde/​ingo/​config/​prefs.php 
-[...] 
- 
-student@uso-demo:​~/​curs-11-demo$ for f in $(find horde/ -name '​*.dist'​);​ do cp "​$f"​ "​${f/​.dist/​}";​ done 
-</​code>​ 
-În ultima comandă avem one liner-ul care creează câte o copie a fișierului de distribuție într-un fișier de lucru. Construcția ''​${f/​.dist/​}''​ este folosită pentru a înlocui în valoarea variabilei ''​f''​ șirul ''​.dist''​ cu nimic, adică șterge acel șir, rezultând numele fișierului fără extensia ''​.dist''​. 
- 
-Pentru verificare folosim comanda ''​find''​ pentru a valida existența fișierelor de lucru:<​code>​ 
-student@uso-demo:​~/​curs-11-demo$ find horde/ -name '​*.php'​ 
-horde/​ingo/​config/​prefs.php 
-horde/​ingo/​config/​backends.php 
-[...] 
-</​code>​ 
- 
-One liner-ul de mai sus este util o singură dată, pentru acele fișiere și de acceea nu are sens să îl trecem într-un script pe care să îl rulăm periodic, la nevoia, ca automatizare. 
- 
-Un exemplu de script folosit pentru automatizare este scriptul ''​publish-slides''​ folosit pentru publicarea slide-urilor de cursuri de USO. Nu veți putea rula scriptul în absența fișierelor de suport, dar este reprezentantiv pentru ceea ce înseamnă automatizarea unei sarcini repetitive: publicarea slide-urilor cursului de USO intern în cadrul echipei (în Dropbox) și studenților. 
-<file Bash publish-slides>​ 
-#!/bin/bash 
- 
-dropbox_folder=~/​Downloads/​Dropbox/​school/​uso-shared 
-remote_end=uso@elf.cs.pub.ro:​res/​current/​cursuri 
  
-if test $# -eq 1; then +==== Sumar comenzi Linux legate de hardware ====
-    id=$(printf "​%02g"​ $1) +
-    pushd curs-$id/ > /dev/null 2>&​1 +
-    make all +
-    cp *.pdf "​$dropbox_folder"/​curs-$id/​ +
-    scp *handout*.pdf "​$remote_end"/​curs-$id/​ +
-    popd > /dev/null 2>&​1 +
-    exit 0 +
-fi+
  
-for id in $(seq -f "​%02g"​ 0 13); do +Mai jos este un sumar al comenzilor Linux folosite pentru inspectarea componentelor harware ale sistemuluiSunt indicate comenzile pe tipuri de componente.
-    pushd curs-$id/ > /dev/null 2>&​1 +
-    make all +
-    cp *.pdf "​$dropbox_folder"/​curs-$id/​ +
-    scp *handout*.pdf "​$remote_end"/​curs-$id/​ +
-    popd > /dev/null 2>&​1 +
-done +
-</​file>​+
  
-Scriptul compilează (folosind ​''​make''​) slide-urile cursului primit ca argument, sau toate slide-urile în absența argumentelor. Folosește ​''​cp'' ​pentru a copia slide-urile intern echipei, în Dropbox, și folosește ​''​scp'' ​pentru a publica slide-urile către studenți.+^  Componentă hardware ​ ^  Comenzi pentru specificații ​ ^  Comenzi pentru monitorizare ​  ^ 
 +^  Toate                   ​| ​''​sudo lshw'' ​                     ​| ​ | 
 +| :::                      | ''​sudo lshw -short'' ​                     | :::  | 
 +| :::                      | ''​sudo dmidecode'' ​                | :::  | 
 +| :::                      | ''​sudo hwinfo'' ​                | :::  | 
 +| :::                      | ''​%%sudo hwinfo ​--short%%'' ​                | :::  | 
 +| :::                      | ''​inxi'' ​                | :::  | 
 +| :::                      | ''​inxi ​-F'' ​                | :::  | 
 +^  Magistrale/​Controllere ​ | ''​sudo lscpi'' ​ | | 
 +| :::                      | ''​sudo lsusb'' ​ | ::: | 
 +^  Procesor ​               | ''​lspcu'' ​  | ''​top'' ​ | 
 +| :::                      | ''​sudo lshw -class cpu''​ | ''​htop'' ​ | 
 +| :::                      | ''​sudo dmidecode -t processor''​ | ''​mpstat'' ​ | 
 +| :::                      | ''​%%sudo hwinfo --cpu%%''​ | | 
 +| :::                      | ''​%%sudo hwinfo --cpu --short%%''​ |  ::: | 
 +| :::                      | ''​%%inxi -Cxx%%''​ |  ::: | 
 +| :::                      | ''​%%cat /​proc/​cpuinfo%%''​ |  ::: | 
 +| :::                      | ''​%%nproc%%''​ |  ::: | 
 +| :::                      | ''​%%arch%%''​ |  ::: | 
 +^  Memorie ​                | ''​sudo lshw -class memory'' ​  | ''​free -m'' ​ | 
 +| :::                      | ''​sudo dmidecode -t memory'' ​ | ''​cat /​proc/​meminfo''​ | 
 +| :::                      | ''​sudo dmidecode -t cache'' ​ | ''​top''​ | 
 +| :::                      | ''​%%sudo hwinfo --memory%%'' ​ | ''​htop''​ | 
 +| :::                      | ''​sudo inxi -m'' ​ | | 
 +^  Disc                    | ''​sudo lshw -class disk -class storage -class volume -short'' ​ | ''​df -hT'' ​ | 
 +| :::                      | ''​sudo fdisk -l'' ​ | ''​pydf'' ​ | 
 +| :::                      | ''​sudo parted -l'' ​ |  | 
 +| :::                      | ''​sudo lsblk'' ​ | :::  | 
 +| :::                      | ''​sudo lsblk -f'' ​ | :::  | 
 +| :::                      | ''​%%sudo hwinfo --block --short%%'' ​ | :::  | 
 +| :::                      | ''​inxi -DdoP'' ​ | :::  |
  
 */ */
uso/cursuri/curs-10.1543780981.txt.gz · Last modified: 2018/12/02 22:03 by razvan.deaconescu
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