Differences

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

Link to this comparison view

uso:cursuri:curs-11 [2016/12/11 11:36]
razvan.deaconescu
uso:cursuri:curs-11 [2022/12/20 01:54] (current)
sergiu.weisz
Line 1: Line 1:
-====== Curs 11 - Considerente hardware. Mașini virtuale ​=======+====== Curs 11 - Automatizarea sarcinilor ​=======
  
-  * [[http://elf.cs.pub.ro/uso/res/cursuri/​curs-11/curs-11-handout.pdf ​| Slide-uri curs]] +  * [[https://docs.google.com/presentation/d/1c9fhDF-nGlf8w7EwU5s7hb4T-QLzpiXL/edit?​usp=sharing&​ouid=108131427433094834232&​rtpof=true&​sd=true|Slide-uri curs]]
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-11/​curs-11-handout-4on1-notes.pdf | Handout 4on1 and notes space]] +
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-11/​curs-11-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://books.google.com/books?​id=_JFGzyRxQGcC | Introducere în sisteme de operare]] +    * [[https://github.com/systems-cs-pub-ro/carte-uso/releases ​Utilizarea sistemelor de operare]] 
-      * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA185 | Capitolul 7 Analiza hardware a sistemului]] +        Secțiunea 13 Automatizarea sarcinilor
-    * [[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>​ <​HTML>​
-  ​<​center>​ +<​center>​ 
-    <iframe src="http://​docs.google.com/​viewer?​url=http:​//elf.cs.pub.ro/uso/​res/​cursuri/​curs-11/curs-11-handout.pdf&embedded=true" width="​600" height="​480" ​style="border: none;"> +<iframe src="https://​docs.google.com/​presentation/d/e/2PACX-1vRkkdapnVGRS-63NUGpc4uuPSERscZiDp2_jyWIF3qvbG_j5wO9UluTeitc99AjPw/​embed?​start=false&loop=false&​delayms=3000"​ frameborder="​0" width="​480" height="​389" ​allowfullscreen="true" mozallowfullscreen="​true"​ webkitallowfullscreen="​true"></​iframe>​ 
-    ​</​iframe>​ +</​center>​
-  </​center>​+
 </​HTML>​ </​HTML>​
  
Line 58: Line 46:
 </​note>​ </​note>​
  
-==== Afișarea de informații despre placa de bază ====+==== Prelucrare note ====
  
-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).+Pentru acest scenariu, actualizați [[https://​github.com/​systems-cs-pub-ro/​uso-lab|repository-ul public ​de USO]] și navigați în subdirectorul ​''​lectures/​auto/​grades/​''​:
  
-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>​ +<​code ​bash
-student@uso-demo:~$ lspci +student@uso:​~$ ​cd uso-lab 
-00:00.0 Host bridge: Intel Corporation 440FX 82441FX PMC [Natoma] (rev 02) +student@uso:~/uso-lab$ git pull 
-00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] +student@uso:~/uso-lab$ cd lectures/​auto/​grades 
-00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) +student@uso:~/uso-lab/lectures/​auto/​grades$ ls 
-00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter +2016-2017.csv  2017-2018.csv  2018-2019.csv  2019-2020.csv  script.wiki  show_average_final ​ show_average_final_series ​ show_nums ​ stats.py 
-00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) +</code> 
-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) +Directorul conține fișiere CSV (//Comma Separated Values//) reprezentând cataloagele anonimizate de la cursul de USO din ultimii ani2016-2017, 2017-2018, 2018-2019, 2019-2020
-00:06.0 USB controller: Apple IncKeyLargo/Intrepid USB +Ne propunem să facem prelucrarea acestora. 
-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) +Pentru început, să aflăm câți studenți au participat la curs în fiecare an. Folosim utilitarul ''​wc''​:
-00:0d.0 SATA controllerIntel Corporation 82801HM/HEM (ICH8M/​ICH8M-E) SATA Controller [AHCI mode] (rev 02)+
  
-student@uso-demo:~$ lsusb +<code bash> 
-Bus 001 Device 002ID 80ee:0021 VirtualBox USB Tablet +student@uso:~/uso-lab/​lectures/​auto/​grades$ wc -l 2016-2017.csv 
-Bus 001 Device 001ID 1d6b:0001 Linux Foundation 1.1 root hub+494 2016-2017.csv 
 +student@uso:~/​uso-lab/​lectures/​auto/​gradeswc -l 2017-2018.csv 
 +538 2017-2018.csv 
 +student@uso:~/​uso-lab/​lectures/​auto/​grades$ wc -l 2018-2019.csv 
 +542 2018-2019.csv 
 +student@uso:~/​uso-lab/​lectures/​auto/​grades$ wc -l 2019-2020.csv 
 +532 2019-2020.csv
 </​code>​ </​code>​
  
-Î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țeaObservăm controllere pentru+Ne dorim o afișare mai aspectuoasă și care să elimine și linia de tip header a fișierului CSV. 
-  * placa video (''​VGA''​+Pentru aceasta construim un one-liner
-  * 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''​ +<code bash> 
-  * SATA (controller pentru hard disk)+student@uso:​~/​uso-lab/​lectures/​auto/​grades$ tail -n +2 2019-2020.csv | wc -l 
 +531 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ echo -n "​2019-2020:​ " ; tail -n +2 2019-2020.csv | wc -l 
 +2019-2020: 531 
 +</​code>​ 
 +Am folosit utilitarul ​''​tail'' ​ca să eliminăm din afișare headerul fișierului. 
 +Am folosit operatorul pipe (''​|''​) ​ca să filtrăm apoi rezultatul ​prin utilitarul ​''​wc''​.
  
-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>​ +Am putea rula o comandă precum cea de mai sus pentru toate cele patru fișiere. 
-student@uso-demo:~$ sudo apt-get install lshw+Dar ar trebui ​să modificăm ​pe rând fiecare an universitar. 
 +Vrem o variantă mai eficientă, care să permită inclusiv "​scalarea"​ la apariția unor fișiere pentru alți ani. 
 +Pentru aceasta construim un nou one-liner care să folosească ''​for'' ​pentru a parcurge fișierele CSV: 
 +<​code ​bash
 +student@uso:​~/​uso-lab/​lectures/​auto/​gradesfor i in *.csv; do echo -n "​$(basename "​$i"​ .csv): " ; tail -n +2 "​$i"​ | wc -l; done 
 +2016-2017: 493 
 +2017-2018: 537 
 +2018-2019: 541 
 +2019-2020: 531
 </​code>​ </​code>​
 +Acum, oricând avem nevoie de aceste informații,​ folosim one linerul.
  
-Printr-o simplă rulare a comenzii ​''​lshw'' ​vom afișa informații despre întreg hardware-ul sistemului<​code>​ +Desigur, nu ne oprim aici, ci vrem informații la nivelul fiecărei serii. 
-student@uso-demo:~$ sudo lshw  +Am putea realiza acest lucru tot cu un one-liner, ca mai jos, adăugând încă ​secvență ''​for'' ​care parcurge cele patru serii (''​CA'',​ ''​CB'',​ ''​CC'',​ ''​CD''​):​ 
-uso-demo                  ​ +<code bash> 
-    ​descriptionComputer +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ for year in *.csv; do for series in CA CB CC CD; do echo -n "​$(basename "​$year"​ .csv) - $series: " ; tail -n +2 "​$year"​ | grep "​$series"​ | wc -l; done; done 
-    ​width32 bits +2016-2017 - CA: 109 
-    ​capabilitiessmbios-2.5 +2016-2017 - CB: 137 
-  *-core+2016-2017 - CC: 111 
 +2016-2017 - CD: 170 
 +2017-2018 - CA: 155 
 +2017-2018 - CB: 147 
 +2017-2018 - CC: 151 
 +2017-2018 - CD: 143 
 +2018-2019 - CA: 161 
 +2018-2019 - CB: 137 
 +2018-2019 - CC: 156 
 +2018-2019 - CD: 136 
 +2019-2020 - CA: 130 
 +2019-2020 - CB: 136 
 +2019-2020 - CC: 145 
 +2019-2020 - CD: 131 
 +</​code>​ 
 + 
 +Deja one-linerul este complicat. 
 +Este momentul să tranzităm la folosirea unui script, care e mai ușor de citit, de modificat, de utilizat și de menținut. 
 +Folosim scriptul ''​show_nums'':​ 
 +<​code ​bash
 +student@uso:​~/​uso-lab/​lectures/​auto/​gradescat ./show_nums 
 +#​!/​bin/​bash 
 + 
 +if test $# -ne 1; then 
 +    ​echo "Usage$0 <​csv_file>"​ 1>&2 
 +    ​exit 1 
 +fi 
 + 
 +csv_file="​$1"​ 
 +if test ! -f "​$csv_file";​ then 
 +    echo "ErrorArgument $csv_file is not a file." 1>&2 
 +    ​exit 1 
 +fi 
 + 
 +for series in CA CB CC CD; do 
 +    echo -n "​$series
 +    tail -n +"​$csv_file"​ | grep "​$series"​ | wc -l 
 +    for group in 311 312 313 314 315; do 
 +        echo -n "​$group$series:​ " 
 +        tail -n +2 "​$csv_file"​ | grep "​$group$series"​ | wc -l 
 +    done 
 +done 
 + 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ​./show_nums 
 +Usage: ./show_nums <​csv_file>​ 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./show_nums 2016-2017.csv 
 +CA: 109 
 +311CA: 28 
 +312CA: 27 
 +313CA: 27 
 +314CA: 27 
 +315CA: 0 
 +CB: 137 
 +311CB: 27 
 +312CB: 28 
 +313CB: 28 
 +314CB: 27 
 +315CB: 27 
 +CC: 111 
 +310CC: 27 
 +312CC: 28 
 +313CC: 28 
 +314CC: 28 
 +315CC: 0 
 +CD: 170 
 +311CD: 26 
 +312CD: 27 
 +313CD: 26 
 +314CD: 27 
 +315CD: 27 
 + 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./show_nums 2017-2018.csv
 [...] [...]
 +
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./show_nums 2018-2019.csv
 +[...]
 +
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./show_nums 2019-2020.csv
 +[...]
 +
 </​code>​ </​code>​
 +Scriptul ''​show_nums''​ primește ca argument chiar numele fișierului CSV.
 +Parcurge fișierul și afișează informații la nivel de serie.
  
-Pentru ​afișa informații despre hardware în format tabelarmai ușor de urmărit, folosim opțiunea ''​-short''​ la comanda ''​lshw''​<​code>​ +Numărul de studenți este o informație relativ simplă. 
-student@uso-demo:~$ sudo lshw -short +O informație mai valoroasă, pentru evaluarea disciplinei, ​subiectelor ​șpregătirii studențiloro reprezintă notele. 
-H/W path        Device ​     Class       ​Description +Vrem să extragem media studenților. 
-=================================================== +Pentru aceasta putem folosi one-linere și construcții shell: 
-                            system ​     Computer +<​code ​bash
-/0                          bus         ​Motherboard +student@uso:​~/uso-lab/lectures/auto/grades$ tail -n +2016-2017.csv | cut -d','​ -f3 | grep -v '​^$'​ | paste -s -d'​+'​ | bc 
-/0/0                        memory ​     500MiB System memory +3657.
-/0/1                        processor ​  ​Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz +student@uso:​~/uso-lab/lectures/auto/grades$ sum=$(tail -n +2016-2017.csv | cut -d',' ​-f3 | grep -v '​^$'​ | paste -s -d'​+'​ | bc) 
-/​0/​100 ​                     bridge ​     440FX 82441FX PMC [Natoma] +student@uso:​~/uso-lab/lectures/auto/grades$ count=$(tail -n +2 2016-2017.csv | wc -l
-/0/​100/​1 ​                   bridge ​     82371SB PIIX3 ISA [Natoma/​Triton II] +student@uso:​~/uso-lab/lectures/auto/grades$ echo "​scale=2; $sum/$count"​ 
-/0/100/1.1                  storage ​    ​82371AB/​EB/​MB PIIX4 IDE +scale=2; 3657.0/493 
-/0/100/2                    ​display ​    ​VirtualBox Graphics Adapter +student@uso:​~/uso-lab/lectures/auto/grades$ echo "​scale=2; $sum/$count"​ | bc 
-/​0/​100/​3 ​       eth0        network ​    ​82540EM Gigabit Ethernet Controller +7.41
-/​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/​8 ​       eth1        network ​    ​82540EM Gigabit Ethernet Controller +
-/​0/​100/​d ​                   storage ​    ​82801HM/​HEM ​(ICH8M/ICH8M-ESATA 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>​
-Ni se afișează informații despre componentele hardware ale sistemului: placă de bază, controllerememorie RAMhard diskPutem afișa ​informații detaliate ​și despre fiecare componentă în parte, așa cum vom vedea mai jos.+Obținem că media notelor finale în anul universitar 2016-2017 este ''​7.41''​. 
 +Media este eronată: este media pentru toți studenții inclusiv cei absenți; variabila ''​count''​ nu a eliminat studenții absenți. 
 +O medie calculată corect este: 
 +<code bash> 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ count=$(tail -n +2 2016-2017.csv | cut -d ','​ -f3 | grep -v '​^$'​ | wc -l) 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ echo "​scale=2;​ $sum/​$count"​ | bc 
 +7.96 
 +</​code>​ 
 +În secvența ​de mai sus, am eliminat intrările care nu conțin valoare (notele absente)la fel cum am procedat și în calculul sumei ''​sum''​. 
 + 
 +În plusone-linerul nu este robust. 
 +Este posibil ca unele intrări să conțină șirul ''​ABS''​ sau ''​absent''​așa cum vedem că este cazul fișierului ''​2017-2018.csv'':​ 
 +<code bash> 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ tail -n +2 2017-2018.csv | cut -d','​ -f3 | grep -v '​^$'​ | paste -s -d'​+'​ 
 +9.0+9.0+9.0+8.0+8.0+8.0+10.0+9.0+6.0+7.0+9.0+4.0+10.0+10.0+9.0+8.0+9.0+9.0+6.0+6.0+10.0+9.0+9.0+10.0+9.0+10.0+5.0+10.0+8.0+10.0+10.0+10.0+7.0+10.0+10.0+8.0+9.0+8.0+9.0+10.0+9.0+6.0+10.0+10.0+8.0+10.0+7.0+7.0+8.0+10.0+8.0+7.0+9.0+8.0+9.0+10.0+10.0+10.0+9.0+7.0+6.0+10.0+10.0+6.0+9.0+8.0+8.0+10.0+10.0+7.0+10.0+9.0+8.0+10.0+10.0+8.0+10.0+10.0+9.0+8.0+9.0+7.0+6.0+8.0+9.0+10.0+6.0+6.0+8.0+7.0+7.0+8.0+9.0+9.0+6.0+9.0+8.0+9.0+10.0+6.0+10.0+10.0+8.0+10.0+8.0+10.0+9.0+10.0+10.0+10.0+8.0+10.0+10.0+10.0+8.0+9.0+6.0+10.0+5.0+10.0+10.0+10.0+10.0+5.0+9.0+8.0+8.0+7.0+9.0+7.0+8.0+9.0+7.0+7.0+9.0+6.0+7.0+6.0+7.0+7.0+9.0+8.0+10.0+7.0+8.0+10.0+10.0+10.0+9.0+5.0+10.0+10.0+9.0+10.0+10.0+8.0+10.0+6.0+7.0+10.0+10.0+6.0+8.0+10.0+10.0+absent+9.0+7.0+9.0+8.0+9.0+8.0+6.0+4.0+10.0+9.0+10.0+8.0+8.0+7.0+9.0+8.0+10.0+10.0+7.0+9.0+9.0+8.0+7.0+7.0+8.0+7.0+8.0+7.0+10.0+6.0+7.0+8.0+9.0+10.0+5.0+7.0+6.0+9.0+6.0+7.0+6.0+8.0+8.0+9.0+8.0+absent+9.0+6.0+10.0+10.0+10.0+6.0+9.0+6.0+7.0+8.0+6.0+10.0+6.0+9.0+absent+absent+10.0+7.0+8.0+absent+7.0+8.0+9.0+8.0+9.0+9.0+6.0+absent+9.0+10.0+absent+10.0+10.0+9.0+10.0+8.0+8.0+7.0+8.0+8.0+10.0+absent+8.0+10.0+6.0+7.0+8.0+10.0+10.0+10.0+8.0+9.0+9.0+absent+7.0+10.0+8.0+9.0+7.0+10.0+9.0+6.0+8.0+10.0+7.0+7.0+10.0+10.0+10.0+10.0+10.0+8.0+7.0+8.0+8.0+10.0+10.0+8.0+10.0+9.0+8.0+9.0+10.0+9.0+7.0+8.0+9.0+9.0+10.0+6.0+9.0+10.0+8.0+10.0+10.0+6.0+10.0+9.0+9.0+7.0+8.0+7.0+7.0+10.0+ABS+4.0+9.0+10.0+10.0+7.0+ABS+10.0+7.0+9.0+10.0+10.0+10.0+10.0+10.0+10.0+10.0+9.0+8.0+8.0+10.0+10.0+10.0+9.0+9.0+9.0+5.0+10.0+8.0+10.0+8.0+8.0+10.0+8.0+ABS+ABS+10.0+8.0+7.0+10.0+10.0+9.0+10.0+9.0+8.0+7.0+10.0+10.0+7.0+10.0+10.0+10.0+8.0+7.0+9.0+10.0+9.0+10.0+10.0+10.0+10.0+10.0+7.0+9.0+ABS+10.0+ABS+4.0+8.0+6.0+8.0+10.0+10.0+6.0+7.0+8.0+9.0+9.0+10.0+9.0+8.0+9.0+8.0+9.0+8.0+8.0+9.0+5.0+10.0+7.0+5.0+10.0+8.0+9.0+10.0+8.0+6.0+10.0+8.0+10.0+8.0+8.0+8.0+7.0+9.0+10.0+7.0+8.0+9.0+9.0+7.0+absent+5.0+7.0+7.0+7.0+10.0+8.0+9.0+6.0+10.0+10.0+10.0+8.0+4.0+7.0+10.0+7.0+7.0+8.0+7.0+5.0+6.0+5.0+6.0+10.0+absent+9.0+7.0+9.0+10.0+9.0+7.0+10.0+7.0+6.0+10.0+7.0+6.0+9.0+9.0+absent+7.0+10.0+7.0+10.0+7.0+7.0+8.0+7.0+8.0+6.0+absent+7.0+9.0+7.0+6.0+7.0+absent+6.0+4.0+8.0+absent+8.0+8.0+7.0+9.0+7.0+10.0+8.0+6.0+8.0+9.0+10.0+6.0+10.0+4.0+7.0+absent+10.0+10.0+9.0+4.0+8.0+9.0+absent+7.0+8.0+6.0+8.0+5.0+9.0+8.0+6.0+7.0+8.0+7.0+10.0+9.0+7.0+7.0+6.0+9.0+10.0+9.0+8.0+7.0+10.0+10.0+7.0+10.0 
 +</​code>​ 
 + 
 +Ținând cont de aceasta, creăm scriptul ''​show_average_final''​ care rezolvă problemele de mai sus, și care împrumută bunele practici ale scriptului ''​show_num''​ ca să afișeze media fiecărui an universitar:​ 
 +<code bash> 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final 2016-2017.csv 
 +7.96 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final 2017-2018.csv 
 +8.33 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final 2018-2019.csv 
 +8.77 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final 2019-2020.csv 
 +7.85 
 +</​code>​ 
 + 
 +Dacă ne dorim statistici și la nivelul seriei, actualizăm scriptul în scriptul ''​show_average_final_series'':​ 
 +<code bash> 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final_series 2019-2020.csv 
 +7.85 
 +CA: 8.17 
 +CB: 8.50 
 +CC: 7.74 
 +CD: 7.10 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final_series 2018-2019.csv 
 +8.77 
 +CA: 8.76 
 +CB: 8.39 
 +CC: 8.94 
 +CD: 8.84 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final_series 2017-2018.csv 
 +8.33 
 +CA: 8.68 
 +CB: 8.18 
 +CC: 8.57 
 +CD: 7.88 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ ./​show_average_final_series 2016-2017.csv 
 +7.96 
 +CA: 8.42 
 +CB: 7.94 
 +CC: 7.81 
 +CD: 7.86 
 +</​code>​ 
 + 
 +În momentul în care efectuăm prelucrări numerice și pe date din ce în ce mai multe și cu potențiale noi cerințe de prelucrarea,​ ne gândim să trecem la un limbaj de scripting / programare cu mai multe funcționalități de prelucrare numerică și de șiruri, care să permită o mai bună mentenanță. 
 +Un astfel de exemplu este scriptul ''​stats.py''​ în Python: 
 +<code bash> 
 +student@uso:​~/​uso-lab/​lectures/​auto/​grades$ python stats.py 
 +Grup           ​Număr ​   Notă    Quiz    Teme Midterm Practic 
 +2016-2017 ​       455    7.96    6.40    7.71    6.52    7.00 
 +CA               ​105 ​   8.42    6.94    7.65    6.75    8.01 
 +CB               ​123 ​   7.94    6.14    7.88    5.92    7.17 
 +CC               ​105 ​   7.82    6.01    7.42    7.01    6.83 
 +CD               ​122 ​   7.72    6.52    7.84    6.51    6.11 
 + 
 +2017-2018 ​       503    8.36    6.01    9.25    7.42    7.19 
 +CA               ​117 ​   8.64    6.71    9.27    7.09    7.13 
 +CB               ​134 ​   8.26    5.46    9.17    7.10    7.67 
 +CC               ​118 ​   8.74    6.86    9.33    7.87    7.57 
 +CD               ​134 ​   7.89    5.22    9.25    7.62    6.42 
 + 
 +2018-2019 ​       498    8.78    6.86    8.98    7.52    8.23 
 +CA               ​131 ​   8.82    6.97    8.93    7.52    8.76 
 +CB               ​122 ​   8.39    6.42    8.97    7.12    6.74 
 +CC               ​124 ​   9.02    7.05    9.15    7.43    8.67 
 +CD               ​121 ​   8.86    6.99    8.87    8.03    8.71 
 + 
 +2019-2020 ​       488    8.14    5.93    8.69    6.67    6.97 
 +CA               ​121 ​   8.31    6.12    8.62    6.69    7.80 
 +CB               ​125 ​   8.50    6.69    8.63    6.92    7.80 
 +CC               ​126 ​   8.07    6.26    8.61    6.80    6.06 
 +CD               ​116 ​   7.65    4.54    8.90    6.25    6.19 
 + 
 +</​code>​ 
 + 
 +În acest script facem o prelucrare ​tuturor notelor: final, examen grilă, teme, examen practic final și de midterm. 
 +Scriptul folosește funcționalități ale limbajului Python: clase, dicționare,​ funcții, parcurgerea fișierelor (CSV). 
 +Aceste lucruri îl fac ușor de actualizat ​și de meținut. 
 + 
 +Concluzionând,​ atunci când facem automatizare:​ 
 +  * folosim funcționalități existente ale shellului 
 +  * pornim cu înlănțuiri de comenzi și one linere 
 +  * pe măsură ce avansăm, trecem la scripturi shell 
 +  * când prelucrăm șiruri sau numere și avem multe date și cerințe ​în creșteretranzităm la un limbaj de scripting / programare (precum Python) 
 + 
 + 
 +/* 
 + 
 +====== Curs 10 - Securitatea sistemului ======= 
 + 
 +  * [[https://​drive.google.com/​open?​id=1R-pS_BAVlEy4mHS3Zjf9h7X13fSVlCgr|Slide-uri curs]] 
 +  * [[https://​drive.google.com/​file/​d/​1k2YOlX247w5aGUt0ptmwHTOZ6CFZEoXh/​view?​usp=sharing|Handouts 3on1 and notes space]] 
 +  * [[https://​drive.google.com/​file/​d/​1G-j69EsOEepRE1v3102gUa1OG65UgbgP/​view?​usp=sharing|Handouts 6on1]] 
 +  * **Cuvinte cheie**:  
 +  * **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&​pg=PA279 | Capitolul 10 - Elemente de securitate]] 
 + 
 +===== 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. 
 + 
 +Mașina virtuală deține două interfețe de rețea: 
 +  * ''​eth0''​ pentru accesul la Internet (interfață de tipul NAT) 
 +  * ''​eth1''​ pentru comunicarea cu sistemul fizic (gazdă, //host//) (interfață de tipul //Host-only Adapter//​) 
 + 
 +Pentru ​rula demo-ul avem două opțiuni: 
 +  - Folosim direct consola mașinii virtuale. 
 +  - Aflăm adresa IP de pe interfaț''​eth1''​ a mașinii virtuale și ne conectăm prin SSH, de pe sistemul fizic, folosind comanda<​code>​ 
 +ssh student@<​adresa-IP-vm-eth1>​ 
 +</​code>​ unde ''<​adresa-IP-vm-eth1>''​ este adresa IP a interfeței ''​eth1''​ din cadrul mașinii virtuale. 
 + 
 +Pentru conectarea la mașina virtuală folosim numele de utilizator ''​student''​ cu parola ''​student''​. Contul ''​student''​ are permsiuni de ''​sudo''​. Folosind comanda<​code>​ 
 +sudo su - 
 +</​code>​ 
 +obținem permisiuni privilegiate (de ''​root''​) în shell.
  
 <​note>​ <​note>​
-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>​ +Dacă dorim să ne conectăm pe SSH iar mașina virtuală nu are adresă IP configurată pe interfaț''​eth1'' ​atunci folosim comanda<​code>​ 
-sudo apt-get install dmidecode +sudo dhclient eth1
-sudo apt-get install inxi +
-sudo apt-get install hwinfo+
 </​code>​ </​code>​
 +pentru a obține o adresă IP.
 </​note>​ </​note>​
  
 <​note>​ <​note>​
-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/+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.
 </​note>​ </​note>​
-==== Afișarea de informații despre procesor ==== 
  
-Pentru a afișa informații despre procesorul sistemului putem folosi comanda ''​lscpu''​<code+<note
-student@uso-demo:​~$ lscpu +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. 
-Architecture: ​         i686 +</​note>​ 
-CPU op-mode(s): ​       32-bit + 
-Byte Order: ​           Little Endian +==== Folosire umask pentru configurarea permisiunilor de creare ==== 
-CPU(s): ​               1 + 
-On-line CPU(slist:   0 +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șierePentru aceasta folosim comanda ''​umask''​
-Thread(sper core:    1 + 
-Core(sper socket: ​   1 +La o rulare simplă, comanda ''​umask''​ ne afișează valoarea sa:<​code>​ 
-Socket(s):             1 +student@uso-demo:~$ umask 
-Vendor ID:             ​GenuineIntel +0022
-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>​
 +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ă)
  
-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 aceea, output-ul acestei comenzi va diferi depinzând ​de sistemul fizic pe care rulează mașina virtuală.+Pentru ''​umask = 0022'',​ ''​~umask = 7755''​Rezultă permisiunile ​de creare: 
 +  * pentru fișiere: ''​666 & 7755 = 0644''​ 
 +  * pentru directoare: ''​777 & 7755 = 0755''​
  
-Î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.+Putem verifica acest lucru creând un fișier și un director:<​code>​ 
 +student@uso-demo:~$ touch test-file 
 +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>​ 
 +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.
  
-Aceste informații pot fi afișate și cu ajutorul comenzii ​''​lshw''<​code>​ +Î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>​ 
-student@uso-demo:​~$ ​sudo lshw -class cpu +student@uso-demo:​~$ ​umask 077 
-  ​*-cpu ​                   +student@uso-demo:~$ umask 
-       ​product:​ Intel(R) Core(TM) i5-2520M CPU 2.50GHz +0077
-       ​vendor:​ Intel Corp. +
-       ​physical id: 1 +
-       bus info: cpu@0 +
-       ​version:​ 6.10.7 +
-       ​serial:​ 0002-06A7-0000-0000-0000-0000 +
-       size2500MHz +
-       width: 32 bits +
-       ​capabilities:​ fpu 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>​
 +Observăm din a doua comandă că acum valoarea ''​umask''​ este alta.
  
-Informațiile despre procesor sunt accesibile, în mod tradițional,​ în sistemul de fișiere ''/​proc'',​ prin intermediul fișierului ​''​/​proc/​cpuinfo'':<​code>​ +Creăm un nou fișier și un nou director și verificăm aplicarea noii valori a ''​umask'' ​pentru stabilirea permisiunilor de creare:<​code>​ 
-student@uso-demo:​~$ ​cat /​proc/​cpuinfo ​ +student@uso-demo:​~$ ​touch test-file-2 
-processor : 0 +student@uso-demo:~$ mkdir test-dir-2 
-vendor_id GenuineIntel +student@uso-demo:​~$ ls -l  
-cpu family 6 +total 8 
-model 42 +drwxr-xr-x 2 student student 4096 Jan  5 11:31 test-dir 
-model name Intel(RCore(TMi5-2520M CPU 2.50GHz+drwx------ 2 student student 4096 Jan  5 11:36 test-dir-2 
 +-rw-r--r-- 1 student student ​   ​Jan  5 11:31 test-file 
 +-rw------- 1 student student ​   0 Jan  5 11:36 test-file-2 
 +</​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șteptate, rezultate în urma calculului
 +  * 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>​ 
 +Valoarea ''​umask''​ este pe 4 cifre în octal. Prima cifră este aferentă biților speciali ​(''​setuid'',​ ''​setgid'',​ ''​sticky''​folosiți în permisiuni. Nu 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]]. 
 +</​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''​)
 +</​note>​ 
 +==== Folosire John the Ripper pentru password cracking ==== 
 + 
 +Din perspectiva atacatorului (sau a 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 a unui sistem putem încerca spargerea acestora. Un utilitar pentru acest lucru este [[http://​www.openwall.com/​john/​|John the Ripper]]. 
 + 
 +Pentru a folosi ''​john''​ întâi îl vom instala:<​code>​ 
 +student@uso-demo:~$ sudo apt-get install john 
 +Reading package lists... Done 
 +Building dependency tree       
 [...] [...]
 +Setting up john-data (1.8.0-2) ...
 +Setting up john (1.8.0-2) ...
 </​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>​
 +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'​s,​ sorted 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 wordlists, see 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.
 +
 +Pentru verificare, să creăm doi utilizatori (''​ana''​ și ''​bogdan''​) cu parole relativ comune ''​test123''​ și ''​qazwsx'':<​code>​
 +student@uso-demo:​~$ sudo useradd -m -d /home/ana -s /bin/bash ana
 +student@uso-demo:​~$ sudo useradd -m -d /​home/​bogdan -s /bin/bash bogdan
 +student@uso-demo:​~$ less /​usr/​share/​john/​password.lst
 +student@uso-demo:​~$ echo "​ana:​test123"​ | sudo chpasswd
 +student@uso-demo:​~$ echo "​bogdan:​qazwsx"​ | sudo chpasswd
 +student@uso-demo:​~$ id ana
 +uid=1001(ana) gid=1001(ana) groups=1001(ana)
 +student@uso-demo:​~$ id bogdan
 +uid=1002(bogdan) gid=1002(bogdan) groups=1002(bogdan)
 +</​code>​
 +
 +Mai sus am creat cei doi utilizatori cu parolele dorite.
  
 <​note>​ <​note>​
-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.+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>''​.
 </​note>​ </​note>​
  
-Dacă ne interesează să aflăm pe scurt, numărul de core-uri/procesoare din sistem, respectiv arhitectura hardware a sistemuluifolosim comenzile<​code>​ +Parolele utilizatorilor sunt stocate în forma criptată (//hash//) în fișierul ''/​etc/​shadow''​accesibil doar cu permisiuni privilegiate<​code>​ 
-student@uso-demo:​~$ ​nproc +student@uso-demo:​~$ ​tail -2 /etc/shadow 
-1+tail: cannot open ‘/​etc/​shadow’ for reading: Permission denied 
 +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:​~$ ​arch +student@uso-demo:​~$ ​/​usr/​sbin/​john -wordlist:/​usr/​share/​john/​password.lst shadow-entries 
-i686+Created directory: /​home/​student/​.john 
 +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>​
-La fel cum am precizat mai sus, informații depsre procesor putem afla și folosind comenzile ​''​dmidecode''​''​inxi'' ​și ''​hwinfo''​.+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.
 </​note>​ </​note>​
 +==== Criptare/​decriptare folosind chei simetrice ====
  
-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//).+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.
  
-Pentru a afișa sumar informații despre utilizarea procesorului putem folosi comanda ​''​mpstat''​:<​code>​ +Un utilitar folosit pentru criptare (și alte operații criptografice) este ''​openssl''​. ​Cu ''​openssl''​ putem cripta și folosind chei simetrice și chei asimetrice.
-student@uso-demo:​~$ mpstat +
-Linux 3.16.0-4-586 (uso-demo) 12/05/2015 _i686_ (1 CPU)+
  
-06:02:14 PM  CPU    %usr   ​%nice ​   %sys %iowait ​   %irq   ​%soft ​ %steal ​ %guest ​ %gnice ​  %idle +Pentru testare, să creăm un fișier //plain text// (ușor de citit):<​code>​ 
-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:~$ echo "This is my life's biggest secretI have no life" > plain.txt 
 +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 afla informații despre memoria RAM a sistemului putem folosi comanda ​''​lshw''​:<​code>​ +Pentru a cripta accest fișier, folosim algoritmul ​''​AES'' ​(//Advanced Encryption Standard//​),​ un standard de facto de criptare, cu ajutorul comenzii<​code>​ 
-student@uso-demo:​~$ ​sudo lshw -class memory +student@uso-demo:​~$ ​openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.dat 
-  ​*-memory ​               ​ +enter aes-256-cbc encryption password: 
-       descriptionSystem memory +Verifying - enter aes-256-cbc encryption password: 
-       physical id0 +student@uso-demo:​~$ ls -l encrypted.dat  
-       size500Mi+-rw------- 1 student student 80 Jan  5 12:17 encrypted.dat 
 +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''​.
  
-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>​ +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>​ 
-razvan@einherjar:~$ sudo dmidecode ​--type memory +student@uso-demo:~$ rm plain.txt  
-# dmidecode 3.+student@uso-demo:~$ openssl enc -d -aes-256-cbc -in encrypted.dat -out plain.txt 
-Getting SMBIOS data from sysfs+enter aes-256-cbc decryption password: 
-SMBIOS 2.6 present.+student@uso-demo:​~$ cat plain.txt  
 +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.
  
-Handle 0x0005, DMI type 16, 15 bytes +<​note>​ 
-Physical Memory Array +Sunt și alți algoritmi posibili pentru criptare simetrică folosind comanda ''​openssl''​. Pentru a-i determina folosim comanda<​code>​ 
- LocationSystem Board Or Motherboard +student@uso-demo:~$ openssl enc -help 
- Use: System Memory +</​code>​ 
- Error Correction Type: None +</​note>​
- Maximum Capacity: 8 GB +
- Error Information Handle: Not Provided +
- Number Of Devices: 2+
  
-Handle 0x0006DMI type 17, 28 bytes +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>​ 
-Memory Device +student@uso-demo:~$ openssl enc -e -base64 -aes-256-cbc -in plain.txt -out encrypted.dat 
- Array Handle0x0005 +enter aes-256-cbc encryption password
- Error Information HandleNot Provided +Verifying - enter aes-256-cbc encryption password
- Total Width64 bits +student@uso-demo:~$ cat encrypted.dat ​ 
- Data Width64 bits +U2FsdGVkX18HD7U8AkSTfWFQEryHAjfJ7hQlWZQSdMvmdwZSES76zQz7JioIultg 
- Size4096 MB +x4sLDHbAA6xTo8ioX3gG/​L+7REMUuN46hUXCBB+G1c4= 
- Form Factor: SODIMM + 
- Set: None +student@uso-demo:~$ openssl enc -d -base64 -aes-256-cbc -in encrypted.dat -out plain.txt 
- LocatorChannelA-DIMM0 +enter aes-256-cbc decryption password
- Bank LocatorBANK 0 +student@uso-demo:~$ cat plain.txt ​ 
- TypeDDR3 +This is my life's biggest secretI have no life 
- Type DetailSynchronous +</​code>​ 
- Speed: 1333 MHz + 
- Manufacturer:​ Samsung +Observăm mai sus că avem o formă ASCII a fișierului criptat ''​encrypted.dat''​. 
- Serial Number: 66313530 +==== Criptare/​decriptare folosind chei asimetrice ==== 
- Asset TagUnknown + 
- Part NumberM471B5273CH0-CH9  ​ +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. 
- 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. 
  
-Tot cu ajutorul comenzii ​''​dmidecode'' ​putem afișa informații despre memoria cache a sistemului:<​code>​ +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//). 
-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>​
  
-Dacă ne interesează informații despre utilizarea memoriei sistemului, ​putem folosi ​comanda ''​free'':<​code>​ +Fișierul criptat este un fișier binar; îl putem vizualiza folosind ​comanda ''​xxd''​
-student@uso-demo:​~$ ​free -+ 
-             ​total ​      ​used ​      ​free ​    ​shared ​   buffers ​    ​cached +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>​ 
-Mem:           ​500 ​       270        230          4         ​24 ​       196 +student@uso-demo:​~$ ​openssl rsautl ​-decrypt -in encrypted.dat -out plain.txt -inkey privkey 
--/+ buffers/​cache        48        451 +student@uso-demo:~$ cat plain.txt ​ 
-Swap         ​382 ​         0        382+This is my life's biggest secretI have no life
 </​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. 
  
-Detalii despre utilizarea memoriei RAM găsim în fișierul ''​/​proc/​meminfo''​:<​code>​ +<​note>​ 
-student@uso-demo:​~$ ​cat /​proc/​meminfo ​ +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. 
-MemTotal: ​        ​512596 kB +</​note>​ 
-MemFree         ​236044 kB +==== Semnare/​verificare folosind chei asimetrice ==== 
-MemAvailable: ​    ​468944 kB + 
-Buffers: ​          25296 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. 
-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>​
  
-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//).  +Pentru verificarea semnăturii vom folosi comanda<​code>​ 
-==== Afișarea de informații despre discuri ==== +student@uso-demo:​~$ ​openssl rsautl ​-verify ​-in signature ​-pubin -inkey pubkey ​ 
- +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>​
  
-Alte comenzi cu un output similar sunt:<code+<note
-student@uso-demo:~$ sudo fdisk -l+Pentru criptare/​decriptare și semnare/​verifcare cu chei asimetrice putem folosi și suita [[https://​www.gnupg.org/​|GnuPG]] (//GNU Privacy Guard//). 
 +</​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+
  
-Device ​    ​Boot ​   Start      End  Sectors ​ Size Id Type +====== Curs 10 - Shell scripting =======
-/​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+
  
-student@uso-demo:~$ sudo parted ​-l +  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout.pdf | Slide-uri curs]] 
-ModelATA VBOX HARDDISK (scsi) +  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-4on1-notes.pdf | Handout 4on1 and notes space]] 
-Disk /dev/sda8590MB +  * [[http://elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-8on1.pdf | Handout 8on1]] 
-Sector size (logical/​physical): 512B/512B +  * **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 
-Partition Tablemsdos +  * **Suport de curs** 
-Disk Flags: ​+    * Suport ​(Introducere în sisteme de operare) 
 +      * 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
  
-Number ​ Start   ​End ​    ​Size ​   Type      File system ​    Flags +<​HTML>​ 
- 1      1049kB ​ 8186MB ​ 8185MB ​ primary ​  ​ext4 ​           boot +  <​center>​ 
- 2      8187MB ​ 8589MB ​ 402MB   ​extended +    <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;">​ 
- 5      8187MB ​ 8589MB ​ 402MB   ​logical ​  ​linux-swap(v1)+    </​iframe>​ 
 +  ​</​center>​ 
 +</​HTML>​
  
 +===== Demo-uri =====
  
-student@uso-demo:~$ sudo lsblk +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.
-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  ​+
  
-student@uso-demo:~$ sudo lsblk -f +Mașina virtuală deține două interfețe de rețea
-NAME   ​FSTYPE LABEL UUID                                 ​MOUNTPOINT +  * ''​eth0''​ pentru accesul la Internet (interfață de tipul NAT) 
-sda                                                       +  * ''​eth1''​ pentru comunicarea cu sistemul fizic (gazdă, //host//) (interfață de tipul //Host-only Adapter//)
-├─sda1 ext4         ​4c03932f-ebdc-4d7d-bf4e-aa65f3889d73 ​/ +
-├─sda2 ​                                                   +
-└─sda5 swap         ​709a57ff-ffc5-4cf2-bfd7-2850a842e41f [SWAP] +
-sr0                                                      ​+
  
-student@uso-demo:~$ sudo hwinfo ​--block --short +Pentru a rula demo-ul avem două opțiuni
-disk                                                          ​ +  ​- Folosim direct consola mașinii virtuale. 
-  ​/​dev/​sda ​            VBOX HARDDISK +  ​- 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>​ 
-partition: +ssh student@<​adresa-IP-vm-eth1>​ 
-  ​/​dev/​sda1 ​           Partition +</code> unde ''<​adresa-IP-vm-eth1>''​ este adresa IP a interfeței ''​eth1''​ din cadrul mașinii virtuale. 
-  /​dev/​sda2 ​           Partition + 
-  /dev/​sda5 ​           Partition +Pentru conectarea la mașina virtuală folosim numele de utilizator ''​student''​ cu parola ''​student''​. Contul ''​student''​ are permsiuni de ''​sudo''​. Folosind comanda<​code>​ 
-cdrom: +sudo su -
-  /​dev/​sr0 ​            VBOX CD-ROM+
 </​code>​ </​code>​
 +obținem permisiuni privilegiate (de ''​root''​) în shell.
  
-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.+<​note>​ 
 +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>​
  
-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>​ +<​note>​ 
-student@uso-demo:​~$ ​df -hT +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. 
-Filesystem ​    ​Type ​     Size  Used Avail Use% Mounted on +</​note>​ 
-/dev/sda1      ext4      7.4G  1.6G  5.5G  23% / + 
-udev           ​devtmpfs ​  ​10M ​    ​0 ​  ​10M ​  ​0% ​/dev +<​note>​ 
-tmpfs          tmpfs     ​101M ​ 4.4M   ​96M ​  5% /run +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     ​251M ​    ​0 ​ 251M   ​0% ​/dev/shm +</​note>​ 
-tmpfs          tmpfs     5.0M     ​0 ​ 5.0M   ​0% ​/run/lock + 
-tmpfs          tmpfs     ​251M ​    ​0 ​ 251M   ​0% ​/sys/​fs/​cgroup+==== Obținere arhivă ==== 
 + 
 +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>​
  
-O afișare ceva mai estetică obținem cu ajutorul comenzii ​''​pydf''​. Pentru aceasta ​instalăm în prealabil pachetul ​''​pydf''​:<​code>​ +Acum putem parcurge secțiunile cu demo-uri de mai jos. Vom folosi resursele din directorul rezultat în urma dezarhivării. 
-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>​
  
-student@uso-demo:​~$ ​pydf +Dacă dorim să "​unicizăm"​ rezultatele și să afișăm doar numele liceelor putem conecta comanda de mai sus la o comandă ''​sort'':<​code>​ 
-Filesystem ​ Size  Used Avail Use%                                                    Mounted on +student@uso-demo:​~/​curs-11-democut -d ','​ -f 2 < user-results.csv | sort -u 
-/​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.
  
-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.+Dacă ne interesează să afișăm **doar** identificatorii utilizatorilor ​și punctajele obținuteatunci folosim comanda<​code>​ 
 +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>​
-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/+Utilitarul ''​cut'' ​are două opțiuni frecvent folosite: 
 +  * 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 ==== 
  
-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''​.+==== Splitting ​și prelucrare folosind while read ====
  
-De exemplu, dacă dorim să generăm un fișier de ''​10MB'' ​plin cu zero-uri, vom folosi comanda<​code>​ +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.
-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+
  
-student@uso-demo:~$ ls -lh zero-1OMB  +Pentru a extrage conturile care au punctaj mai mare ca 500, vom folosi scriptul ''​extract-points-500''​ de mai jos: 
--rw-r--r-- 1 student student 10M Dec  5 18:09 zero-1OMB+<file Bash extract-points-500> 
 +#​!/​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>​
-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//).+Î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''​.
  
-Dacă dorim să generăm un fișier de ''​5MB'' ​plin cu date aleatoare, vom folosi comanda<​code>​ +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>​ 
-student@uso-demo:​~$ dd if=/dev/urandom of=random-5MB bs=1M count=5 +student@uso-demo:​~/​curs-11-demo$ cat extract-points-500 ​ 
-5+0 records in +#!/bin/bash
-5+0 records out +
-5242880 bytes (5.2 MB) copied, 0.56655 s, 9.3 MB/s+
  
-student@uso-demo:​~$ ls -lh random-5MB  +IFS=','​ 
--rw-r--r-- 1 student student 5.0M Dec  5 18:11 random-5MB+while read uid school date points; do 
 +    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//). 
  
-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>​ +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>​ 
-student@uso-demo:​~$ ​sudo dd if=/dev/sda of=mbr count=1 +student@uso-demo:​~/​curs-11-demo./extract-points-500 | sort -t ','​ -k 2,2rn 
-1+0 records in +radu.dumitru5227,​21433 
-1+0 records out +mihaela.catai,​13623 
-512 bytes (512 B) copied0.00355612 s144 kB/s+stefania.oprea,9547 
 +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''​).
  
-student@uso-demo:​~$ ls -lh mbr  +<​note>​ 
--rw-r--r-- 1 root root 512 Dec  5 18:13 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''​. 
 +</​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. 
  
-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>​ +Pentru a afișa și punctajul folosim one liner-ul:<​code>​ 
-student@uso-demo:​~$ ​xxd mbr+student@uso-demo:​~/​curs-11-demoawk -F ','​ '{ if ($4 >= 500) print $1 ","​ $4;}' < user-results.csv  
 +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>​
  
-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>​ +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. 
-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>​
-Cu această comandă creăm fișierul ​''​myimage.iso'' ​ca fișier imagine al CD-ului aflat în unitatea ​de CD.+Î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''​).
  
-<​note ​warning+<​note>​ 
-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.+În awk, sed și alte utilitare similare expresiile regulate ​se plasează între slash-uri; mai sus a fost vorba de ''​%%/[^\.]+\.c/%%''​.
 </​note>​ </​note>​
-==== Crearea unei mașini virtuale în VirtualBox ==== 
  
-Pentru crarea unei mașini virtuale în VirtualBox folosim, de regulă, interfața grafică a VirtualBox. Pentru aceasta urmăm ​ca pași principali+Același rezultat ​ca mai sus putea fi realizat ​și cu ajutorul comenzii ''​grep''​ legată de la comanda ''​awk'',​ ca mai jos:<​code>​ 
-  * Crearea specificațiilor mașinii virtualememoriehard disctip de sisteme de operare +student@uso-demo:~/​curs-11-demo$ awk -F ',' '{ if ($4 >= 500) print $1 "," $4;}' < user-results.csv | grep '​^[^\.]\+\.c'​ 
-  * Alegerea unui mediu de bootde obicei o imagine de CD bootabil în format ​''​.iso''​ +mihaela.croitoru,516 
-  * Pornirea mașinii virtuale (bootarea acesteia) ​și pornirea procesului de instalare+andreea.cismas,​803 
 +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.
  
-Acești pași sunt descriși ​în video-ul de tip screencast de mai josaccesibil direct la adresa https://youtu.be/​xFkkeVoOC_A.+Î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''​: 
 +<file Bash extract-points-500-awk>​ 
 +#!/bin/bash
  
-<​html>​ +awk -F ','​ ' 
-<​center>​ +$1 ~ /[^\.]+\.c
-<iframe width="​560"​ height="​315"​ src="​https:/​/www.youtube.com/embed/​xFkkeVoOC_A"​ frameborder="0" ​allowfullscreen>​ +    if ($4 >500) 
-</iframe+        print $1 "," ​$4; 
-</center+    } 
-</html>+' < user-results.csv 
 +</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.
  
-==== Afișarea de informații despre ​mașinile virtuale VirtualBox ​====+<​note>​ 
 +Î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>​
-Comenzile indicate mai jos pot fi rulate doar pe un sistem fizic (Linux sau Windows) în cadrul căruia a fost instalat VirtualBox.+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.
 </​note>​ </​note>​
  
-Î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.+==== Folosire expresii regulate ​în sed ====
  
-De exemplupentru a afișa mașinile virtuale existente ​în VirtualBoxrulăm comanda<​code>​ +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. 
-razvan@einherjar:~$ vboxmanage list vms + 
-"​Windows-7" {2a9b2719-2c6c-42df-9f19-5febff6172bf} +Î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. 
-"​Debian"​ {18565cc7-101d-4ac4-91b4-2ee317b7f9ae} + 
-"​Debian 32 bit" {562696b3-efb8-42e4-8a66-519a98aa5ac8} +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>​ 
-"​Xubuntu-14.04" {cd57aa75-82b0-4f07-8236-81517f2ee87d} +student@uso-demo:~/curs-11-demo$ sed '​s/​^[^\.]\+/​aaa/​g'​ < user-results.csv 
-"SSS - Debian 32bit" {fa9dd108-fe13-4d12-adcd-84e29bcc3232} +aaa.asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:18:01,0 
-"​SSS ​Windows 7 32bit" {4f27ec11-33a8-400d-a898-d252169ab52f} +aaa.matei,​Colegiul Național Ion Maiorescu,​2015-03-17 11:04:49,66 
-"​Training - Linux Kernel Dev" {3645e7b4-482e-4bd2-aa73-f29e8b15288f} +aaa.dascalu,​Colegiul Tehnic Toma Socolescu,​None,​285 
-"GSR Debian"​ {409a6ad1-3998-443b-9297-e46aa1d944e5} +aaa.konnerth,​Colegiul Național Nichita Stănescu,​None,​42 
-"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} +aaa.corneanu,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:​26:​21,​247 
-"IOCLA Linux" {5ee0048a-6bd1-4dc6-bf1b-daffc1729066} +[...]
-"USO Linux" {845446cb-0210-4f3b-8df0-91cd1c67b5e2}+
 </​code>​ </​code>​
-Comanda afișează mașinile virtuale existente ​în sistemul gazdă împreună cu un identificator unic al acestora (numit UUID -- //Universally Unique Identifier//).+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.
  
-Dacă vrem să afisăm doar mașinile virtuale care rulează, folosim comanda<​code>​ +Dacă dorim să eliminăm prenumele (împreună cu punctul) din numele de cont vom folosi o construcție precum<​code>​ 
-razvan@einherjar:!vboxmanage list runningvms +student@uso-demo:~/​curs-11-demosed '​s/​^[^\.]\+\.//​g'​ < user-results.csv 
-"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} +asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 
-<​code>​+matei,​Colegiul Național Ion Maiorescu,​2015-03-17 11:​04:​49,​66 
 +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.
  
-Dacă ne interesează ​să aflăm informații detaliate despre o mașină virtuală rulăm comanda<​code>​ +O situație poate fi să fie înlocuită construcția ''​prenume.nume''​ cu ''​nume.prenume''​ în numele contului. Pentru aceasta folosim construcția<​code>​ 
-razvan@einherjar:~$ vboxmanage showvminfo "USO Demo"​ +student@uso-demo:~/​curs-11-demosed 's/^\([^\.]\+\)\.\([^\,​]\+\),/​\2.\1,/​g'​ < user-results.csv 
-Name:            USO Demo +asimionesei.ionut,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 
-Groups: ​         ​/ +matei.laura,​Colegiul Național Ion Maiorescu,​2015-03-17 11:04:49,66 
-Guest OS:        Debian ​(32-bit) +dascalu.alin,​Colegiul Tehnic Toma Socolescu,​None,​285 
-UUID:            e04f00a6-7530-45d0-95e6-56ba46d6810a +konnerth.dragos,​Colegiul Național Nichita Stănescu,​None,​42 
-Config file:     /​home/​razvan/​vm/​vbox/​USO Demo/USO Demo.vbox +corneanu.alexandru,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:26:21,247
-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>​
-Comanda afișează o multitudine ​de informații despre mașina virtuală, practic tot ceea ce definește.+Expresia regulată folosită mai sus (''​%%^\([^\.]\+\)\.\([^\,​]\+\),​%%''​) ​decodificăm în următoarele componente:​ 
 +  * ''​%%^%%'':​ î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>​
-Comanda ​''​vboxmanage'' ​are o mulțime de subcomenzi care pot fi folosite pentru inspectarea ​și configurarea mașinilor virtualePuteți folosi comanda<​code>​ +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.
-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
  
-==== Sumar comenzi Linux legate de hardware ====+if test $# -eq 1; then 
 +    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
  
-Mai jos este un sumar al comenzilor Linux folosite pentru inspectarea componentelor harware ale sistemuluiSunt indicate comenzile pe tipuri de componente.+for id in $(seq -f "​%02g"​ 0 13); do 
 +    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>​
  
-^  Componentă hardware ​ ^  Comenzi pentru specificații ​ ^  Comenzi pentru monitorizare ​  ^ +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.
-^  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-11.1481448977.txt.gz · Last modified: 2016/12/11 11:36 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