Differences

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

Link to this comparison view

uso:laboratoare:new:01-fs [2018/10/03 11:45]
razvan.deaconescu [Pe scurt despre Git]
uso:laboratoare:new:01-fs [2019/09/22 23:59] (current)
vlad_mihai.corneci
Line 1: Line 1:
 ====== Laborator 01: Utilizarea sistemului de fișiere ====== ====== Laborator 01: Utilizarea sistemului de fișiere ======
  
-===== Înainte de laborator =====+{{page>:​uso:​laboratoare:​new:​01-fs:​setup&​nofooter&​noeditbutton}}
  
-==== Utilizare terminal ​====+===== Cuprins =====
  
-Pentru a deschide un terminal nou: +{{page>uso:​laboratoare:​new:01-fs:nav&​noheader&​nofooter&​noeditbutton}}
- +
-^ Scurtătură ​            ^ Descriere ​                                         ^ +
-| **''​Ctrl+Alt+t''​** ​  | pentru a deschide o nouă fereastră de terminal ​             | +
- +
-Puteți folosi următoarele scurtături în terminal: +
- +
-^ Scurtătură ​            ^ Descriere ​                                         ^ +
-| **''​Ctrl+Shift+t''​** ​  | pentru a deschide un nou tab                       | +
-| **''​Ctrl+PageDown''​** ​ | pentru a merge la tab-ul următor ​                  | +
-| **''​Ctrl+PageUp''​** ​   | pentru a merge la tab-ul precedent ​                | +
-| **''​Alt+<​index>''​** ​   | pentru a sări direct la un tab                     | +
-| **''​Ctrl+d''​** ​        | pentru a închide un tab (sau comanda **''​exit''​**) | +
- +
-Pentru a naviga (scrolling) în cadrul unui terminal, mai ales atunci când o comandă afișează mult text, folosiți următoarele scurtături:​ +
- +
-^ Scurtătură ​          ^ Descriere ​              ^ +
-| **''​Shift+PgDown''​** | pentru a derula în jos  | +
-| **''​Shift+PgUp''​** ​  | pentru a derula în sus  | +
- +
-Alte scurtături utile:  +
- +
-^ Scurtătură ​          ^ Descriere ​              ^ +
-| **''​Ctrl+Shift+c''​** | copiere text din terminal ​ | +
-| **''​Ctrl+Shift+v''​** | lipire text în terminal | +
-| **''​Shift+Insert''​** | lipire text în terminal | +
- +
-==== Navigarea în paginile de manual ==== +
- +
-Cea mai importantă formă de documentație în Linux, atunci când nu avem acces la Internet, o reprezintă paginile de manual, accesibile cu ajutorul comenzii ''​**man**''​.  +
- +
-De exemplu, pentru a afișa informații despre comanda ''​echo''​ (comandă ce afișează un mesaj la ieșirea standard), vom folosi comanda: +
-<​code>​ +
-student@uso:​~$ man echo +
-</​code>​ +
- +
-Paginile de manual sunt adesea de mari dimensiuni și avem nevoie să le parcurgem rapid (să navigăm prin ele). Pentru aceasta, după ce deschidem pagina de manual a unei comenzi, putem folosi combinațiile de taste de mai jos pentru a naviga în pagină: +
- +
-^ Tastă ​                                 ^ Scurtă descriere ​                                         ^ +
-| /​string_to_search ​                     | ''/''​ (adică tasta //slash//) e folosită pentru a căuta **''​string_to_search''​** în pagina de manual | +
-| **''​n''​** (next) ​                      | pentru a merge la următoarea apariție a cuvântului căutat cu / | +
-| **''​N''​** (Shift + n)                  | pentru a merge la precedenta apariție a cuvântului ​            | +
-| **''​q''​** (quit) ​                      | pentru a închide pagina de manual ​                             | +
-| **''​Enter''​** ​                         | pentru a derula în jos o linie                            | +
-| **''​f''​** (forward) sau **''​Space''​** ​ | pentru a derula în jos un ecran                           | +
-| **''​b''​** (backward) ​                  | pentru a derula în sus un ecran                           | +
-| **''​d''​** (down) ​                      | pentru a derula în jos jumătate de ecran                  | +
-| **''​u''​** (up)                         | pentru a derula în sus jumătate de ecran                  | +
- +
-/* +
- +
-==== Suport laborator ==== +
- +
- +
-Pentru a obține informații detaliate despre noțiunile și tehnicile din acest laborator, recomandăm să consultați următoarele secțiuni din cartea de suport a cursului USO: +
- +
-  * [[http://​books.google.ro/​books?​id=_JFGzyRxQGcC&​lpg=PA532&​pg=PA58&​redir_esc=y#​v=onepage&​q&​f=false|3.2. Gestiunea pachetelor]] +
-  * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​lpg=PA532&​pg=PA74#​v=onepage&​q&​f=false|4.2. Tipuri de fișiere]] +
-  * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​lpg=PA532&​pg=PA76#​v=onepage&​q&​f=false|4.3. Operații uzuale asupra fișierelor și directoarelor]] +
- +
-*/ +
- +
-==== Obiective ==== +
- +
-  * Familiarizarea cu linia de comandă în Linux +
-  * Familiarizarea cu comenzi simple în ''​Bash''​ (terminalul din Linux) +
-  * Utilizarea comenzilor pentru operațiuni similare realizate până acum din interfața grafică +
-  * Înțelegerea diferenței dintre căi relative și căi absolute +
-  * Acomodarea lucrului cu arhive în linia de comandă +
- +
-==== Pe scurt despre Git ==== +
- +
-Pe parcursul laboratoarelor,​ pentru descărcarea fișierelor necesare laboratorului,​ vom folosi Git. Git este un sistem de controlul versiunii și e folosit pentru versionarea codului în proiectele software mari. Celor interesați să aprofundeze conceptele din spatele comenzii ''​git'',​ precum și utilizări avansate, le recomandăm cursul practic online de pe [[http://​gitimmersion.com/​|gitimmersion]]. +
- +
-Informațiile despre laboratorul de USO se găsesc în [[https://​github.com/​systems-cs-pub-ro/​uso|acest repository Git]]. +
- +
-În laboratorul curent, pe sistemul fizic, aveți deja clonat repository-ul Git în directorul ''​~/​uso.git/''​. Vom preciza acest lucru pe parcursul laboratorului. +
- +
-<note important>​ +
-Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal deschis pe sistemul fizic. Deschideți un terminal folosind combinația de taste ''​Ctrl+Alt+t''​. În listarea de mai jos ''​student@uso:​~$''​ este promptul unde introduceți comenzile, pe acela nu-l tastați. Recomandăm să **nu** folosiți //​copy-paste//​ ca să vă acomodați cu linia de comandă: +
-<​code>​ +
-student@uso:​~$ cd uso.git/ +
-student@uso:​~/​uso.git$ git rm --cached -r . +
-student@uso:​~/​uso.git$ git reset --hard +
-student@uso:​~/​uso.git$ git clean -f -d +
-student@uso:​~/​uso.git$ git fetch origin +
-student@uso:​~/​uso.git$ git checkout -b lab-01-fs +
-student@uso:​~/​uso.git$ git rebase origin/​lab-01-fs +
-</​code>​ +
- +
-Dacă la a cincea comandă rulată (''​git checkout -b lab-01-fs''​) primiți o eroare de forma ''​fatal:​ A branch named '​lab-01-fs'​ already exists.'',​ nu vă îngrijorați,​ nu e nici o problemă. +
-</​note>​ +
- +
-Cam atât cu pregătirea laboratorului. Acum haideți să ne apucăm de treabă! :-) +
- +
-===== Concepte ===== +
- +
-==== Prezentare generală ==== +
- +
-Orice calculator are nevoie să stocheze date de diferite tipuri undeva, de exemplu pe un hard drive (HDD), un stick de memorie USB, etc. +
-Aceste date sunt organizate sub formă de fișiere, directoare și legături (link-uri).  +
- +
-Un director este de fapt tot un fișier ce conține adresele altor fișiere. În Linux, totul este reprezentat ca un fișier sau un director: hard-drive-ul,​ display-ul, keyboard-ul,​ etc. +
- +
-Link-urile sunt legături între două puncte ale sistemului de fișiere. În general le folosim când vrem să ne ușurăm accesul la un fișier sau director, sau pentru a uniformiza accesul. +
- +
-Sistemul de fișiere este folosit pentru a organiza ierarhic toate datele stocate pe un sistem. +
- +
-În Linux, acesta are următoarea structură arborescentă,​ ce poate fi vizualizată folosind comanda ''​tree'':​ +
- +
-{{ :uso-ac:​laboratoare:​fs-tree.png?​600 |}} +
- +
-Un director poate conține mai multe fișiere și directoare, iar directoarele la rândul lor pot conține alte fișiere și directoare. +
- +
-În Linux, întreaga structură de directoare pornește din directorul root reprezentat de un singur slash ''/''​. +
-Directorul root conține numeroase alte directoare ce stochează diferite tipuri de informații: +
-  * ''/​bin''​ conține fișiere executabile,​ utilitare fundamentale cum ar fi ''​cp'',​ ''​ls''​ +
-  * ''/​boot''​ conține toate fișierele necesare pentru bootarea cu succes a sistemului +
-  * ''/​etc''​ conține fișiere de configurare +
-  * ''/​root''​ este directorul home al utilizatorului privilegiat ''​root''​ +
-  * ''/​home''​ conține directoarele ''​home''​ pentru toți utilizatorii din sistem +
- +
-În directorul ''​home''​ al unui utilizator se găsesc fișiere personale, ce nu pot fi accesate de alți utilizatori. +
- +
-<note important>​ +
-A nu se confunda root-ul sistemului de fișiere și utlizatorul ''​root''​. +
-</​note>​ +
- +
-==== Stocarea datelor ==== +
- +
-După cum am spus la începutul laboratorului,​ datele sunt stocate pe un disk (hard-disk, SSD, CD-ROM). +
-În Linux, există numeroase formate de stocare a datelor, numite și tipuri de sisteme de fișiere: ''​ext4'',​ ''​ext3'',​ ''​ext2'',​ ''​ZFS'',​ ''​XFS''​. Acestea specifică modul în care datele sunt stocate și ulterior accesate de pe disk. Forma cea mai comună de stocare a datelor este ''​ext4''​. +
- +
-Ca o comparație între Windows și Linux, după cum știm Windows are disk-uri ''​A'',​ ''​B'',​ ''​C'',​ ''​D'',​ etc., în Linux trebuie ca disk-ul să fie legat la sistemul de fișiere într-un director ales. +
-Această operație se numește montare și se realizează folosind comanda ''​mount''​. Folosită fără niciun argument, ne va spune ce sisteme de fișiere sunt montate și în ce directoare sunt montate. +
- +
- +
-==== Căi absolute/​relative ==== +
- +
-Pentru accesarea unui fișier sau director sunt posibile două moduri, în funcție de directorul curent: +
-  * căi absolute: pornesc din directorul root +
-  * căi relative: pornesc din directorul curent +
- +
-Directorul curent este directorul în care utilizatorul se află la momentul actual. Directorul curent se afișează la apelul comanzii ''​pwd''​ (print working directory). +
-Pentru schimbarea directorului curent se folosește comanda ''​cd''​ (change director), urmată de numele directorului în care dorim să ajungem. +
- +
-Să luăm ca exemplu următoarea structură de fișiere și directoare din laboratorul introductiv:​ +
- +
-<code bash> +
-$ cd ~/​uso.git/​labs +
-$ tree +
-+
-├── 00-intro +
-│   ​├── support +
-│   ​└── wiki +
-│       ​├── basics.wiki +
-│       ​├── concepts.wiki +
-│       ​├── demo.wiki +
-│       ​├── get-a-life.wiki +
-│       ​├── need-to-know.wiki +
-│       ​├── nice-to-know.wiki +
-│       ​└── recap.wiki +
-├── ​01-fs +
-│   ​├── support +
-... +
-</​code>​ +
- +
-Dacă dorim să afișăm fișierul ''​concepts.wiki''​ folosind o cale absolută vom folosi comanda ''​ls'',​ astfel: +
-<code bash> +
-$ ls /​home/​student/​uso.git/​labs/​00-intro/​wiki/​concepts.wiki  +
-</​code>​ +
- +
-Dacă ne aflăm curent în directorul ''​labs'',​ putem să folosim o cale relativă:​ +
-<code bash> +
-$ ls ./​00-intro/​wiki/​concepts.wiki +
-</​code>​ +
- +
-Sau și mai simplu: +
- +
-<code bash> +
-$ ls 00-intro/​wiki/​concepts.wiki +
-</​code>​ +
- +
-<note important>​ +
-Caracterul ''​.''​ specifică directorul curent. Acesta poate fi omis, după cum se vede în exemplul anterior. +
-</​note>​ +
- +
-Dacă ne aflăm în directorul ''​lab-01'',​ putem să folosim de asemena o cale relativă, astfel: +
-<code bash> +
-$ ls ../​00-intro/​wiki/​concepts.wiki +
-</​code>​ +
- +
-<note important>​ +
-Caracterul ''​..''​ specifică directorul părinte directorului curent. +
-</​note>​ +
- +
-<note important>​ +
-Căile absolute se pot folosi indiferent de directorul curent în care se află utilizatorul. Căile relative depind de directorul curent. +
-</​note>​ +
- +
- +
-==== Utilizatori și pemisiuni ==== +
- +
-În Linux există două tipuri de utlizatori:​ +
-  * neprivilegiați - nu pot modifica starea sistemului, nu pot realiza modificări ce afectează alți utilizatori +
-  * privilegiați - au acces total asupra sistemului, de exemplu utilizatorul ''​root''​ +
- +
-Utilizatorul ''​root''​ este prezent, în general, pe orice sistem Linux, rolul său fiind de administrare și gestionare a celorlalți utilizatori. +
- +
-<note warning>​ +
-Nu este recomandat să folosiți sistemul cu acest utilizator decât pentru strictul necesar. De multe ori este suficientă utilizarea comenzii ''​sudo'',​ care permite unui alt utilizator să execute comenzi ca un superuser (utilizator privilegiat). +
-</​note>​ +
- +
-Diferența dintre utilizatorii neprivilegiați și utilizatorii privilegiați este dată de drepturile pe care aceștia le au. +
-Linux folosește permisiuni pentru a dicta ce operații poate să efectueze un utilizator asupra unui fișier sau director. +
- +
-Permisiunile pot fi aplicate pe trei categorii:​ +
-  * utilizator (owner): utilizatorul care este deținătorul fișierului/​directorului +
-  * grup (group): un grup de utilizatori care sunt deținătorii fișierului/​directorului +
-  * ceilalți (others): utilizatorii care nu intră în niciuna dintre categoriile anterioare +
- +
-Pentru fiecare dintre cele trei categorii există trei permisiuni:​ +
-  * de citire: utilizatorul poate citi conținutul fișierului,​ respectiv poate lista conținutul directorului +
-  * de scriere: utilizatorul poate modifica conținutul fișierului/​directorului +
-  * de execuție: utilizatorul poate lansa fișierul în execuție respectiv poate parcurge directorul +
- +
-Ordinea în care se aplică aceste permisiuni este: +
-  - dacă utilizatorul este deținătorul fișierului,​ atunci se aplică permisiunile pentru owner +
-  - dacă face parte din grupul deținător,​ atunci se aplică permisiunile pentru group +
-  - dacă niciuna dintre condițiile precedente nu este adevărată,​ atunci se aplică permisiunile pentru others +
-===== Demo ===== +
- +
-Pentru început, vrem să ne acomodăm cu cele mai importante comenzi din linia de comandă, în special cele care lucrează cu fișiere și directoare. Îndrumați de asistent, vom descoperi împreună cum putem folosi linia de comandă pentru a lucra cu sistemul de fișiere și pentru a face acțiuni mai rapid ca în interfața grafică. +
- +
-<note tip> +
-Avem și un [[uso:​resurse:​cheatsheet|cheatsheet]] pe care îl putem folosi ca să ne reamintim cele mai frecvente comenzi. +
-</​note>​ +
- +
-Să începem! +
-==== 0. Autentificare cu utilizatorul root ==== +
-Ne propunem să schimbăm utilizatorul curent cu utilizatorul root. +
-Una din metodele existente constă în folosirea comenzii su (abreviere de la en. switch user). +
- +
-<code bash> +
- +
-student@uso:​~$ sudo su +
-[sudo] password for student: +
-root@uso:/​home/​student#​ +
- +
-</​code>​ +
- +
-<​note>​ +
- +
-Comanda a avut ca rezultat, pe lângă autentificarea ca utilizatorul root, schimbarea prompt-ului. +
-Astfel, ''​$''​ a devenit ''#''​ ceea ce ne indică faptul că în acest moment suntem autentificați ca root. +
- +
-</​note>​ +
- +
-==== 1. Navigare în sistemul de fișiere ==== +
- +
-Deschideți un terminal. +
- +
-Ne propunem să lucrăm cu acele comenzi care ne ajută să parcurgem directoarele din sistemul de fișiere (adică să-l traversăm). Apoi să folosim comenzile pentru listarea conținutului unui director și pentru afișarea conținutului unui fișier. +
- +
-Foarte importantă este distincția între o cale absolută (o cale către un director care pornește din directorul rădăcină,​ exemplu: ''/​home/​student''​) și o cale relativă la directorul curent (folosind intrările speciale ''​.''​ - directorul curent și ''​..''​ - directorul părinte). +
- +
-Urmăriți cu atenție secvența de comenzi de mai jos. Dacă vreți să dați și voi comenzile pe stația la care lucrați, __folosiți cât mai des tasta ''​**TAB**''​__ atunci când dați un parametru comenzii ''​ls''​ sau ''​cd''​. +
- +
-<code bash> +
-student@uso:​~$ pwd +
-/​home/​student +
-student@uso:​~$ ls +
-Desktop ​ Documents ​ Downloads ​ Music  Pictures ​ Public ​ Templates ​ Videos ​ examples.desktop ​ uso.git ​ vm-actions-log.txt +
-student@uso:​~$ cd uso.git/​labs/​01-fs/​support/​demo/​ +
-student@uso:​~/​.../​01-fs/​support/​demo$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​demo +
-student@uso:​~/​.../​01-fs/​support/​demo$ tree +
-+
-├── empty_directory +
-├── movies +
-│   ├── movie0.mkv +
-│   ├── movie0.srt +
-│   ├── movie1.mkv +
-│   ├── movie1.srt +
-│   ├── movie2.mkv +
-│   ├── movie2.srt +
-│   ├── movie3.mkv +
-│   ├── movie3.srt +
-│   ├── movie4.mkv +
-│   └── movie4.srt +
-└── music +
-    ├── ac_dc +
-    │   ├── angus +
-    │   ├── bon +
-    │   ├── brian +
-    │   ├── chris +
-    │   ├── cliff +
-    │   ├── dave +
-    │   ├── george +
-    │   ├── malcom +
-    │   ├── mark +
-    │   └── phil +
-    ├── cargo +
-    └── hammerfall +
-        ├── anders +
-        ├── jesper +
-        ├── joacim +
-        ├── magnus +
-        ├── oscar +
-        ├── pontus +
-        └── stefan +
- +
-6 directories,​ 27 files +
- +
-</​code>​ +
- +
-Acum că am văzut structura directoarelor,​ haideți să navigăm prin ele: +
- +
-<code bash> +
- +
-student@uso:​~/​.../​01-fs/​support/​demo$ cd music   # aici am folosit o cale relativă la directorul curent +
-student@uso:​~/​.../​support/​demo/​music$ ls +
-ac_dc  cargo  hammerfall +
-student@uso:​~/​.../​support/​demo/​music$ cd ac_dc   # aici am folosit o cale relativă la directorul curent +
-student@uso:​~/​.../​demo/​music/​ac_dc$ ls +
-angus  bon  brian  chris  cliff  dave  george ​ malcom ​ mark  phil +
-student@uso:​~/​.../​demo/​music/​ac_dc$ cd .. # Am navigat în directorul părinte directorului ac_dc, care este /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music +
-student@uso:​~/​.../​support/​demo/​music$ ls -R +
-.: +
-ac_dc  cargo  hammerfall +
- +
-./ac_dc: +
-angus  bon  brian  chris  cliff  dave  george ​ malcom ​ mark  phil +
- +
-./cargo: +
- +
-./​hammerfall:​ +
-anders ​ jesper ​ joacim ​ magnus ​ oscar  pontus ​ stefan +
- +
-student@uso:​~/​.../​support/​demo/​music$ cd /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​hammerfall ​ # am fi putut folosi și cd hammerfall, dar am folosit cale absolută +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls +
-anders ​ jesper ​ joacim ​ magnus ​ oscar  pontus ​ stefan +
-</​code>​ +
- +
-Lui ls îi putem da argument atât o cale relativă către un director sau un fișier, cât și o cale absolută:​ +
- +
-<code bash> +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls ../ac_dc/ +
-angus  bon  brian  chris  cliff  dave  george ​ malcom ​ mark  phil +
- +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls -l ../​ac_dc/​brian +
--rw-r--r-- 1 student student 0 aug 22 18:32 ../​ac_dc/​brian +
- +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls -l anders +
--rw-r--r-- 1 student student 0 aug 22 18:43 anders +
- +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls -l /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​hammerfall/​oscar +
--rw-r--r-- 1 student student 0 aug 22 18:32 /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​hammerfall/​oscar +
-</​code>​ +
- +
-<note important>​ Mare atenție la căile relative vs. cele absolute. O cale relativă este o cale raportată la directorul curent, în timp ce o cale absolută este raportată la directorul rădăcină (''/''​). O cale relativă începe, de obicei, cu un nume, cu ''​.''​ sau cu ''​..'',​ în timp ce o cale absolută începe întotdeauna cu ''/''​. De reținut faptul că și ''​~/​uso''​ este tot o cale absolută, chiar dacă începe cu caracterul ''​~'',​ acest lucru fiind datorat faptului că ''​~''​ este doar un alias către directorul ''​home''​ al utilizatorului curent (''/​home/​student''​).</​note>​ +
- +
-Cum am văzut și mai sus, exemple de folosire a căilor relative sunt: +
-<note tip>​Țineți cont de folosirea tastei **''​TAB''​**.</​note>​ +
- +
-<code bash> +
-student@uso:​~/​.../​support/​demo/​music$ ls hammerfall/ ​       # ls h<​TAB>​ +
-student@uso:​~/​.../​support/​demo/​music$ ls -l . +
-student@uso:​~/​.../​support/​demo/​music$ cd ac_dc/ ​            # cd ./​a<​TAB>​ +
-student@uso:​~/​.../​demo/​music/​ac_dc$ ls ../​hammerfall/ ​      # ls ../​h<​TAB>​ +
-</​code>​ +
- +
-Câteva exemple de utilizare a căilor absolute: +
-<code bash> +
-student@uso:​~/​.../​demo$ ls / +
-student@uso:​~/​.../​demo$ tree /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​hammerfall +
-student@uso:​~/​.../​demo$ tree -L 1 ~ +
-</​code>​ +
- +
-Acum să vedem câteva erori care pot să apară. Ce credeți că se întâmplă mai jos? Care este cauza erorii apărute, ce greșeală a fost făcută? +
- +
-<code bash> +
-student@uso:​~/​.../​demo/​music/​hammerfall$ ls brian +
-ls: cannot access '​brian':​ No such file or directory +
- +
-student@uso:​~/​.../​demo/​music/​hammerfall$ cd /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​scorpions +
-bash: cd: /​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​music/​scorpions:​ No such file or directory +
-</​code>​ +
- +
-<note important>​ +
-Citiți cu atenție mesajele erorilor din Bash ori de câte ori o comandă nu funcționează. Oferă suficiente indicii despre rădăcina erorii. +
-</​note>​ +
- +
-<note important>​În general, orice comandă ''​cd''​ ar trebui urmată de una ''​ls''​ sau ''​pwd''​ în scop de verificare. Cum am văzut mai sus, uneori pot apărea erori, fie directorul nu există, fie nu avem permisiuni să îl accesăm, iar comanda se poate executa fără succes, prin urmare este **foarte important** ca orice comandă de modificare/​alterare a stării curente să fie urmată de una de verificare. Câteva exemple de comenzi care fac pereche bună sunt: ''​cd''​ -- ''​pwd'';​ ''​touch'',​ ''​mv'',​ ''​rm''​ -- ''​ls'';​ ''​echo''​ -- ''​cat''​ etc. +
-</​note>​ +
- +
-<note important>​ +
-Folosiți tasta ''​TAB''​ ori de câte ori puteți. De multe ori e suficient să tastăm doar primele 2-3 litere din numele directorului sau fișierului pe care vrem să-l accesăm. Dacă există două sau mai multe directoare/​fișiere care au același prefix, putem fie adăuga mai multe litere pentru a elimina ambiguitatea,​ fie tasta de două ori ''​TAB''​ pentru a afișa lista de hituri cu același prefix. Putem itera apoi prin lista de potriviri folosind tot tasta ''​TAB''​. +
-</​note>​ +
- +
-Urmăriți exemplele de mai jos. +
- +
- +
-==== 2. Utilizarea scurtăturilor ==== +
- +
-Ne propunem să navigăm rapid în directorul home al utilizatorului cu care suntem logați, indiferend de calea în care ne aflăm în momentul curent. +
- +
-Rețineți că simbolul ~ (numit tilda) este o prescurtare pentru directorul home al utilizatorului. +
-Putem folosi acest simbol împreună cu comanda ''​cd''​ pentru a duce acest exercițiu la bun sfârșit. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ cd ~ +
-student@uso:​~$ pwd +
-/​home/​student +
- +
-</​code>​ +
- +
-Un alt simbol bine de reținut - este o prescurtare pentru directorul anterior accesat. +
- +
-<code bash> +
- +
-student@uso:​~$ cd - +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​movies +
-student@uso:​~/​.../​support/​demo/​movies$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​demo/​movies +
- +
-</​code>​ +
- +
-==== 3. Listarea conținutului unui director recursiv ==== +
- +
-Ca să putem lista recursiv conținutul unui director, putem folosi unul dintre +
-utilitarele ''​tree''​ sau ''​ls''​ (cu opțiunea ''​-R''​). +
- +
-Vom folosi utilitarul ''​tree''​. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​01-fs/​support/​demo$ tree +
-+
-├── empty_directory +
-├── movies +
-│   ├── movie0.mkv +
-│   ├── movie0.srt +
-│   ├── movie1.mkv +
-│   ├── movie1.srt +
-│   ├── movie2.mkv +
-│   ├── movie2.srt +
-│   ├── movie3.mkv +
-│   ├── movie3.srt +
-│   ├── movie4.mkv +
-│   └── movie4.srt +
-└── music +
-    ├── ac_dc +
-    │   ├── angus +
-    │   ├── bon +
-    │   ├── brian +
-    │   ├── chris +
-    │   ├── cliff +
-    │   ├── dave +
-    │   ├── george +
-    │   ├── malcom +
-    │   ├── mark +
-    │   └── phil +
-    ├── cargo +
-    └── hammerfall +
-        ├── anders +
-        ├── jesper +
-        ├── joacim +
-        ├── magnus +
-        ├── oscar +
-        ├── pontus +
-        └── stefan +
- +
-6 directories,​ 27 files +
- +
-</​code>​ +
- +
-Putem limita adâncimea maximă pentru parcurgerea ierarhiei de fișiere folosind +
-opțiunea ''​-L <​număr>'':​ +
- +
-<code bash> +
- +
-student@uso:​~/​.../​01-fs/​support/​demo$ tree -L 1 +
-+
-├── empty_directory +
-└── movies +
- +
-2 directories,​ 0 files +
- +
-</​code>​ +
- +
-O altă opțiune pentru utilitarul ''​tree''​ este ''​-a''​. Folosind acest flag +
-sunt afișate și fișierele ascunse (fișierele care au în componența numelui pe +
-pe prima poziție caracterul ''​.''​). +
- +
-<code bash> +
- +
-student@uso:​~/​.../​01-fs/​support/​demo$ tree -a empty_directory/​ +
-empty_directory/​ +
-└── .not_really +
- +
-0 directories,​ 1 file +
- +
-</​code>​ +
- +
-==== 4. Crearea unei ierarhii de fișiere și directoare ==== +
- +
-Crearea unei ierarhii de directoare poate părea anevoioasă. Până acum cunoaștem +
-comenzile ''​mkdir''​ și ''​cd''​. +
- +
-Opțiunea ''​-p''​ a comenzii ''​mkdir''​ reduce semnificativ efortul pentru a crea +
-o ierarhie de directoare:​ +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ mkdir -p a/​long/​chain/​of/​directories +
-student@uso:​~/​.../​support/​demo/​movies$ tree +
-+
-├── a +
-│   └── long +
-│   ​    ​└── chain +
-│   ​        ​└── of +
-│   ​            ​└── directories +
-├── movie0.mkv +
-├── movie0.srt +
-├── movie1.mkv +
-├── movie1.srt +
-├── movie2.mkv +
-├── movie2.srt +
-├── movie3.mkv +
-├── movie3.srt +
-├── movie4.mkv +
-└── movie4.srt +
- +
-5 directories,​ 10 files +
- +
- +
-</​code>​ +
- +
- +
-==== 5. Editarea unui fișier folosind vim ==== +
- +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ vim movie0.srt +
- +
-</​code>​ +
- +
-Pentru a insera caractere în fisierul pe care l-am deschis trebuie să intrăm +
-în modul de inserare. Pentru a intra în modul de inserare se folosește tasta +
-''​i''​. +
- +
-După ce am terminat de inserat caractere, ieșim dim modul de editare prin +
-apăsarea tastei ''​esc''​. +
- +
-Pentru a ieși din fișier și pentru a salva introducem comanda '':​wq''​ +
-(: începe comanda nouă, w - write, q - quit). +
- +
-Inspectăm conținutul curent al fișierului editat folosind comanda ''​cat''​. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ cat movie0.srt +
-Prima linie din subtitrare +
- +
-</​code>​ +
- +
-<​note>​ +
- +
-''​Vim''​ este un editor text foarte complex, care a trecut cu brio testul timpului. +
-Un punct de plecare pentru a stăpâni acest editor poate îl reprezintă +
-urmărirea tutorialelor puse la dispoziție de utilitarul ''​vimtutor''​. +
- +
-</​note>​ +
- +
- +
-==== 6. Copierea, mutarea și ștergerea din ierarhia de fișiere ==== +
- +
-Dorim să efectuăm o serie de operații (ex. copiere, mutare și ștergere) asupra +
-unei ierarhii întregi de fișiere. O să folosim ierarhia de directoare pe +
-care am creat-o în secțiunea 6. +
- +
-Pentru început o sa copiem toată ierarhia din directorul movies în directorul +
-părinte al acestuia. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ cp -r a ../ +
-student@uso:​~/​.../​support/​demo/​movies$ tree ../a  # am folosit o cale relativă +
-../a +
-└── long +
-    └── chain +
-        └── of +
-            └── directories +
- +
-4 directories,​ 0 files +
-student@uso:​~/​.../​support/​demo/​movies$ tree a +
-+
-└── long +
-    └── chain +
-        └── of +
-            └── directories +
- +
-4 directories,​ 0 files +
- +
-</​code>​ +
- +
-În acest moment avem aceeași ierarhie în două locuri. Dorim să ștergem ierarhia +
-din directorul ''​movies''​. +
- +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ rm -r a/ +
-student@uso:​~/​.../​support/​demo/​movies$ ls +
-movie0.mkv ​ movie1.mkv ​ movie2.mkv ​ movie3.mkv ​ movie4.mkv +
-movie0.srt ​ movie1.srt ​ movie2.srt ​ movie3.srt ​ movie4.srt +
- +
-</​code>​ +
- +
-Am folosit comanda ''​rm''​ cu opțiunea ''​-r''​ (en. recursive) pentru a șterge întreaga ierarhie. +
-Pentru mai multe opțiune a comenzii ''​rm''​ consultați maginile de manual (''​man rm''​). +
- +
- +
-A rămas o singură operație de testat și anume mutarea. Vom folosi comanda +
-''​mv''​. +
-Vom muta directorul pe care l-am copiat mai devreme în directorul ''​Desktop''​ +
-al utilizatorului curent. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ cd .. +
-student@uso:​~/​.../​01-fs/​support/​demo$ mv a ~/Desktop +
-student@uso:​~/​.../​01-fs/​support/​demo$ tree ~/Desktop +
-/​home/​student/​Desktop +
-└── a +
-    └── long +
-        └── chain +
-            └── of +
-                └── directories +
- +
-5 directories,​ 0 files +
- +
-</​code>​ +
- +
-Observăm că directorul pe care l-am mutat nu se mai află în directorul +
-''​demo''​. +
- +
-<code bash> +
- +
-student@uso:​~/​.../​01-fs/​support/​demo$ ls +
-empty_directory ​ movies ​ music +
- +
-</​code>​ +
- +
- +
-==== 7. Wildcards ==== +
- +
-Ne propunem să mutăm toate subtitrările din directorul ''​movies''​ într-un director +
-separat. +
- +
- +
-<code bash> +
- +
-student@uso:​~/​demo$ ls -l +
-total 0 +
--rw-r--r-- 1 student student 0 aug 22 10:56 movie0.mkv +
--rw-r--r-- 1 student student 0 aug 22 10:56 movie0.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie1.mkv +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie1.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie2.mkv +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie2.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie3.mkv +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie3.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie4.mkv +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie4.srt +
- +
-</​code>​ +
- +
-Mai întâi trebuie să creăm un director destinație (sau să folosim unul existent). +
- +
-<code bash> +
- +
-student@uso:​~/​.../​support/​demo/​movies$ mkdir subs +
-student@uso:​~/​.../​support/​demo/​movies$ ls +
-movie0.mkv ​ movie1.mkv ​ movie2.mkv ​ movie3.mkv ​ movie4.mkv ​ subs +
-movie0.srt ​ movie1.srt ​ movie2.srt ​ movie3.srt ​ movie4.srt +
- +
-</​code>​ +
- +
-Pentru a muta ''​toate''​ fișierele ce reprezintă o subtitrare (fișierele care au +
-în nume extensia ''​.srt''​) putem folosi un wildcard: +
- +
- +
-<code bash> +
- +
-student@uso:​~/​demo$ mv *.srt subs/ +
-student@uso:​~/​demo$ ls -l +
-total 4 +
--rw-r--r-- 1 student student ​   0 aug 22 10:56 movie0.mkv +
--rw-r--r-- 1 student student ​   0 aug 22 10:52 movie1.mkv +
--rw-r--r-- 1 student student ​   0 aug 22 10:52 movie2.mkv +
--rw-r--r-- 1 student student ​   0 aug 22 10:52 movie3.mkv +
--rw-r--r-- 1 student student ​   0 aug 22 10:52 movie4.mkv +
-drwxr-xr-x 2 student student 4096 aug 22 10:59 subs +
-student@uso:​~/​demo$ cd subs +
-student@uso:​~/​demo/​subs$ ls -l +
-total 0 +
--rw-r--r-- 1 student student 0 aug 22 10:56 movie0.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie1.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie2.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie3.srt +
--rw-r--r-- 1 student student 0 aug 22 10:52 movie4.srt +
- +
-</​code>​ +
- +
-===== Recapitulare ===== +
- +
-==== 1. Navigare și scurtături în mediul Linux ==== +
- +
-Așa cum am discutat în laboratorul trecut, în mediul Linux folosim adesea linia de comandă și scurtături de taste pentru a naviga în/între aplicații. +
- +
-Pentru a deschide o aplicație grafică în Linux putem folosi butoanele și meniurile puse la dispoziție de mediul grafic sau putem folosi combinația de taste ''​Alt+F2''​. Cu această combinație de taste se deschide un prompt în care tastăm numele aplicației pe care o vrem deschisă. +
- +
-Apăsați combinația de taste ''​Alt+F2''​ și apoi tastați la prompt șirul ''​gedit''​ și apoi apăsați tasta ''​Enter''​. Vi se deschide editorul ''​gedit''​ cu care puteți crea și modifica fișiere. Puteți închide fereastra aplicației grafice folosind combinația de taste ''​Alt+F4''​. +
- +
-<​note>​ +
-Combinația de taste ''​Alt+F2''​ este similară combinației de taste ''​Windows+r''​ din Windows sau ''​Command+Space''​ din macOS. +
-</​note>​ +
- +
-**[1a]** Porniți în mod similar browser-ul web ''​Firefox''​ tastând la prompt șirul ''​firefox''​. +
- +
-În anumite aplicații grafice precum browserele, putem deschide tab-uri (subferestre). Pentru aceasta, folosiți în ''​Firefox''​ combinația de taste ''​Ctrl+t''​. Pentru a închide un tab de browser folosiți combinația de taste ''​Ctrl+w''​. Atunci când aveți deschise mai multe tab-uri navigați între ele, respectiv, cu ''​Alt+1'',​ ''​Alt+2'',​ ''​Alt+3''​ etc. Pentru a accesa din taste bara de adrese unde să tastați adresa unui site, folosiți combinația de taste ''​Ctrl+l''​. +
- +
-**[1b]** Deschideți 3 tab-uri în ''​Firefox''​ cu care accesați trei site-uri diferite la alegere. Apoi închideți primul și al treilea tab. Apoi închideți toată aplicația. +
- +
-**[1c]** Deschideți o aplicație de tip terminal. Șirul de tastat la prompt este ''​gnome-terminal''​. Apoi deschideți **încă** 2 tab-uri noi (pentru un total de 3) în terminal și navigați între ele. Apoi închideți-le pe rând. +
- +
-<note tip> +
-Pentru dechidere de tab-uri noi, folosiți combinația de taste ''​Ctrl+Shift+t''​. Pentru navigare, folosiți aceleași opțiuni ca în cazul ''​Firefox''​. Pentru închiderea unui terminal folosiți combinația de taste ''​Ctrl+d''​. +
-</​note>​ +
- +
-**[1d]** Deschideți ''​Firefox''​ cu 3 tab-uri într-un workspace. Deschideți un terminal cu 3 tab-uri în alt workspace. Deschideți o aplicație ''​gedit''​ cu tab-uri în alt workspace. Apoi navigați între workspace-uri. Apoi aduceți aplicația terminal și aplicația ''​gedit''​ în același workspace cu ''​Firefox''​. +
- +
-Atunci când folosim terminalul, dorim adesea să căutăm comenzi pe care le-am folosit anterior. Pentru aceasta, în terminal, folosim combinația de taste ''​Ctrl+r''​. În acel moment se schimbă prompt-ul și se cere introducerea unui șir de caractere. Acel șir este căutat în comenzile anterioare și sunt identificate. Funcționalitatea poartă numele de //reverse history search//. +
- +
-**[1e]** Folosind ''​Ctrl+r''​ căutați în istoricul de comenzi ale shell-ului comenzi care conțineau șirul ''​man''​ (de la //​manual//​). După prima comandă găsită în istorie, dacă apăsați ''​Ctrl+r''​ din nou vă va găsi următoarea comandă, și tot așa. +
- +
-==== 2. Lucrul cu fișiere ==== +
- +
-Adesea, în mediul din linia de comandă, dorim să vedem conținut de fișiere. Pentru aceasta folosim comanda ''​cat''​ urmată de numele fișierului. +
- +
-Tastați la promptul unui terminal comanda +
-<​code>​ +
-cat /​etc/​passwd +
-</​code>​ +
-și apăsați ''​Enter''​. Ca urmare a tastării comenzii, ni se afișează pe ecran conținutul fișierului ''/​etc/​passwd''​. +
- +
-<note tip> +
-Puteți naviga în sus sau în jos în afișarea terminalului folosind, respectiv, combinațiile de taste ''​Shift+PgUp'',​ respectiv ''​Shift+PgDn''​. +
-</​note>​ +
- +
-**[2a]** Afișați conținutul fișierului ''/​etc/​hosts''​ și navigați în sus sau în jos în afișarea terminalului. +
- +
-O altă formă de vizualizare a unui fișier este cu ajutorul comenzii ''​less''​. Urmată de numele unui fișier putem vedea și parcurge fișierul. +
- +
-Tastați la promtpul unui terminal comanda +
-<​code>​ +
-less /​etc/​hosts +
-</​code>​ +
-și apăsați ''​Enter''​. Ca urmare a tastării comenzii ni se afișează pe ecran conținutul fișierului ''/​etc/​hosts''​. +
- +
-Puteți naviga în acest fișier folosind săgețile și alte taste de navigare. Pentru a ieși din ecranul de afișare folosiți tasta ''​q''​. +
- +
-Dacă dorim să scriem un fișier avem nevoie de un editor. Putem folosi ''​Gedit''​ sau putem folosi ''​Vim''​. Haideți să folosim ''​Vim'',​ pentru a ne acomoda. Tastați comanda: +
-<​code>​ +
-vim msg.txt +
-</​code>​ +
-și apăsați ''​Enter''​. Vă apare ecranul editorului ''​Vim''​. Acum urmați pașii: +
-  - Apăsați tasta ''​i''​ ca să intrați în modul ''​insert''​ de introducere de conținut. Observați că apare în colțul din stânga jos mesajul ''​INSERT''​. +
-  - Acum scrieți textul ''​ana are mere''​. +
-  - Acum apăsați tasta ''​Esc''​ pentru a părăsi modul ''​insert''​. Observați că dispare din colțul stânga jos mesajul ''​INSERT''​. +
-  - Acum apăsați tastele '':​w<​Enter>''​. Aceasta este comanda de **salvare** a fișierului. +
-  - Acum apăsați tastele '':​q<​Enter>''​. Aceasta este comanda de ieșire. +
- +
-Acum ați scris textul ''​ana are mere''​ în fișierul ''​msg.txt''​. +
- +
-<note warning>​ +
-Editorul ''​Vim''​ este dificil de folosit la început. Dacă pe parcursul folosirii editorului ''​Vim''​ întâmpinați probleme, folosiți tasta ''​Esc''​ pentru a vă asigura că nu sunteți în modul ''​insert''​ și apoi apăsați tastele '':​q!<​Enter>''​. Folosiți, eventual, de mai multe ori ''​Esc''​ și '':​q!<​Enter>''​ și veți reuși să ieșiți din editor. +
-</​note>​ +
- +
-**[2b]** Folosiți, pe rând, comanda ''​cat''​ și comanda ''​less''​ pentru a afișa conținutul fișierului ''​msg.txt''​. +
- +
-**[2c]** Folosiți ''​Vim''​ pentru a crea fișierul ''​quote.txt''​ cu mesajul ''​Go ahead, make my day!''​. Apoi folosiți, pe rând, comanda ''​cat''​ și comanda ''​less''​ pentru a afișa conținutul fișierului ''​quote.txt''​. +
- +
-==== 3. Contul root (X puncte) ==== +
- +
-Contul privilegiat (''​root''​) este folosit în Linux pentru a realiza acțiuni privilegiate. De exemplu, nu putem vedea conținutul fișierului ''/​etc/​sudoers''​ decât ca ''​root''​. Astfel, dacă rulăm comanda +
-<​code>​ +
-cat /​etc/​sudoers +
-</​code>​ +
-vom primi mesajul +
-<​code>​ +
-cat: /​etc/​sudoers:​ Permission denied +
-</​code>​ +
-pentru că nu avem permisiuni. +
- +
-Pentru a rula ca utilizatorul ''​root'',​ prefixăm comanda de mai sus cu altă comandă, anume ''​sudo''​. Comanda ''​sudo''​ rulează comanda de după ea cu permisiuni de ''​root''​. Astfel, comanda de mai jos va reuși și va afișa conținutul fișierului ''/​etc/​sudoers'':​ +
-<​code>​ +
-sudo cat /​etc/​sudoers +
-</​code>​ +
-Dacă este cazul, la promptul de parolă cerut veți introduce parola utilizatorului ''​student'',​ care este tot ''​student''​. +
- +
-Dacă vrem să obținem un prompt în care orice comandă rulează ca root vom folosi comanda +
-<​code>​ +
-sudo su +
-</​code>​ +
-Ca urmare a rulării comenzii ''​sudo su''​ vom avea acum un prompt nou, numit **prompt de root**, identificabil prin faptul că acum promptul se închide în simbolul ''#''​ (//diez//) în loc de ''​$''​ (//​dollar//​). +
-Pentru a reveni înapoi la utilizatorul **student** vom folosi comanda ''​exit''​. +
- +
-**[3a]** Deschideți un terminal cu 4 tab-uri. În două tab-uri obțineți prompt de ''​root'';​ în unul din aceste două tab-uri afișați fișierul ''/​etc/​sudoers''​ iar în celălalt fișierul ''/​etc/​shadow''​. +
- +
----- +
-\\ +
-Acum o să lucrăm la partea cea mai vizibilă dintr-un sistem de operare: sistemul de fișiere. Adică vom crea, șterge, modifica și afișa fișiere, directoare, link-uri. Să începem! +
- +
-===== Basics ===== +
- +
-Pentru a începe acest tutorial trebuie să vă asigurați că sunteți în +
-directorul potrivit. +
-Rulați comanda ''​cd ~/​uso.git/​labs/​01-fs/​support/​basics/''​.  +
- +
-==== Navigarea printr-o ierarhie de directoare ==== +
- +
-Listarea conținutului directorului curent se face folosind comanda +
-''​ls''​. +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ ls +
-grotesque ​ '​hacker-s secret' ​  ​rookiss ​ '​toddler-s bottle'​ +
-</​code>​ +
- +
-Observăm că prin utilizarea comenzii ''​ls''​ putem vedea ce avem în +
-directorul curent, dar nu și în subdirectoarele acestuia. Un mod +
-pentru a putea vizualiza întreaga ierarhie începând cu directorul +
-curent este utilizarea utilitarului ''​tree''​. +
-Dacă acesta nu este instalat, rulați comanda ''​sudo apt-get install tree''​. +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ tree . +
-+
-├── grotesque +
-│   ├── asg +
-│   ├── coin2 +
-│   └── do you dare +
-│   ​    ​├── ascii +
-│   ​    ​├── dos4fun +
-│   ​    ​├── elf +
-│   ​    ​├── hunter +
-│   ​    ​├── hunting +
-│   ​    ​├── mipstake +
-│   ​    ​└── rootkit +
-├── hacker-s secret +
-│   ├── hard +
-│   │   ├── malware +
-│   │   └── pwnsandbox +
-│   ├── medium +
-│   │   ├── softmmu +
-│   │   └── tiney +
-│   └── really hard +
-│   ​    ​├── exploitable +
-│   ​    ​└── nuclear +
-├── rookiss +
-│   ├── ascii easy.pdf +
-│   ├── brain fuck +
-│   ├── echo2 +
-│   ├── fix.pdf +
-│   ├── loveletter +
-│   ├── otp.pdf +
-│   └── syscall +
-└── toddler-s bottle +
-    ├── bof +
-    │   ├── easy +
-    │   │   ├── bof-bof-bof +
-    │   │   ├── bof1.txt +
-    │   │   ├── bof2.txt +
-    │   │   ├── bof3.txt +
-    │   │   ├── bof4.txt +
-    │   │   ├── bof5.txt +
-    │   │   ├── can-you-bof +
-    │   │   └── random-bof.txt +
-    │   ├── hard +
-    │   │   └── I bet you can-t +
-    │   └── medium +
-    │   ​    ​└── getting-serious-here +
-    ├── collision +
-    ├── fd +
-    ├── flag +
-    ├── input +
-    ├── passcode +
-    │   ├── passcode1 +
-    │   ├── passcode2 +
-    │   └── random-org +
-    └── random +
- +
-13 directories,​ 40 files +
-</​code>​ +
- +
-Vrem să afisăm calea curentă pentru a vedea în ce director ne aflăm. +
-Vom folosi comanda ''​pwd''​. După aceea, vom lista conținutul +
-directorului pentru a-l inspecta. +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics +
-student@uso:​~/​.../​01-fs/​support/​basics$ ls +
-grotesque ​ '​hacker-s secret' ​  ​rookiss ​ '​toddler-s bottle'​ +
-</​code>​ +
- +
-De multe ori avem nevoie să ne plasăm cu un director în spate. +
-Pentru a ajunge în directorul părinte folosim comanda ''​cd ..''​. +
-E bine să verificăm de fiecare dată că ne aflăm în directorul în care +
-trebuie. +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics +
-student@uso:​~/​.../​01-fs/​support/​basics$ cd .. +
-student@uso:​~/​uso.git/​labs/​01-fs/​support$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support +
-</​code>​ +
- +
-După folosirea comenzii ''​tree''​ știm întreaga ierarhie și cunoaștem +
-calea pană la un anumit subdirector. Vrem să ajungem acolo. Putem face +
-asta prin comenzi succesive de tipul ''​cd subdirector''​ sau putem +
-folosi o singură comandă pentru a ne ușura munca. +
- +
-<code bash> +
-student@uso:​~/​uso.git/​labs/​01-fs/​support$ cd ~/​uso.git/​labs/​01-fs/​support/​basics/​ +
-student@uso:​~/​.../​01-fs/​support/​basics$ tree . +
-+
-├── grotesque +
-│   ├── asg +
-│   ├── coin2 +
-│   └── do you dare +
-│   ​    ​├── ascii +
-│   ​    ​├── dos4fun +
-│   ​    ​├── elf +
-│   ​    ​├── hunter +
-│   ​    ​├── hunting +
-│   ​    ​├── mipstake +
-│   ​    ​└── rootkit +
-├── hacker-s secret +
-│   ├── hard +
-│   │   ├── malware +
-│   │   └── pwnsandbox +
-│   ├── medium +
-│   │   ├── softmmu +
-│   │   └── tiney +
-│   └── really hard +
-│   ​    ​├── exploitable +
-│   ​    ​└── nuclear +
-├── rookiss +
-│   ├── ascii easy.pdf +
-│   ├── brain fuck +
-│   ├── echo2 +
-│   ├── fix.pdf +
-│   ├── loveletter +
-│   ├── otp.pdf +
-│   └── syscall +
-└── toddler-s bottle +
-    ├── bof +
-    │   ├── easy +
-    │   │   ├── bof-bof-bof +
-    │   │   ├── bof1.txt +
-    │   │   ├── bof2.txt +
-    │   │   ├── bof3.txt +
-    │   │   ├── bof4.txt +
-    │   │   ├── bof5.txt +
-    │   │   ├── can-you-bof +
-    │   │   └── random-bof.txt +
-    │   ├── hard +
-    │   │   └── I bet you can-t +
-    │   └── medium +
-    │   ​    ​└── getting-serious-here +
-    ├── collision +
-    ├── fd +
-    ├── flag +
-    ├── input +
-    ├── passcode +
-    │   ├── passcode1 +
-    │   ├── passcode2 +
-    │   └── random-org +
-    └── random +
- +
-13 directories,​ 40 files +
-student@uso:​~/​.../​01-fs/​support/​basics$ cd grotesque/​do<​TAB>​ +
-student@uso:​~/​.../​basics/​grotesque/​do you dare$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics/​grotesque/​do you dare +
-</​code>​ +
- +
-Câteodată vrem să ne plasăm într-un alt subdirector din ierarhia +
-mare care nu se află în calea curentă. Avem iarăși de ales între +
-pași mici, succesivi sau folosirea unei sigure comenzi pentru a ne +
-poziționa altundeva. +
- +
-<code bash> +
-student@uso:​~/​.../​basics/​grotesque/​do you dare$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics/​grotesque/​do you dare +
-student@uso:​~/​.../​basics/​grotesque/​do you dare$ cd ../​../​rookiss +
-student@uso:​~/​.../​support/​basics/​rookiss$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics/​rookiss +
-</​code>​ +
- +
-Până acum ne-am jucat cu ierarhia dată de echipa de USO, dar cum +
-facem dacă vrem să ajungem în directorul ''/​usr/​local''?​ Folosim o +
-cale **absolută** pentru a naviga direct acolo fără a ne face griji +
-de directorul în care ne aflăm, cât va trebui să ne deplasăm în spate +
-(sau în față) pentru a ajunge unde vrem. +
- +
-<code bash> +
-student@uso:​~/​.../​support/​basics/​rookiss$ cd /​usr/​local +
-student@uso:/​usr/​local$ pwd +
-/​usr/​local +
-</​code>​ +
- +
-Pentru a ajunge în directorul home al utilizatorului curent de +
-oriunde ne-am afla, folosim: +
- +
-<code bash> +
-student@uso:/​usr/​local$ cd ~ # '​tilda'​ +
-student@uso:​~$ pwd +
-/​home/​student +
-</​code>​ +
- +
-Până a trece mai departe, trebuie să vă asigurați că ați înțeles cum +
-trebuie navigarea printr-o ierarhie de directoare. Pentru asta, +
-parcurgeți următoarele exerciții după care verificați cu asistentul +
-că totul este în regulă. +
- +
-    - Plasați-vă în directorul ''​hacker-s\ secret/​medium''​. +
-    - Navigați în sistemul de fișiere către directorul ''​toddler-s\ bottle/​bof/​easy'' ​ pornind din directorul home al utilizatorului curent. +
-    - Ajungeți înapoi în directorul home al utilizatorului curent fără a folosi simbolul **tilda**(~). +
- +
-<note tip> +
-Dacă vrem să renunțăm la folosirea ghilimelelor în cazul fișierelor ale căror nume conțin spații, putem **escapa** caracterul special ''​spațiu''​ folosind ''​\ ''​. +
-</​note>​ +
- +
-==== Listarea fișierelor dintr-un director ==== +
- +
-Plasați-vă din nou în directorul ''/​uso.git/​labs/​01-fs/​support/​basics''​. +
- +
-După cum am observat mai sus, listarea conținutului unui director se poate face folosind comanda ''​ls''​. Această formă de utilizator nu ne prezintă foarte multe informații despre fișierele din directorul inspectat (dimensiune,​ drepturi, tip, etc.). Folosind argumentul ''​-l''​ al lui ''​ls''​ putem lista conținutul unui director în format lung. +
-Astfel, putem afla mai multe informații despre fișiere, cum ar fi (în ordine): drepturile asupra fișierului,​ numărul de linkuri către fișier, numele ownerului, numele grupului owner, dimensiunea fișierului,​ data ultimei modificări și numerele acestuia. +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ ls -l +
-total 16 +
-drwxr-xr-x 3 student student 4096 aug 21 22:17  grotesque +
-drwxr-xr-x 5 student student 4096 aug 21 22:17 '​hacker-s secret'​ +
-drwxr-xr-x 2 student student 4096 aug 21 22:17  rookiss +
-drwxr-xr-x 4 student student 4096 aug 21 22:17 '​toddler-s bottle'​ +
-</​code>​ +
- +
-Putem lista conținutul unui director altul decât cel în care ne aflăm dacă dăm comenzii ''​ls'',​ ca argument, calea către acesta (fie absolută, fie relativă). +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ ls hacker-s\ secret/​hard/​ +
-malware ​    ​pwnsandbox +
-</​code>​ +
- +
-Utilizarea simplă a comenzii ''​ls''​ fără a-i da un argument special nu ne afisează fișierele acunse dintr-un director. Pentru asta, folosim argumentul ''​-a''​. De remarcat, numele fișierelor ascunse încep cu ''​.''​. +
- +
-<note tip> +
-''​.''​ reprezintă directorul curent, iar ''​..''​ reprezintă directorul părinte. +
-</​note>​ +
- +
-<code bash> +
-student@uso:​~/​.../​01-fs/​support/​basics$ cd hacker-s\ secret/​really\ hard/ +
-student@uso:​~/​.../​basics/​hacker-s secret/​really hard$ ls -a +
-.  ..  .unexploitable ​ exploitable ​ nuclear +
-</​code>​ +
- +
-Câteodată un director poate avea foarte multe intrări, iar noi să dorim inspectăm doar o parte dintre ele. Spre exemplu, vrem să aflăm mai multe informații despre fișierele cu extensia ''​.pdf''​. Pentru asta, vom folosi **wildcards**. +
- +
-<code bash> +
-student@uso:​~/​.../​basics/​hacker-s secret/​really hard$ cd ~/​uso.git/​labs/​01-fs/​support/​basics +
-student@uso:​~/​.../​01-fs/​support/​basics$ cd rookiss +
-student@uso:​~/​.../​support/​basics/​rookis$ pwd +
-/​home/​student/​uso.git/​labs/​01-fs/​support/​basics/​rookiss +
-student@uso:​~/​.../​support/​basics/​rookis$ ls *.pdf +
-'ascii easy.pdf' ​  ​fix.pdf ​  ​otp.pdf +
-</​code>​ +
- +
-Până a trece mai departe, trebuie să vă asigurați că ați înțeles și reținut cum puteți lista conținutul unui director sub diverse forme. Pentru asta, parcurgeți următoarele exerciții după care verificați cu asistentul că totul este în regulă. Recomandăm folosirea paginii de manual pentru utilitarul ''​ls''​ (''​man ls''​). Vă va da informații despre toate argumentele pe care le puteți da comenzii ''​ls''​. +
-Putem da oricate argumente comenzii ''​ls'',​ fie sub forma ''​ls -a -b -c'',​ fie ''​ls -abc''​. +
- +
-    - Să se listeze in format lung conținutul directorului ''​grotesque/​do\ you\ dare/''​ cu afișarea dimensiunii fișierelor în format human readable. (Hint: ''​man ls''​ și căutați după șirul ''​human readable''​). +
-    - Afișati conținutul directorului ''​toddler-s\ bottle/''​ cu afișarea unui simbol pentru tipul de fișier. Remarcați diferențele dintre fișiere. (Hint: ''​classify''​) +
-    - Listați directorul ''​hacker-s\ secret/​hard''​ fără a naviga către el. +
-    - Listați întreg conținutul directorului ''​grotesque/''​ (inclusiv fișiere ascunse). +
-    - Listați doar fișierele cu extensia ''​.txt''​ din directorul ''​toddler-s\ bottle/​bof/​easy''​ folosind o singură comandă. +
-    - Plasati-vă în directorul ''​toddler-s\ bottle/​passcode''​ și afisați toate fișierele ale căror nume au prefixul ''​passcode''​. +
- +
-==== 3. Contul root (X puncte) ==== +
- +
-Contul privilegiat (''​root''​) este folosit în Linux pentru a realiza acțiuni privilegiate. De exemplu, nu putem vedea conținutul fișierului ''/​etc/​sudoers''​ decât ca ''​root''​. Astfel, dacă rulăm comanda +
-<​code>​ +
-cat /​etc/​sudoers +
-</​code>​ +
-vom primi mesajul +
-<​code>​ +
-cat: /​etc/​sudoers:​ Permission denied +
-</​code>​ +
-pentru că nu avem permisiuni. +
- +
-Pentru a rula ca utilizatorul ''​root'',​ prefixăm comanda de mai sus cu altă comandă, anume ''​sudo''​. Comanda ''​sudo''​ rulează comanda de după ea cu permisiuni de ''​root''​. Astfel, comanda de mai jos va reuși și va afișa conținutul fișierului ''/​etc/​sudoers'':​ +
-<​code>​ +
-sudo cat /​etc/​sudoers +
-</​code>​ +
-Dacă este cazul, la promptul de parolă cerut veți introduce parola utilizatorului ''​student'',​ care este tot ''​student''​. +
- +
-Dacă vrem să obținem un prompt în care orice comandă rulează ca root vom folosi comanda +
-<​code>​ +
-sudo su +
-</​code>​ +
-Ca urmare a rulării comenzii ''​sudo su''​ vom avea acum un prompt nou, numit **prompt de root**, identificabil prin faptul că acum promptul se închide în simbolul ''#''​ (//diez//) în loc de ''​$''​ (//​dollar//​). +
-Pentru a reveni înapoi la utilizatorul **student** vom folosi comanda ''​exit''​. +
- +
-**[3a]** Deschideți un terminal cu 4 tab-uri. În două tab-uri obțineți prompt de ''​root'';​ în unul din aceste două tab-uri afișați fișierul ''/​etc/​sudoers''​ iar în celălalt fișierul ''/​etc/​shadow''​. +
- +
----- +
-\\ +
-Acum o să lucrăm la partea cea mai vizibilă dintr-un sistem de operare: sistemul de fișiere. Adică vom crea, șterge, modifica și afișa fișiere, directoare, link-uri. Să începem! +
- +
-===== Nice to Know ===== +
- +
-==== 1. Redirectări ==== +
- +
-<note important>​ +
-Pentru acest set de exerciții trebuie să vă aflați în directorul ''​~/​uso.git/​labs/''​. Folosiți comanda: +
-<​code>​ +
-cd ~/​uso.git/​labs +
-</​code>​ +
-</​note>​ +
- +
-De multe ori dorim să salvăm rezultatul afișat de o comandă (//​output//​) într-un fișier pentru a-l consulta ulterior. Acest lucru este util pentru comenzile care afișează multe informații pe care nu le putem vizualiza ușor sau pentru a reține snapshot-uri ale rulării unei comenzi pe care să le comparăm între ele. De exemplu, dacă rulăm comanda +
-<​code>​ +
-ls > out.txt +
-</​code>​ +
-Vom obține în fișierul ''​out.txt''​ rezultatul rulării comenzii **ls**. Putem verifica acest lucru cu ajutorul comenzii +
-<​code>​ +
-cat out.txt +
-</​code>​ +
- +
-Operatorul ''>''​ din shell este numit operator de redirectare,​ cu ajutorul căruia redirectăm rezutatul comenzii (adică ieșirea standard, //standard output//) în fișierul trimis ca argument. +
- +
-Un caz de utilizare este atunci când dorim să rulăm o comandă fără a ne preocupa rezultatul rulării acesteia. În acest caz redirectăm ieșirea standard a comenzii la fișierul special ''/​dev/​null''​. Fișierul special ''/​dev/​null''​ este un fișier de tipul "​gaură neagră":​ orice informație redirectată acolo se pierde. +
- +
-Pentru a exemplifica redirectarea în fișierul special ''/​dev/​null''​ vom folosi utilitarul/​comanda ''​strace''​. Comanda ''​strace''​ monitorizează apelurile pe care le face o altă comandă către sistemul de operare (''​strace''​ -- //system call tracing//). Pentru început rulăm comanda de mai jos și obținem rezultatul indicat: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ strace ls +
-execve("/​bin/​ls",​ ["​ls"​],​ 0x7ffdde615410 /* 35 vars */) = 0 +
-brk(NULL) ​                              = 0x5651b5da3000 +
-access("/​etc/​ld.so.nohwcap",​ F_OK)      = -1 ENOENT (No such file or directory) +
-access("/​etc/​ld.so.preload",​ R_OK)      = -1 ENOENT (No such file or directory) +
-openat(AT_FDCWD,​ "/​etc/​ld.so.cache",​ O_RDONLY|O_CLOEXEC) = 3 +
-[...] +
-write(1, "​00-intro ​ 01-fs  02-process ​ 03-"​...,​ 10900-intro ​ 01-fs  02-process ​ 03-user ​ 04-appdev ​ 05-cli ​ 06-hw-boot ​ 07-storage ​ 08-net ​ 09-vm 10-sec 11-ctf +
-[...] +
-</​code>​ +
- +
-Comanda ''​strace''​ primește ca argument o altă comandă și argumentele aceleia. În cazul de mai sus, a primit ca argument comanda ''​ls''​. Apoi comanda strace afișează la ieșirea standard (//standard output//) rezultatul comenzii primite ca argument (la noi ''​ls''​) iar la ieșirea de eroare standard (//standard error//) rezultatul propriu (adică sumarul apelurilor pe care îl face comanda primită ca argument la sistemul de operare). +
- +
-<​note>​ +
-Pe moment nu este nevoie să știți bine cum folosim comanda ''​strace''​. O folosim ca să demonstrăm aspecte ale redirectării și pentru că scenariile pe care le prezentăm sunt practice și utile. +
-</​note>​ +
- +
-<​note>​ +
-O comandă poate afișa informații la ieșirea standard (//standard output//) și la ieșirea de eroare standard (//standard error//). Ambele informații sunt afișate pe ecranul terminalului. La ieșirea standard sunt mesajele generate util de comandă, în vreme ce la ieșirea de eroare standard sunt mesajele de eroare și avertisment (//​warning//​) afișate în condiții deosebite. +
-</​note>​ +
- +
-**[1a]** Ne dorim să afișăm la terminal doar rezultatul comenzii ''​strace'',​ adică apelurile realizate de comanda primită ca argument, fără să ne preocupe rezultatul comenzii. Pentru aceasta redirectăm ieșirea standard la ''/​dev/​null'',​ adică în acel fișier special **gaură neagră**. Rulăm acum fără redirectare și cu redirectare comenzile de mai jos pentru a investiga fișierele deschise de comanda ''​ls'':​ +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ strace -e openat ls +
-openat(AT_FDCWD,​ "/​etc/​ld.so.cache",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libselinux.so.1",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libc.so.6",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpcre.so.3",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libdl.so.2",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpthread.so.0",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​proc/​filesystems",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​locale-archive",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​share/​locale/​locale.alias",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​UTF-8/​LC_CTYPE",​ O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) +
-openat(AT_FDCWD,​ "​.",​ O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +
-00-intro ​ 01-fs  02-process ​ 03-user ​ 04-appdev ​ 05-cli ​ 06-hw-boot ​ 07-storage ​ 08-net ​ 09-vm 10-sec 11-ctf strace.out +
-+++ exited with 0 +++ +
-student@uso:​~/​uso.git/​labs$ strace -e openat ls > /dev/null +
-openat(AT_FDCWD,​ "/​etc/​ld.so.cache",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libselinux.so.1",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libc.so.6",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpcre.so.3",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libdl.so.2",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpthread.so.0",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​proc/​filesystems",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​locale-archive",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​share/​locale/​locale.alias",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​UTF-8/​LC_CTYPE",​ O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) +
-openat(AT_FDCWD,​ "​.",​ O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +
-+++ exited with 0 +++ +
-</​code>​ +
-În cazul redirectării ieșirii standard la fișierul special ''/​dev/​null''​ folosind operatorul ''>'',​ observăm că nu mai apare listarea de fișiere ''​00-intro ...''​ reprezentând rezultatul comenzii ''​ls''​. +
- +
-<​note>​ +
-Argumentul ''​-e openat''​ al comenzii ''​strace''​ ne permite să selectăm doar apelurile de deschidere de fișier pe care comanda primită ca argument (în cazul nostru ''​ls''​) le face la sistemul de operare. +
-</​note>​ +
- +
-**[1b]** Într-o situație ne interesează să redirectăm rezultatul comenzii ''​strace''​ într-un fișier; adică acea înlănțuire de apeluri efectuate de comanda primită ca argument către sistemul de operare. Pentru aceasta, folosim operatorul ''​2>''​ de redirectare a ieșirii de eroare standard (//standard error//) ca mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ strace -e openat ls 2> strace.out +
-00-intro ​ 01-fs  02-process ​ 03-user ​ 04-appdev ​ 05-cli ​ 06-hw-boot ​ 07-storage ​ 08-net ​ 09-vm 10-sec 11-ctf +
-</​code>​ +
-În comanda de mai sus ieșirea de eroare standard (//standard error//) a fost redirectată în fișierul ''​strace.out'';​ adică rezultatul comenzii ''​strace'',​ adică șirul de apeluri ale comenzii ''​ls''​ la sistemul de operare. La terminal a fost afișată ieșirea standard a comenzii, adică rezultatul comenzii ls. +
- +
-Verificăm faptul că redirectarea a avut loc cu succes afișând conținutul fișierului ''​strace.out''​ cu ajutorul comenzii +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ cat strace.out +
-openat(AT_FDCWD,​ "/​etc/​ld.so.cache",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libselinux.so.1",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libc.so.6",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpcre.so.3",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libdl.so.2",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpthread.so.0",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​proc/​filesystems",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​locale-archive",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​share/​locale/​locale.alias",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​UTF-8/​LC_CTYPE",​ O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) +
-openat(AT_FDCWD,​ "​.",​ O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +
-+++ exited with 0 +++ +
-</​code>​ +
-Observăm că, așa cum ne așteptam, rezultatul comenzii strace (lista de apeluri) a fost redirectată cu succes în fișier prin redirectarea ieșirii de eroare standard (//standard error//). +
- +
-**[1c]** Ne poate interesa să redirectăm și rezultatul comenzii ''​strace''​ într-un fișier și rezultatul comenzii primite ca argument. În acest caz folosim atât operatorul ''>''​ de redirectare a ieșirii standard (//standard output//) cât și operatorul ''​2>''​ de redirectare a ieșirii de eroare standard (//standard error//). Pentru aceasta folosim comanda: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ strace -e openat ls 2> strace.out > ls.out +
-</​code>​ +
-În comanda de mai sus am redirectat ieșirea standard (//standard output//), adică rezultatul comenzii ''​ls'',​ în fișierul ''​ls.out''​ și ieșirea de eroare standard (//standard error//), adică rezultatul comenzii ''​strace'',​ în fișierul ''​strace.out''​. Putem verifica acest lucru prin afișarea conținutului celor două fișiere: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ cat strace.out +
-openat(AT_FDCWD,​ "/​etc/​ld.so.cache",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libselinux.so.1",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libc.so.6",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpcre.so.3",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libdl.so.2",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​lib/​x86_64-linux-gnu/​libpthread.so.0",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​proc/​filesystems",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​locale-archive",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​share/​locale/​locale.alias",​ O_RDONLY|O_CLOEXEC) = 3 +
-openat(AT_FDCWD,​ "/​usr/​lib/​locale/​UTF-8/​LC_CTYPE",​ O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) +
-openat(AT_FDCWD,​ "​.",​ O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +
-+++ exited with 0 +++ +
-student@uso:​~/​uso.git/​labs$ cat ls.out +
-00-intro +
-01-fs +
-02-process +
-03-user +
-04-appdev +
-05-cli +
-06-hw-boot +
-07-storage +
-08-net +
-09-vm +
-10-sec +
-11-ctf +
-ls.out +
-strace.out +
-</​code>​ +
-Observăm că cele două fișiere obținute în urma redirectării (''​strace.out''​ și ''​ls.out''​) conțin rezultatele rulării comenzilor. +
- +
-**[1d]** Construiți o comandă ''​strace''​ care să nu afișeze nimic la terminal și să aibă în fișierul ''​strace.out''​ apelurile de deschidere de fișiere realizate de comanda ''​ps''​. +
- +
-<note hint> +
-A nu afișa nimic la terminal înseamnă că trebuie să ignorați rezultatul comenzii ''​ps'',​ adică să folosiți redirectarea către fișierul special ''/​dev/​null''​. +
-</​note>​ +
- +
-**[1e]** Utilitarul ''​grep''​ este folosit pentru a căuta un șir de caractere într-un fișier. De exemplu comanda de mai jos caută șirul ''​root''​ în fișierul ''/​etc/​passwd'':​ +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ grep root /​etc/​passwd +
-root:​x:​0:​0:​root:/​root:/​bin/​bash +
-</​code>​ +
-După rularea unei comenzi putem folosi comanda ''​echo $?''​ pentru a vedea dacă s-a rulat cu succes. De exemplu, dacă după rularea comenzii ''​grep''​ de mai sus, rulăm comanda de verificare a unei rulări cu succes, obținem: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ echo $? +
-+
-</​code>​ +
-Rezultatul ''​0''​ înseamnă o comandă anterioară s-a rulat cu succes. +
- +
-Construiți o comanda ''​grep''​ cu redirectare care să nu afișeze **nimic** la terminal (nici //standard output//, nici //standard error//). Iar după rularea acelei comenzi să verificați rularea cu succes. Pentru a verifica faptul că ați construit comanda ''​grep''​ cum trebuie, folosind secvența de comenzi de mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs$ grep '​a'​ /etc/passwd TODO +
-student@uso:​~/​uso.git/​labs$ echo $? +
-+
-student@uso:​~/​uso.git/​labs$ grep '​aaa'​ /etc/passwd TODO +
-student@uso:​~/​uso.git/​labs$ echo $? +
-+
-student@uso:​~/​uso.git/​labs$ grep '​aaa'​ /etc/pass TODO +
-student@uso:​~/​uso.git/​labs$ echo $? +
-+
-</​code>​ +
-În loc de ''​TODO''​ trebuie să completați cu acele părți din construcție care folosesc redirectre pentru a nu afișa **nimic** la terminal. +
- +
-==== 2. Lucru cu arhive ==== +
- +
-<note important>​ +
-Pentru acest set de exerciții trebuie să vă aflați în directorul ''​~/​uso.git/​labs/​01-fs/''​. Folosiți comanda: +
-<​code>​ +
-cd ~/​uso.git/​labs/​01-fs +
-</​code>​ +
-</​note>​ +
- +
-**[2a]** Aflându-vă în directorul ''​~/​uso.git/​labs/​01-fs'',​ creați o arhivă ''​.zip''​ cu numele ''​support-g.zip''​ și o arhivă ''​.tar.gz''​ cu numele ''​support-g.tar.gz''​ cu toate intrările (fișiere, directoare etc.) care încep cu litera ''​g''​ din directorul ''​support/''​. +
- +
-Verificați-vă folosind comanda de afișare a conținutului unei arhive ''​.zip'',​ respectiv comanda de afișare a conținutului unei arhive ''​.tar.gz''​. +
- +
-**[2b]** Aflându-vă în directorul ''​~/​uso.git/​labs/​01-fs'',​ creați o arhivă ''​.zip''​ cu numele ''​01-fs-g.zip''​ și o arhivă ''​.tar.gz''​ cu numele ''​01-fs-g.tar.gz''​ cu toate intrările (fișiere, directoare etc.) care încep cu litera ''​g''​ din directorul ''​support/''​ **și** toate intrările (fișiere, directoare etc.) care încep cu litera ''​g''​ din directorul ''​wiki/''​. +
- +
-Verificați-vă folosind comanda de afișare a conținutului unei arhive ''​.zip'',​ respectiv comanda de afișare a conținutului unei arhive ''​.tar.gz''​. +
- +
-**[2c]** Putem actualiza o arhivă adăugând sau ștergând un fișier din cadrul ei. De exemplu în arhiva de ''​01-fs-g.zip''​ de mai sus putem adăuga fișierul ''​wiki/​recap.wiki''​ folosind comanda +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ zip 01-fs-g.zip wiki/​recap.wiki +
-  adding: wiki/​recap.wiki (stored 0%) +
-</​code>​ +
- +
-Putem verifica adăugarea cu succes a fișierului ''​wiki/​recap.wiki''​ folosind comanda +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ unzip -l 01-fs-g.zip +
-Archive: ​ 01-fs-g.zip +
-  Length ​     Date    Time    Name +
---------- ​ ---------- -----   ​---- +
-        0  2018-08-24 14:52   ​support/​get-a-life/​ +
-        0  2018-08-24 14:52   ​support/​get-a-life/​3-template/​ +
-[...] +
-        0  2018-08-24 14:52   ​wiki/​get-a-life.wiki +
-        0  2018-08-24 14:52   ​wiki/​recap.wiki +
---------- ​                    ​------- +
-    12120                     32 files +
-</​code>​ +
-Observăm în rezultatul comenzii existența fișierului ''​wiki/​recap.wiki'',​ deci a fost adăugat cu succes. +
- +
-Putem șterge fișiere dintr-o arhivă ''​.zip''​. De exemplu, pentru a șterge fișierul ''​wiki/​get-a-life.wiki''​ din arhiva ''​01-fs-g.zip''​ folosim opțiunea ''​-d''​ a comenzii ''​zip'':​ +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ zip -d 01-fs-g.zip wiki/​get-a-life.wiki +
-updating: wiki/​get-a-life.wiki (stored 0%) +
-</​code>​ +
- +
-**[2d]** Adăugați fișierele ''​wiki/​demo.wiki''​ și ''​wiki/​basics.wiki''​ la arhiva ''​01-fs-g.zip''​. Ștergeți fișierele ''​support/​get-a-life/​2-passwd/​reader.c''​ și ''​support/​get-a-life/​4-rename/​4.tex''​ din arhiva ''​01-fs-g.zip''​. +
- +
-**[2e]** O arhivă ''​.tar.gz''​ este de fapt o arhivă ''​.tar''​ comprimată cu utilitarul ''​gzip''​. Fiind trecută prin două filtre de prelucrare, nu putem adăuga și șterge fișiere din acea arhivă. Putem face însă, acest lucru pe o arhivă ''​.tar''​. +
- +
-Lucrul cu arhive ''​.tar''​ este similar lucrului pe arhive ''​.tar.gz''​ numai că acum lipsește opțiunea ''​z''​ din comanda ''​tar''​. Adică: +
-  * creăm o arhivă ''​.tar''​ folosind comanda<​code>​ +
-tar cvf my.tar file1 file2 dir1 dir2 ... +
-</​code>​ +
-  * dezarhivăm o arhivă ''​.tar''​ folosind comanda<​code>​ +
-tar xvf my.tar +
-</​code>​ +
-  * listăm conținutul unei arhive ''​.tar''​ folosind comanda<​code>​ +
-tar tf my.tar +
-</​code>​ +
- +
-Creați o arhivă ''​01-fs-g.tar''​ cu  cu toate intrările (fișiere, directoare etc.) care încep cu litera ''​g''​ din directorul ''​support/''​ **și** toate intrările (fișiere, directoare etc.) care încep cu litera ''​g''​ din directorul ''​wiki/''​. Listați conținutul arhivei. +
- +
-**[2f]** Adăugați fișierele ''​wiki/​demo.wiki''​ și ''​wiki/​basics.wiki''​ la arhiva ''​01-fs-g.tar''​. Ștergeți fișierele ''​support/​get-a-life/​2-passwd/​reader.c''​ și ''​support/​get-a-life/​4-rename/​4.tex''​ din arhiva ''​01-fs-g.tar''​. +
- +
-==== 3. Parcurgere fișiere folosind ''​find''​ ==== +
- +
-O situație frecventă în lucrul cu fișiere este să parcurgem toate fișierele dintr-o ierarhie. Eventual să facem apoi operații pe toate aceste fișiere: să schimbăm permisiuni, să afișăm informații,​ să ștergem unele fișiere. Pentru aceasta folosim utilitarul ''​find''​. +
- +
-În mod implicit ''​find''​ afișează recursiv toate intrările din directorul curent, așa cum se vede când rulăm comanda +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ find +
-+
-./wiki +
-./​wiki/​basics.wiki +
-./​wiki/​concepts.wiki +
-./​wiki/​demo.wiki +
-./​wiki/​get-a-life.wiki +
-./​wiki/​nice-to-know.wiki +
-./​wiki/​recap.wiki +
-./​wiki/​need-to-know.wiki +
-./​01-fs-g.zip +
-./support +
-./​support/​.gitignore +
-./​support/​get-a-life +
-[...] +
-</​code>​ +
- +
-Dacă-i dăm un argument un director, va afișa **recursiv** toate intrările din acel director. De exemplu, comanda de mai jos afișează toate intrările din ierarhia ''/​var/​lib/​apt/'':​ +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ find /​var/​lib/​apt +
-/​var/​lib/​apt +
-/​var/​lib/​apt/​mirrors +
-/​var/​lib/​apt/​mirrors/​partial +
-/​var/​lib/​apt/​daily_lock +
-/​var/​lib/​apt/​lists +
-[...] +
-</​code>​ +
- +
-**[3a]** Putem afișa folosind ''​find''​ doar anumite tipuri de intrări, de exemplu doar fișiere. Pentru a afișa doar fișierele din directorul curent folosim opțiunea ''​-type f'',​ la fel ca în comanda de mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ find -type f +
-./​wiki/​basics.wiki +
-./​wiki/​concepts.wiki +
-./​wiki/​demo.wiki +
-./​wiki/​get-a-life.wiki +
-./​wiki/​nice-to-know.wiki +
-./​wiki/​recap.wiki +
-[...] +
-</​code>​ +
-Observăm în output că sunt afișate numai fișiere, folosind opțiunea ''​-type f''​. +
- +
-**[3b]** Putem afișa fișierele care corespund unui anumit pattern. De exemplu pentru a afișa toate fișierele cu extensia ''​.tex''​ vom folosi opțiunea ''​-name'',​ la fel în comanda de mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ find -type f -name '​*.tex'​ +
-./​support/​nice-to-know/​fruits/​pear.tex +
-./​support/​get-a-life/​4-rename/​5.tex +
-./​support/​get-a-life/​4-rename/​3.tex +
-[...] +
-</​code>​ +
-Observăm că sunt afișate numai fișierele cu extensia ''​.tex''​. +
- +
-**[3c]** Putem folosi comanda ''​find''​ pentru a aplica o altă comandă pe intrările găsite. De exemplu dacă dorim să ștergem toate fișierele cu extensia ''​.c''​ vom folosi opțiunea ''​-exec'',​ la fel ca în comanda de mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ find -type f -name '​*.c'​ +
-./​support/​nice-to-know/​fruits/​apple.c +
-./​support/​get-a-life/​2-passwd/​reader.c +
-student@uso:​~/​uso.git/​labs/​01-fs$ find -type f -name '​*.c'​ -exec rm {\; +
-student@uso:​~/​uso.git/​labs/​01-fs$ find -type f -name '​*.c'​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ +
-</​code>​ +
-Dacă la început aveam două fișiere cu extensia ''​.c''​ (''​./​support/​nice-to-know/​fruits/​apple.c''​ și ''​./​support/​get-a-life/​2-passwd/​reader.c''​) după rularea comenzii find acele fișiere dispar. +
- +
-<note important>​ +
-Contrucția ''​-exec rm {\;''​ este mai complicată și nu o vom explica în detaliu aici. Pe scurt: +
-  * ''​-exec''​ este opțiunea care dictează comenzii ''​find''​ să execute comanda primită ca argument +
-  * ''​rm''​ este comanda rulată pentru fiecare fișier găsit, adică acea comandă care șterge fișierul +
-  * ''​{}''​ este o construcție specifică opțiunii ''​-exec''​ care înlocuiește numele fișierului;​ practic înseamnă că rulăm ''​rm <​nume-fisier>''​ pentru fiecare fișier descoperit +
-  * ''​\;''​ este un terminator de comandă, spunând că aici se încheie comanda transmisă ca argument opțiunii ''​-exec''​ +
- +
-</​note>​ +
- +
-**[3d]** Pe baza celor de mai sus, ștergeți toate fișierele temporare din ierarhia curentă. +
- +
-<note tip> +
-Fișierele temporare sunt fișiere care se încheie cu caracterul ''​~''​ (tildă). +
-</​note>​ +
- +
-==== 4. Corectare lucru cu fișier header și Makefile ==== +
- +
-În directorul ''​~/​uso.git/​labs/​01-fs/​support/​04-compile/''​ găsiți un set de fișiere și un fișier ''​Makefile''​ pentru compilarea lor. Există o eroare ce ține de căi în sistemul de fișiere, astfel că nu merge compilarea în momentul rulării comenzii ''​make''​. +
- +
-Corectați eroarea și obțineți fișierul executabil ''​write_hello''​. +
- +
-==== 5. Copiere ierarhie pe un stick USB ==== +
- +
-Conectați un stick USB pe un port USB al sistemului vostru. Folosiți linia de comandă pentru a copia ierarhia curentă (''​~/​uso.git/​labs/​01-fs/​support/​04-compile/''​) pe stick. +
- +
-<note important>​ +
-După ce ați conectat stick-ul, verificați folosind comanda ''​mount''​ unde este montat, în ce director este accesibil. +
- +
-După ce ați făcut copierea demontați stick-ul folosind comanda +
-<​code>​ +
-sudo umount <​mount-point>​ +
-</​code>​ +
-unde ''<​mount-point>''​ este directorul unde este montat stick-ul, unde ați copiat ierarhia curentă, afișat de comanda ''​mount''​ după conectare. +
-</​note>​ +
- +
-==== 6. Comenzi și executabile ==== +
- +
-Comenzile pe care le rulăm au la bază fișiere executabile în sistemul de fișiere. În momentul în care dăm o comandă, shell-ul caută într-o listă predefinită de directoare existența unui executabil cu ajutorul căruia să ruleze comanda respectivă. De exemplu, comanda ''​ls''​ folosește executabilul ''/​bin/​ls'',​ astfel că rularea celor două comenzi de mai jos este echivalentă:​ +
-<​code>​ +
-ls +
-/bin/ls +
-</​code>​ +
-Similar, comanda ''​find''​ folosește executabilul ''/​usr/​bin/​find'',​ comanda ''​zip''​ folosește executabilul ''/​usr/​bin/​zip''​ și așa mai departe. +
- +
-Directoarele în care caută shell-ul executabile aferente unei comenzi se găsesc într-o construcție de tip variabilă de mediu numită ''​PATH''​. Vom vorbi mai multe despre variabile și variabile de mediu la un laborator viitor. Pe moment, este suficient să știm că pentru a afișa valoarea variabilei ''​PATH''​ folosim comanda +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ echo $PATH +
-/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin:/​usr/​games:/​usr/​local/​games:/​snap/​bin +
-</​code>​ +
-Directoarele afișate, conținute de variabila ''​PATH''​ sunt afișate în rezultatul comenzii, separate prin caracterul '':''​ (două puncte, //colon//). Asta înseamnă ca dacă un utilizator tastează comanda ''​ls'',​ shell-ul va căuta, în ordine, existența executabilului ''/​usr/​local/​sbin/​ls'',​ apoi ''/​usr/​local/​bin/​ls'',​ apoi ''/​usr/​sbin/​ls''​ și așa mai departe. Când găsește un executabil îl va rula, ducând la afișarea rezultatului comenzii la terminal. +
- +
-Calea către executabilul aferent unei comenzi poate fi afișată folosind comanda ''​which''​ urmată de numele comnezii, ca mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ which ls +
-/bin/ls +
-student@uso:​~/​uso.git/​labs/​01-fs$ which find +
-/​usr/​bin/​find +
-student@uso:​~/​uso.git/​labs/​01-fs$ which zip +
-/​usr/​bin/​zip +
-</​code>​ +
-În rulările celor trei comenzi ''​which''​ de mai sus am obținut calea către fișierele executabilele aferente respectiv comenzilor ''​ls'',​ ''​find''​ și ''​zip''​. +
- +
-Putem verifica faptul că acele fișiere sunt executabile prin folosirea comenzii ''​file''​ urmată de calea către fișierul executabil, ca mai jos: +
-<​code>​ +
-student@uso:​~/​uso.git/​labs/​01-fs$ file /bin/ls +
-/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /​lib64/​ld-linux-x86-64.so.2,​ for GNU/Linux 3.2.0, BuildID[sha1]=9567f9a28e66f4d7ec4baf31cfbf68d0410f0ae6,​ stripped +
-student@uso:​~/​uso.git/​labs/​01-fs$ file /​usr/​bin/​find +
-/​usr/​bin/​find:​ ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /​lib64/​ld-linux-x86-64.so.2,​ for GNU/Linux 3.2.0, BuildID[sha1]=b920f53e0c67a31d8ef07b84b1344f87a0e82d71,​ stripped +
-student@uso:​~/​uso.git/​labs/​01-fs$ file /​usr/​bin/​zip +
-/​usr/​bin/​zip:​ ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /​lib64/​ld-linux-x86-64.so.2,​ for GNU/Linux 2.6.32, BuildID[sha1]=c828586e6e7cf929500a5b9c04faece9eceed5cc,​ stripped +
-</​code>​ +
-În rezultatul rulării celor trei comenzi ''​file''​ de mai sus vedem că apare informația ''​ELF'',​ ''​dynamically linked''​. Fără a intra în detalii, acest lucru este indiciul că aceste fișiere sunt, într-adevăr,​ fișiere executabile. +
- +
-**[6a]** Găsiți fișierele executabilele aferente comenzilor ''​useradd'',​ ''​iotop'',​ ''​tar'',​ ''​gzip''​. Verificați că cele patru fișiere indicate sunt fișiere executabile. +
- +
-**Bonus**: De ce fișierele executabile pentru ''​useradd''​ și ''​iotop''​ se găsesc într-un director care conține ''​sbin/''​ pe când ''​tar''​ și ''​gzip''​ se găsesc într-un director care conține ''​bin/''​ (fără ''​s''​)?​ Folosiți Internetul și Google pentru aflarea răspunsului. +
- +
-===== Get a Life ===== +
- +
-==== 1. Lucrul cu fișiere speciale (X Karma points) ==== +
- +
-**[1a]** Intrați în directorul ''​~/​uso.git/​labs/​01-fs/​support/​get-a-life/​1-to_delete''​. Folosind linia de comandă, ștergeți fișierul ''​-to_delete''​. +
- +
-**[1b]** Creați și ștergeți un fișier cu **Enter** în nume, folosind linia de comandă. +
- +
-**[1c]** Creați un fișier de 32MB cu date random. (Hint: dd) +
- +
-==== 2. Path traversal (X Karma points) ==== +
- +
-**[2a]** Intrați în directorul ''​uso/​labs/​01-fs/​support/​get-a-life/​2-passwd''​. Rulați comanda ''​make''​ și verificați folosind **ls** că a fost creat executabilul ''​reader''​. Binarul afișează la consolă conținutul fișierului primit că argument (Ex: ''​./​reader ~/​.bash_history''​). În schimb, ''/​etc/​passwd''​ a fost blocat de programator din motive de securitate. Încercați totuși să afișați ''/​etc/​passwd''​ folosind executabilul dat. +
- +
-==== 3. Automatizarea lucrului cu fisiere (X Karma points) ==== +
- +
-**[3a]** Intrați în directorul ''​uso/​labs/​01-fs/​support/​get-a-life/​3-template''​. Creați fișierele ''​laborator-01.wiki''​ ... ''​laborator-12.wiki''​ care au același conținut că și ''​template.wiki'',​ cu excepția primei linii în care se va modifica numărul laboratorului. +
- +
-**[3b]** Intrați în directorul ''​uso/​labs/​01-fs/​support/​get-a-life/​4-rename''​. Redenumiți fișierele ''​1.tex'',​ ''​2.tex'',​ ... ''​20.tex''​ în ''​01.tex'',​ ''​02.tex'',​ ... , ''​20.tex''​. +
- +
-**[3c]** Creați o arhivă zip cu toate fișierele cu extensia ''​.conf''​ din ierarhia ''/​etc/''​. (Hint: find) +
- +
-==== 4. Grupuri si permisiuni (X Karma points) ==== +
- +
-**[4a]** Găsiți toate fișierele executabile din ierarhia ''/​etc/''​. +
- +
-**[4b]** Găsiți toate fișierele care nu au ca grup root-ul din ierarhia ''/​etc/''​. +
- +
-==== 5. Întrebări (X Karma points) ==== +
- +
-**[5a]** De ce useradd este vizibil doar pentru root (cu ''​which''​) dar nu și pentru utilizatorul obișnuit?​ +
- +
-**[5b]** De ce comanda cd sau exit nu este vizibilă cu ''​which''?​ +
- +
-===== Sumar. Cuvinte cheie ===== +
- +
-  * Linie de comandă, comenzi, argumente/​opțiuni +
-  * Directorul curent: ''​pwd''​. Navigare prin directoare: ''​cd''​. Listarea conținutului:​ ''​ls''​. Sistemul de fișiere în Linux are o structură arborescentă/​ierarhică:​ ''​ls -R'',​ ''​tree''​ +
-  * Redenumire fișiere, mutare fișiere: ''​mv''​ +
-  * Copiere fișiere: ''​cp''​ +
-  * Linux manpages and offline help: ''​man''​ +
-  * Wildcard listing use-case: Listarea tuturor fișierelor cu extensia ''​.conf''​ din directorul ''​etc''​ din rădăcină:​ +
-<​code>​ +
-ls /​etc/​*.conf +
-</​code>​ +
-  * Copiere/​ștergere recursivă a directoarelor care nu sunt goale: ''​rm -r my_dir'',​ ''​cp -r my_dir''​ +
-  * ''​rmdir''​ vs. ''​rm''​ vs. ''​rm -rf''​ +
-  * Afișarea conținutului unor fișiere: ''​cat file''​. Semnificația ''​cat''​ este de concatenare a fișierelor primite ca argument de intrare și de afișare la ieșirea standard a conținutului:​ ''​cat file1 file2 file3 ... ''​. Dacă nici un fișier nu e dat ca argument de intrare, atunci ''​cat''​ va aștepta date de la intrarea standard (tastatură) până când este apăsata combinația de taste ''​CTRL+d''​. +
-  * Căutarea în sistemul de fișiere: ''​locate''​ +
-  * Editarea de fișiere text: ''​vim''​ +
-  * Arhivare/​dezarhivare:​ ''​tar'',​ ''​zip''​ +
-  * Redirectări,​ ieșire standard, ieșire de eroare standard: ''>'',​ ''​2>''​ +
-  * Parcurgerea fișierelor dintr-o ierarhie: ''​find''​ +
-  * Comenzi și executabie: ''​PATH'',​ ''​which'',​ ''​file''​+
  
uso/laboratoare/new/01-fs.1538556345.txt.gz · Last modified: 2018/10/03 11:45 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