Differences

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

Link to this comparison view

uso:cursuri:curs-10 [2016/12/03 19:13]
razvan.deaconescu
uso:cursuri:curs-10 [2022/12/12 20:02] (current)
sergiu.weisz
Line 1: Line 1:
-====== Curs 10 - Shell scripting ​=======+====== Curs 10 - Securitatea Sistemului ​=======
  
-  * [[http://elf.cs.pub.ro/uso/res/cursuri/curs-10/​curs-10-handout.pdf | Slide-uri curs]] +  * [[https://docs.google.com/presentation/d/1_cb_aQCGOEsTfP7r1LXgiLpus9DMM9Fk/edit#​slide=id.p1| Slide-uri curs]]
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-4on1-notes.pdf | Handout 4on1 and notes space]] +
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-10/​curs-10-handout-8on1.pdf | Handout 8on1]] +
-  * **Cuvinte cheie**: splitting, separator de câmpuri, one liner, filtru de text, script shell, ''​IFS'',​ ''​while read'',​ ''​for'',​ ''​if'',​ expresii regulate, metacaractere,​ globbing, ''​grep'',​ prelucrare de date, automatizare+
   * **Suport de curs**   * **Suport de curs**
-    * Suport (Introducere în sisteme ​de operare) +    * [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor ​de operare]] 
-      Capitolul ​12 -- Shell scripting +        Secțiunea ​12 - Securitatea Sistemului 
-        Secțiunile 12.4, 12.5, 12.6, 12.9 + 
-    * [[http://www.amazon.com/Regular-Expressions-Cookbook-Jan-Goyvaerts/dp/1449319432|Regular Expressions Cookbook]] +<​HTML>​ 
-      Puteți descărca fișierul PDF aferent ​de [[https://github.com/shihyu/Regular_Expressions|aici]]. +<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>​ 
-      * Capitolul 1 -- Introduction to Regular Expressions +</​HTML>​ 
-      * Capitolul ​-- Basic Regular Expression Skills+ 
 +/* 
 + 
 +====== Curs 09 - Considerente hardwareMaș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** 
 +    * [[http://books.google.com/books?​id=_JFGzyRxQGcC | Introducere în sisteme de operare]] 
 +      * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA185 ​Capitolul 7 - 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 ​-- 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-10/curs-10-handout.pdf&​embedded=true"​ width="​600"​ height="​480"​ style="​border:​ none;">​+    <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>​     </​iframe>​
   </​center>​   </​center>​
Line 55: Line 71:
 </​note>​ </​note>​
  
-==== Obținere arhivă ====+==== Afișarea de informații despre placa de bază ====
  
-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 Linuxfolosind comanda<​code bash> +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 memoriesau controllere care fac legătura cu alte componente (precum controller SCSI pentru hard disk).
-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-11-demo$ ls +
-user-results.csv +
-</​code>​+
  
-Acum putem parcurge secțiunile cu demo-uri ​de mai josVom folosi resursele din directorul rezultat ​în urma dezarhivării.+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:​~$ lspci 
 +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)
  
-==== Splitting folosind cut ====+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>​
  
-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 ​(coloanecare să fie selectate din tabel.+Î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: 
 +  * placa video (''​VGA''​) 
 +  * 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)
  
-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>​ +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:​~/​curs-11-democut -d ','​ -f 2 < user-results.csv +student@uso-demo:​~$ ​sudo apt-get install lshw
-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>​ </​code>​
  
-Dacă dorim să "​unicizăm"​ rezultatele și să afișăm doar numele liceelor putem conecta comanda de mai sus la comandă ''​sort''​:<​code>​ +Printr-simplă rulare a comenzii ​''​lshw'' ​vom afișa informații despre întreg hardware-ul sistemului<​code>​ 
-student@uso-demo:​~/curs-11-demo$ cut -d ','​ -f < user-results.csv | sort -+student@uso-demo:​~$ sudo lshw  
- +uso-demo                   
-Colegiul Economic Virgil Madgearu +    description:​ Computer 
-Colegiul Național Alexandru Odobescu +    width: 32 bits 
-Colegiul Național Barbu Știrbei +    capabilities:​ smbios-2.
-Colegiul Național Cantemir Vodă +  *-core
-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>​ +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:​~/​curs-11-democut -d ','​ -f 1,4 < user-results.csv | head +student@uso-demo:​~$ ​sudo lshw -short 
-ionut.asimionesei,​+H/W path        Device ​     Class       ​Description 
-laura.matei,​66 +=================================================== 
-alin.dascalu,285 +                            system ​     Computer 
-dragos.konnerth,42 +/0                          bus         ​Motherboard 
-alexandru.corneanu,​247 +/0/0                        memory ​     500MiB System memory 
-alexandru.tittes,154 +/0/                       ​processor ​  ​Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
-[...]+/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/​2 ​                   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/​8 ​       eth1        network ​    ​82540EM Gigabit Ethernet Controller 
 +/​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>​
 +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.
  
 <​note>​ <​note>​
-Utilitarul ​''​cut'' ​are două opțiuni frecvent folosite: +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>​ 
-  * opțiunea ​''​-d'' ​care precizează delimitatorul de câmpuri (//field delimiter// sau //field separator//​) +sudo apt-get install dmidecode 
-  * opțiunea ​''​-f'' ​care precizează ce câmpuri/coloane dorim să extragem+sudo apt-get install inxi 
 +sudo apt-get install hwinfo 
 +</code>
 </​note>​ </​note>​
  
-==== Splitting și prelucrare folosind while read ==== +<​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/ 
-Utilitarul ''​cut'' ​are dezavantajul că face doar splitting ​și extrage câmpuri/coloaneNu putem condiționa extragerea unor câmpuriDe 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. +</note
- +==== Afișarea de informații despre procesor ====
-Pentru a extrage conturile care au punctaj mai mare ca 500, vom folosi scriptul ''​extract-points-500''​ de mai jos: +
-<file Bash extract-points-500+
-#!/bin/bash+
  
-IFS=',' +Pentru a afișa informații despre procesorul sistemului putem folosi comanda ''​lscpu''<​code>​ 
-while read uid school date points; do +student@uso-demo:​~$ ​lscpu 
-    if test "​$points"​ -ge 500; then +Architecture: ​         i686 
-        echo "​$uid"​ +CPU op-mode(s): ​       32-bit 
-    fi +Byte Order: ​           Little Endian 
-done < user-results.csv +CPU(s): ​               1 
-</​file>​ +On-line CPU(s) list:   0 
-Rulăm scriptul folosind comanda<​code>​ +Thread(s) per core:    1 
-student@uso-demo:​~/​curs-11-demo./extract-points-500  +Core(s) per socket: ​   1 
-mihaela.croitoru +Socket(s): ​            1 
-andreea.cismas +Vendor ID:             ​GenuineIntel 
-elvis.titirca +CPU family: ​           6 
-mihaela.serbana +Model: ​                42 
-anjie.teodorescu +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>​
-Î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ă afișăș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>​ +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ă.
-student@uso-demo:​~/​curs-11-demo$ cat extract-points-500  +
-#!/bin/bash+
  
-IFS=','​ +În output-ul comenzii ne sunt afișate informații despre procesorprecum numărul de core-uri, numărul modelului, frecvența, dimensiunea memoriei cache.
-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 +Aceste informații pot fi afișate și cu ajutorul comenzii ''​lshw''<​code>​ 
-mihaela.croitoru,​516 +student@uso-demo:​~$ ​sudo lshw -class cpu 
-andreea.cismas,803 +  *-cpu                    
-elvis.titirca,​501 +       product: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
-mihaela.serbana,​526 +       vendor: Intel Corp
-anjie.teodorescu,​666 +       physical id: 1 
-georgiana.ciobanica,​1047 +       bus info: cpu@0 
-[...]+       version: 6.10.7 
 +       serial: 0002-06A7-0000-0000-0000-0000 
 +       size: 2500MHz 
 +       ​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>​
  
-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 numeric, descrescător după a doua coloană<​code>​ +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:​~/​curs-11-demo./extract-points-500 | sort -t ','​ -k 2,2rn +student@uso-demo:​~$ ​cat /proc/​cpuinfo ​ 
-radu.dumitru5227,​21433 +processor : 0 
-mihaela.catai,​13623 +vendor_id : GenuineIntel 
-stefania.oprea,​9547 +cpu family : 6 
-alexandra.calinescu,​5266 +model : 42 
-george.ungureanu,​3846 +model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 
-dragos.totu,2040 +[...]
-monica.cirisanu,​1815+
 </​code>​ </​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>​ <​note>​
-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''​.+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>​
  
-==== Splitting și prelucrare folosind awk ====+Dacă ne interesează să aflăm pe scurt, numărul de core-uri/​procesoare din sistem, respectiv arhitectura hardware a sistemului, folosim comenzile<​code>​ 
 +student@uso-demo:​~$ nproc 
 +1
  
-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.+student@uso-demo:~$ arch 
 +i686 
 +</​code>​
  
-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.+<​note>​ 
 +La fel cum am precizat ​mai sus, informații depsre procesor putem afla și folosind comenzile ​''​dmidecode''​''​inxi''​ și ''​hwinfo''​. 
 +</​note>​
  
-Pentru a obține același efect cu al scriptului ​''​extract-points-500''​ putem folosi ​oneliner-ul de mai jos:<​code>​ +Dacă dorim să vedem încărcarea sistemului ​și utilizarea procesorului,​ putem 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//). 
-student@uso-demo:​~/​curs-11-demoawk -F ','​ '{ if ($>= 500print $1;}' < user-results.csv ​ + 
-mihaela.croitoru +Pentru a afișa sumar informații despre utilizarea procesorului ​putem folosi ​comanda ''​mpstat''​:<​code>​ 
-andreea.cismas +student@uso-demo:​~$ ​mpstat 
-elvis.titirca +Linux 3.16.0-4-586 (uso-demo 12/05/2015 _i686_ (CPU) 
-mihaela.serbana + 
-anjie.teodorescu +06:02:14 PM  CPU    %usr   ​%nice ​   %sys %iowait ​   %irq   ​%soft ​ %steal ​ %guest ​ %gnice ​  %idle 
-georgiana.ciobanica +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
-[...]+
 </​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 afișși punctajul folosim one liner-ul:<​code>​ +Pentru a afla informații despre memoria RAM sistemului putem folosi comanda ''​lshw''​:<​code>​ 
-student@uso-demo:​~/​curs-11-demoawk -F ','​ '{ if ($4 >= 500) print $1 ","​ $4;}' < user-results.csv ​ +student@uso-demo:​~$ ​sudo lshw -class memory 
-mihaela.croitoru,​516 +  *-memory ​               ​ 
-andreea.cismas,​803 +       description:​ System memory 
-elvis.titirca,​501 +       physical id: 0 
-mihaela.serbana,​526 +       size: 500Mi
-anjie.teodorescu,​666 +
-georgiana.ciobanica,​104 +
-[...]+
 </​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 punctajrespectiv.+Din păcate comanda ne oferă informații minimale despre memoria RAM. Dacă ne interesează viteza ​de acces, numărul de module ​și alte informații,​ putem folosi comanda ​''​dmidecode''​. Din păcate, pe mașina virtuală nu afișează informații extinsedar putem afla informații mai multe rulând comanda pe un sistem Linux instalat nativ:<​code>​ 
 +razvan@einherjar:​~$ sudo dmidecode --type memory 
 +# dmidecode 3.0 
 +Getting SMBIOS data from sysfs. 
 +SMBIOS 2.6 present.
  
-După cum am precizat''​awk''​ are suport de expresii regulate. Dacăde exempludin 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>​ +Handle 0x0005DMI type 1615 bytes 
-student@uso-demo:~/​curs-11-demo$ awk -F ','​ '$1 ~ /[^\.]+\.c/ { if ($4 >= 500) print $1 ","​ $4;}' < user-results.csv ​ +Physical Memory Array 
-mihaela.croitoru,​516 + Location: System Board Or Motherboard 
-andreea.cismas,​803 + Use: System Memory 
-georgiana.ciobanica,​1047 + Error Correction Type: None 
-ion.camasa,​502 + Maximum Capacity: 8 GB 
-mihaela.catai,​13623 + Error Information Handle: Not Provided 
-alexandra.cismaru,​860+ Number Of Devices: 2 
 + 
 +Handle 0x0006DMI type 1728 bytes 
 +Memory Device 
 + Array Handle0x0005 
 + Error Information HandleNot Provided 
 + Total Width: 64 bits 
 + Data Width: 64 bits 
 + Size: 4096 MB 
 + Form Factor: SODIMM 
 + Set: None 
 + Locator: ChannelA-DIMM0 
 + Bank Locator: BANK 0 
 + Type: DDR3 
 + Type Detail: Synchronous 
 + Speed: 1333 MHz 
 + Manufacturer:​ Samsung 
 + Serial Number: 66313530 
 + Asset Tag: Unknown 
 + Part Number: M471B5273CH0-CH9 ​  
 + Rank: Unknown
 [...] [...]
 </​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''​).+În output-ul comenzii ​''​dmidecode'' ​putem afla numărul de sloturi ​(''​bank''​), fabricantul,​ viteza, tipul.
  
-<​note>​ +Tot cu ajutorul comenzii ''​dmidecode'' ​putem afișa informații despre memoria cache a sistemului:<​code>​ 
-În awk, sed și alte utilitare similare expresiile regulate se plasează între slash-uri; mai sus a fost vorba de ''​%%/​[^\.]+\.c/​%%''​. +razvan@einherjar:~$ sudo dmidecode ​-t cache
-</​note>​ +
- +
-Același rezultat ca mai sus putea fi realizat și cu ajutorul comenzii ''​grep'' ​legată de la comanda ''​awk'',​ ca mai jos:<​code>​ +
-student@uso-demo:~/​curs-11-demoawk -F ','​ '{ if ($4 >= 500) print $1 ","​ $4;}' < user-results.csv | grep '​^[^\.]\+\.c'​ +
-mihaela.croitoru,​516 +
-andreea.cismas,​803 +
-georgiana.ciobanica,​1047 +
-ion.camasa,​502 +
-mihaela.catai,​13623 +
-alexandra.cismaru,​860 +
-[...]+
 </​code>​ </​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 complicat, poate fi plasat într-un script shellașa cum este în fișierul ​''​extract-points-500-awk'':​ +Dacă ne interesează informații despre utilizarea memoriei sistemuluiputem folosi comanda ​''​free'':<​code> 
-<file Bash extract-points-500-awk> +student@uso-demo:~$ free -
-#!/bin/bash+             ​total ​      ​used ​      ​free ​    ​shared ​   buffers ​    ​cached 
 +Mem:           500        ​270 ​       230          4         ​24 ​       196 
 +-/+ buffers/cache: ​        ​48 ​       451 
 +Swap:          382          0        382 
 +</​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.
  
-awk -F ',' ​+Detalii despre utilizarea memoriei RAM găsim în fișierul ​''/​proc/meminfo'':<​code>​ 
-$1 ~ /[^\.]+\.c+student@uso-demo:​~$ ​cat /proc/​meminfo ​ 
-    if ($4 >= 500) +MemTotal: ​        ​512596 kB 
-        print $1 ","​ $4; +MemFree: ​         236044 kB 
-    } +MemAvailable: ​    ​468944 kB 
-' ​< user-results.csv +Buffers: ​          25296 kB 
-</​file>​ +Cached: ​          ​201248 kB
-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>​ </​code>​
-Scriptul ''​extract-points-500-awk''​ face același lucru ca one liner-ul anterior doar că este mai lizibil. 
  
-<​note>​ +Informații despre utilizarea memoriei sistemului aflăș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//).  
-Î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+==== Afișarea de informații despre discuri ====
-</​note>​+
  
-==== Splitting și prelucrare folosind Python ​====+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>​
  
-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.+Alte comenzi ​cu un output similar sunt:<​code>​ 
 +student@uso-demo:​~$ sudo fdisk -l
  
-Î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''​ +Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors 
-<file Python extract-points-500.py>​ +Units: sectors of 1 * 512 = 512 bytes 
-#!/usr/bin/env python+Sector size (logical/physical): 512 bytes 512 bytes 
 +I/O size (minimum/​optimal):​ 512 bytes / 512 bytes 
 +Disklabel type: dos 
 +Disk identifier: 0x1aaa7728
  
-import sys +Device ​    ​Boot ​   Start      End  Sectors ​ Size Id Type 
-import re+/​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
 +Model: ATA VBOX HARDDISK (scsi)
 +Disk /dev/sda: 8590MB
 +Sector size (logical/​physical):​ 512B/512B
 +Partition Table: msdos
 +Disk Flags: ​
  
-def main(): +Number ​ Start   ​End ​    ​Size ​   Type      File system ​    Flags 
-    for line in open("​user-results.csv",​ "​rt"​):​ + 1      1049kB ​ 8186MB ​ 8185MB ​ primary ​  ​ext4 ​           boot 
-        line = line.rstrip("​\n"​) + 2      8187MB ​ 8589MB ​ 402MB   ​extended 
-        uid, school, date, points = line.split(","​) + 5      8187MB ​ 8589MB ​ 402MB   ​logical ​  ​linux-swap(v1)
-        if re.match("​[^\.]+\.c",​ uid): +
-            if int(points) >= 500: +
-                print "​%s,​%s"​ % (uid,points)+
  
  
-if __name__ == "​__main__"​+student@uso-demo:~$ sudo lsblk 
-    ​sys.exit(main()) +NAME   ​MAJ:​MIN RM  SIZE RO TYPE MOUNTPOINT 
-</file> +sda      8:0    0    8G  0 disk  
-Î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''​.+├─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  ​
  
-Rularea scriptului Python conduce la același rezultat ca în cazul folosirii ''​awk'':<​code>​ +student@uso-demo:​~$ sudo lsblk -f 
-student@uso-demo:​~/​curs-11-demo$ ​./extract-points-500.py ​ +NAME   ​FSTYPE LABEL UUID                                 ​MOUNTPOINT 
-mihaela.croitoru,​516 +sda                                                       
-andreea.cismas,​803 +├─sda1 ext4         ​4c03932f-ebdc-4d7d-bf4e-aa65f3889d73 ​/ 
-georgiana.ciobanica,​1047 +├─sda2 ​                                                   
-ion.camasa,​502 +└─sda5 swap         ​709a57ff-ffc5-4cf2-bfd7-2850a842e41f [SWAP] 
-mihaela.catai,​13623 +sr0                                                       
-alexandra.cismaru,​860 + 
-[...]+student@uso-demo:~sudo hwinfo ​--block --short 
 +disk:                                                            
 +  /​dev/​sda ​            VBOX HARDDISK 
 +partition: 
 +  /​dev/​sda1 ​           Partition 
 +  /​dev/​sda2 ​           Partition 
 +  /​dev/​sda5 ​           Partition 
 +cdrom: 
 +  /​dev/​sr0 ​            VBOX CD-ROM
 </​code>​ </​code>​
  
-Python oferă o flexibilitate superioară ''​awk''​ cu dezavantajul unei complexități mai mari a codului. Pentru acțiuni rapideintegrabile ​cu shell scripting''​awk''​ este o bună alegere (sau ''​while read''​);​ pentru acțiuni mai complexeun limbaj ​de programare dedicat, precum Python poate fi o soluție.+Comenzile de mai sus ne afișează partițiile sistemului, cu diverse informații precum numele lorspațiul ocupattipul de sistem ​de fișiere cu care este formatată partiția.
  
-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: +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> 
-<file Python extract-points-500-date.py> +student@uso-demo:~$ df -hT 
-#!/usr/bin/env python+Filesystem ​    ​Type ​     Size  Used Avail Use% Mounted on 
 +/​dev/​sda1 ​     ext4      7.4G  1.6G  5.5G  23% / 
 +udev           ​devtmpfs ​  ​10M ​    ​0 ​  ​10M ​  ​0% ​/dev 
 +tmpfs          tmpfs     ​101M ​ 4.4M   ​96M ​  ​5% ​/run 
 +tmpfs          tmpfs     ​251M ​    ​0 ​ 251M   ​0% ​/dev/shm 
 +tmpfs          tmpfs     ​5.0M ​    ​0 ​ 5.0M   0% /run/lock 
 +tmpfs          tmpfs     ​251M ​    ​0 ​ 251M   0% /​sys/​fs/​cgroup 
 +</​code>​
  
-import sys +O afișare ceva mai estetică obținem cu ajutorul comenzii ''​pydf''​. Pentru aceasta instalăm în prealabil pachetul ''​pydf'':<​code>​ 
-import re +student@uso-demo:​~$ sudo apt-get install pydf 
-from datetime import datetime+[...]
  
 +student@uso-demo:​~$ pydf
 +Filesystem ​ Size  Used Avail Use%                                                    Mounted on
 +/​dev/​sda1 ​ 7555M 1589M 5560M 21.0 [##########​......................................] / 
 +</​code>​
  
-def main(): +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.
-    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)+
  
 +<​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/​
 +</​note>​
 +==== Generarea de fișiere folosind comanda dd ====
  
-if __name__ == "​__main__":​ +Pentru situații ​de testare putem avea nevoie ​de fișiere de diferite dimensiuniPentru a genera astfel de fișiere putem folosi comanda ​''​dd''​ și intrările speciale ''/​dev/​urandom''​ și ''/​dev/​zero''​.
-    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 2015Acest lucru ar fi putut fi realizat în ''​awk'' ​dar ar fi complicat scriptul.+
  
-Pentru rularea scriptuluifolosim construcția<​code>​ +De exempludacă dorim să generăm un fișier de ''​10MB''​ plin cu zero-uri, vom folosi comanda<​code>​ 
-student@uso-demo:​~/​curs-11-demo$ ​./extract-points-500-date.py ​ +student@uso-demo:​~$ dd if=/dev/zero of=zero-1OMB bs=1M count=10 
-mihaela.catai,​2015-04-16 12:​29:​26,​13623 +10+0 records in 
-andra.cristiev,​2015-04-22 13:08:57,865+10+0 records out 
 +10485760 bytes (10 MB) copied, 0.0233232 s, 450 MB/s 
 + 
 +student@uso-demo:~ls -lh zero-1OMB  
 +-rw-r--r-- 1 student student 10M Dec  5 18:09 zero-1OMB
 </​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//).
  
-<​note>​ +Dacă dorim să generăm un fișier ​de ''​5MB'' ​plin cu date aleatoarevom folosi ​comanda<​code>​ 
-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 acelachiar dacă un utilitar mai complex are mai multe caracteristici;​ dacă acele caracteristici nu sunt utilenu are sens să-l folosiți. +student@uso-demo:~$ dd if=/​dev/​urandom of=random-5MB bs=1M count=5 
-</note>+5+0 records in 
 +5+0 records out 
 +5242880 bytes (5.2 MB) copied0.56655 s9.3 MB/s
  
-==== Folosire expresii regulate ​în sed ====+student@uso-demo:​~$ ls -lh random-5MB  
 +-rw-r--r-- 1 student student 5.0M Dec  5 18:11 random-5MB 
 +</​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//).
  
-Mai sus am folosit cu ''​awk'',​ ''​grep''​ și Python expresii regulateAdeseaîn linia de comandă veți folosi expresii regulate folosind ​comanda ​''​grep''​Dar și în alte situațiifie în linie de comandă, fie în scripting, fie în limbaje de programare, expresiile regulate sunt utile.+Putem folosi comanda ​''​dd''​ și pentru dispozitive fiziceDe exempludacă vrem să extragem sectorul 0 de pe un hard disc (adică primii 512 octeți) folosim ​comanda:<​code>​ 
 +student@uso-demo:​~$ sudo dd if=/dev/sda of=mbr count=1 
 +1+0 records in 
 +1+0 records out 
 +512 bytes (512 B) copied, 0.00355612 s144 kB/s
  
-Î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. +student@uso-demo:​~$ ​ls -lh mbr  
- +-rw-r--r-- 1 root root 512 Dec  5 18:13 mbr
-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>​ +
-student@uso-demo:​~/​curs-11-demosed '​s/​^[^\.]\+/​aaa/​g'​ < user-results.csv +
-aaa.asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 +
-aaa.matei,​Colegiul Național Ion Maiorescu,​2015-03-17 11:​04:​49,​66 +
-aaa.dascalu,​Colegiul Tehnic Toma Socolescu,​None,​285 +
-aaa.konnerth,​Colegiul Național Nichita Stănescu,​None,​42 +
-aaa.corneanu,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:26:21,247 +
-[...]+
 </​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 ​literă care nu conțin punct (''​.''​, //dot//). Adică exact pe prenumele din numele de cont.+Comanda ​''​dd'' ​citește din intrarea specială ''​/dev/sda'' ​date și le scrie în fișierul ''​random-5MB''​. Face acest lucru într-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.
  
-Dacă dorim să eliminăm prenumele ​(împreună cu punctuldin numele ​de cont vom folosi o construcție precum<​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-demosed '​s/​^[^\.]\+\.//​g'​ < user-results.csv +student@uso-demo:​~$ ​xxd mbr
-asimionesei,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 +
-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+
 [...] [...]
 +00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.
 </​code>​ </​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>​ +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>​ 
-student@uso-demo:​~/curs-11-demo$ sed 's/^\([^\.]\+\)\.\([^\,​]\+\),/​\2.\1,/​g'​ < user-results.csv +dd if=/dev/cdrom of=myimage.iso
-asimionesei.ionut,​Liceul Teoretic Ștefan Odobleja,​2015-03-31 16:​18:​01,​0 +
-matei.laura,​Colegiul Național Ion Maiorescu,​2015-03-17 11:​04:​49,​66 +
-dascalu.alin,​Colegiul Tehnic Toma Socolescu,​None,​285 +
-konnerth.dragos,​Colegiul Național Nichita Stănescu,​None,​42 +
-corneanu.alexandru,​Liceul Teoretic Benjamin Franklin,​2015-03-18 10:​26:​21,​247 +
-[...]+
 </​code>​ </​code>​
-Expresia regulată folosită mai sus (''​%%^\([^\.]\+\)\.\([^\,​]\+\),​%%''​) o decodificăm în următoarele componente:​ +Cu această comandă creăm fișierul ​''​myimage.iso'' ​ca fișier imagine al CD-ului aflat în unitatea ​de CD.
-  * ''​%%^%%'':​ î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 prenume, adică șirul format din cel puțin un caracter diferit ​de virgulă; reține acest șir într-o 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 ​warning
- +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>​ +
-La fel ca în cazul ''​awk''​''​sed'' ​este un utilitar adecvat pentru one linere, acțiuni rapide și încorporare în shell scripting. Pentru scenarii de utilizare mai complexe, recomandăm folosirea unor limbaje dedicate precum Python, Perl, Ruby, Java, JavaScript.+
 </​note>​ </​note>​
-==== Automatizare folosind shell scripting ​====+==== Crearea unei mașini virtuale în VirtualBox ​====
  
-Folosirea shell scripting ​și a one line-erelor are, de principiu3 scenarii de utilizare:​ +Pentru crarea unei mașini virtuale în VirtualBox folosim, de regulăinterfața grafică a VirtualBox. Pentru aceasta urmăm ca pași principali: 
-  * conectarea/​înlănțuirea mai multor comenzi pentru ​obține un rezultat nou pentru un caz punctual de utilizare +  * Crearea specificațiilor mașinii virtualememorie, hard disc, tip de sisteme de operare 
-  * automatizarea unei acțiuniacțiunile pot fi repetitive și atunci o implmentare poate fi rulată ​de mai multe ori +  * Alegerea unui mediu de boot, de obicei o imagine de CD bootabil în format ​''​.iso''​ 
-  * 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+  * Pornirea mașinii virtuale (bootarea acesteiași pornirea procesului de instalare
  
-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.+Acești pași sunt descriși în video-ul de tip screencast de mai jos, accesibil direct la adresa https://​youtu.be/​xFkkeVoOC_A.
  
-De exemplu, având în vedere conținutul subdirectorului ''​horde/'',​ vrem să creăm copii de lucru ale fișierelor de configurare de distribuțieFiș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''​).+<​html>​ 
 +<​center>​ 
 +<iframe width="​560"​ height="​315"​ src="​https:/​/www.youtube.com/​embed/​xFkkeVoOC_A"​ frameborder="​0"​ allowfullscreen>​ 
 +</​iframe>​ 
 +</​center>​ 
 +</​html>​
  
-Pentru a crea copie de lucru putem folosi următorul one liner, construit pas cu pas:<​code>​ +==== Afișarea ​de informații despre mașinile virtuale VirtualBox ====
-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 +<​note>​ 
-horde/​ingo/​config/​hooks.php.dist +Comenzile indicate mai jos pot fi rulate doar pe un sistem fizic (Linux sau Windowsîn cadrul căruia a fost instalat VirtualBox
-horde/ingo/​config/​prefs.php.dist +</note>
-[...]+
  
-student@uso-demo:​~/​curs-11-demo$ for f in $(find horde/ -name '*.dist'); do echo "​${f/​.dist/​}";​ done +Î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.
-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+De exemplu, pentru a afișa mașinile virtuale existente în VirtualBox, rulăm comanda<​code>​ 
 +razvan@einherjar:~$ vboxmanage list vms 
 +"​Windows-7" {2a9b2719-2c6c-42df-9f19-5febff6172bf} 
 +"Debian" ​{18565cc7-101d-4ac4-91b4-2ee317b7f9ae} 
 +"​Debian 32 bit" {562696b3-efb8-42e4-8a66-519a98aa5ac8} 
 +"​Xubuntu-14.04" {cd57aa75-82b0-4f07-8236-81517f2ee87d} 
 +"SSS - Debian 32bit" {fa9dd108-fe13-4d12-adcd-84e29bcc3232} 
 +"SSS - Windows 7 32bit" {4f27ec11-33a8-400d-a898-d252169ab52f} 
 +"​Training - Linux Kernel Dev" {3645e7b4-482e-4bd2-aa73-f29e8b15288f} 
 +"GSR Debian"​ {409a6ad1-3998-443b-9297-e46aa1d944e5} 
 +"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} 
 +"IOCLA Linux" {5ee0048a-6bd1-4dc6-bf1b-daffc1729066} 
 +"USO Linux" {845446cb-0210-4f3b-8df0-91cd1c67b5e2}
 </​code>​ </​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''​.+Comanda afișează mașinile virtuale existente în sistemul gazdă împreună cu un identificator unic al acestora (numit UUID -- //Universally Unique Identifier//​).
  
-Pentru verificare ​folosim comanda ​''​find''​ pentru a valida existența fișierelor de lucru:<​code>​ +Dacă vrem să afisăm doar mașinile virtuale care rulează, ​folosim comanda<​code>​ 
-student@uso-demo:~/curs-11-demo$ find horde/ ​-name '​*.php'​ +razvan@einherjar:​!$ vboxmanage list runningvms 
-horde/ingo/config/prefs.php +"USO Demo" {e04f00a6-7530-45d0-95e6-56ba46d6810a} 
-horde/ingo/config/backends.php+<​code>​ 
 + 
 +Dacă ne interesează să aflăm informații detaliate despre o mașină virtuală rulăm comanda<​code>​ 
 +razvan@einherjar:~$ vboxmanage showvminfo "USO Demo"​ 
 +Name:            USO Demo 
 +Groups: ​         ​/ 
 +Guest OS:        Debian (32-bit) 
 +UUID:            e04f00a6-7530-45d0-95e6-56ba46d6810a 
 +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>​
 +Comanda afișează o multitudine de informații despre mașina virtuală, practic tot ceea ce o definește.
  
-One liner-ul de mai sus este util 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. +<​note>​ 
- +Comanda ''​vboxmanage''​ are mulțime de subcomenzi care pot fi folosite pentru inspectarea ​și configurarea mașinilor virtuale. Putețfolosi comanda<​code>​ 
-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) șstudenților+vboxmanage ​--help 
-<file Bash publish-slides> +</​code>​ 
-#!/bin/bash+pentru ​a le parcurge pe toate, sau puteți consulta pagina ​de manual a comenzii<​code>​ 
 +man vboxmanage 
 +</​code>​ sau putețaccesa [[https://​www.virtualbox.org/​manual/​ch08.html|documentația VirtualBox]]
 +</note>
  
-dropbox_folder=~/​Downloads/​Dropbox/​school/​uso-shared +==== Sumar comenzi Linux legate de hardware ====
-remote_end=uso@elf.cs.pub.ro:​res/​current/​cursuri+
  
-if test $# -eq 1; then +Mai jos este un sumar al comenzilor Linux folosite pentru inspectarea componentelor harware ale sistemuluiSunt indicate comenzile pe tipuri de componente.
-    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 +^  Componentă hardware ​ ^  Comenzi pentru specificații ​ ^  Comenzi pentru monitorizare ​  ^ 
-    pushd curs-$id> /dev/null 2>&1 +^  Toate                   | ''​sudo lshw'' ​                     |  | 
-    make all +| :::                      | ''​sudo lshw -short'' ​                     | :::  | 
-    cp *.pdf "​$dropbox_folder"/​curs-$id/ +| :::                      | ''​sudo dmidecode'' ​                | :::  | 
-    scp *handout*.pdf "​$remote_end"/​curs-$id/ +| :::                      | ''​sudo hwinfo'' ​                | :::  | 
-    popd > /dev/null 2>&1 +| :::                      | ''​%%sudo hwinfo --short%%'' ​                | :::  | 
-done +| :::                      | ''​inxi'' ​                | :::  | 
-</file>+| :::                      | ''​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'' ​ | :::  |
  
-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.+*/
uso/cursuri/curs-10.1480785208.txt.gz · Last modified: 2016/12/03 19:13 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