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