This shows you the differences between two versions of the page.
uso:laboratoare:new:01-fs [2018/10/04 19:49] sergiu.weisz [2. Ierarhie de directoare] |
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 directory), 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 ==== | + | |
- | + | ||
- | Î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> | + | |
- | + | ||
- | ===== 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 tildă) 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 | + | |
- | 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 ==== | + | |
- | + | ||
- | 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/''. | + | |
- | + | ||
- | ==== 1. 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> | + | |
- | + | ||
- | ==== 2. 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 ==== | + | |
- | + | ||
- | 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! | + | |
- | + | ||
- | ===== Need to Know ===== | + | |
- | + | ||
- | ==== 1. Lucrul cu sistemul de fișiere ==== | + | |
- | + | ||
- | Pentru a căuta un fișier în sistemul de fișiere putem folosi comanda **locate**. Aceasta se folosește în felul următor: | + | |
- | <code bash> | + | |
- | student@uso:~$ locate --help | + | |
- | Usage: locate [OPTION]... [PATTERN]... | + | |
- | </code> | + | |
- | + | ||
- | Putem observa că după **locate** trebuie să menționăm opțiunile precum și pattern-ul, adică cuvântul cheie pe care îl căutam. | + | |
- | Putem afla aceste opțiuni prin folosirea comenzii **man locate** sau **locate --help**. | + | |
- | + | ||
- | Vom căuta cuvântul cheie **slayer**, adică fișierul **slayer** în sistemul de fișiere. | + | |
- | <code bash> | + | |
- | student@uso:~$ locate slayer | + | |
- | </code> | + | |
- | + | ||
- | Putem observa că nu există niciun rezultat. Asta deoarece locate caută într-o bază de date creată la un moment dat. Dacă fisierul **slayer** a fost adaugat ulterior, baza de date trebuie actualizată. Putem face asta folosind (folosiți parola **student** atunci când este cerută): | + | |
- | <code bash> | + | |
- | student@uso:~$ sudo updatedb | + | |
- | [sudo] password for student: | + | |
- | </code> | + | |
- | + | ||
- | Încercând din nou: | + | |
- | <code bash> | + | |
- | student@uso:~$ locate slayer | + | |
- | /home/student/uso.git/lab02/demo/slayer | + | |
- | </code> | + | |
- | + | ||
- | **[1a]** Căutați fișierul **pwd** în ierarhia de fișiere a sistemului curent. | + | |
- | + | ||
- | **[1b]** Căutați fișiere cu extensia **.odt** în ierarhia de fișiere a sistemului curent. | + | |
- | + | ||
- | ==== 2. Ierarhie de directoare ==== | + | |
- | + | ||
- | Putem crea directoare folosind comanda **mkdir**. Aceasta se folosește în felul următor: | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ mkdir --help | + | |
- | Usage: mkdir [OPTION]... DIRECTORY... | + | |
- | Create the DIRECTORY(ies), if they do not already exist. | + | |
- | </code> | + | |
- | Cuvântul cheie **mkdir** urmat de opțiuni și de numele directorului pe care vrem să îl creăm. | + | |
- | Putem afla aceste opțiuni prin folosirea comenzii **man mkdir** sau **mkdir --help** la fel ca la utilitarele **locate** și **grep**. | + | |
- | + | ||
- | Să creăm un director pornind de la ''~/uso.git''. Mergem în acest director folosind **cd ~/uso.git** | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ mkdir director_nou | + | |
- | student@uso:~/uso.git$ ls -la director_nou/ | + | |
- | total 8 | + | |
- | drwxr-xr-x 2 student student 4096 aug 22 23:35 . | + | |
- | drwxr-xr-x 15 student student 4096 aug 22 23:35 .. | + | |
- | </code> | + | |
- | + | ||
- | Am folosit utlitarul mkdir fără nicio opțiune. **Atentie!** După fiecare comandă executată este bine să verificăm că aceasta s-a executat cu succes. După cum vedeți, am verificat folosind utlitarul **ls -l**. Să creăm încă un director în cadrul acestuia, dar să rămânem în calea ''~/uso.git''. | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ mkdir -p director_nou/alt_director | + | |
- | student@uso:~/uso.git$ ls -l director_nou/ | + | |
- | total 4 | + | |
- | drwxr-xr-x 2 student student 4096 aug 22 23:38 alt_director | + | |
- | </code> | + | |
- | Am folosit o cale relativă pentru a crea directorul. Echivalentul fara a folosi o cale relativă este: | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ cd director_nou/ | + | |
- | student@uso:~/uso.git/director_nou$ mkdir un_al2lea_director | + | |
- | student@uso:~/uso.git/director_nou$ ls -l | + | |
- | total 8 | + | |
- | drwxr-xr-x 2 student student 4096 aug 22 23:38 alt_director | + | |
- | drwxr-xr-x 2 student student 4096 aug 22 23:39 un_al2lea_director | + | |
- | </code> | + | |
- | + | ||
- | **[2a]** Creați o ierarhie de directoare în directorul curent conform celei de mai jos. ''Hint: Frunzele sunt fișiere, nu directoare (nu se termină în /)''. | + | |
- | <code bash> | + | |
- | student@uso$ tree . | + | |
- | . | + | |
- | |-- ac_dc/ | + | |
- | | |-- angus | + | |
- | | |-- bon | + | |
- | | |-- brian | + | |
- | | |-- chris | + | |
- | | |-- cliff | + | |
- | | |-- dave | + | |
- | | |-- george | + | |
- | | |-- malcom | + | |
- | | |-- mark | + | |
- | | `-- phil | + | |
- | |-- cargo/ | + | |
- | |-- hammerfall/ | + | |
- | | |-- anders | + | |
- | | |-- jesper | + | |
- | | |-- joacim | + | |
- | | |-- magnus | + | |
- | | |-- oscar | + | |
- | | |-- pontus | + | |
- | | `-- stefan | + | |
- | |-- iris | + | |
- | |-- metallica | + | |
- | |-- nightwish | + | |
- | |-- nirvana | + | |
- | |-- phoenix | + | |
- | `-- slayer | + | |
- | </code> | + | |
- | + | ||
- | Putem muta directorul ''un_al2lea_director'' în ''alt_director'' fiind în ''~/uso.git'': | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git/director_nou$ cd ~/uso.git/ | + | |
- | student@uso:~/uso.git$ mv director_nou/un_al2lea_director/ director_nou/alt_director/ | + | |
- | student@uso:~/uso.git$ ls -l director_nou/ | + | |
- | total 4 | + | |
- | drwxr-xr-x 3 student student 4096 aug 22 23:41 alt_director | + | |
- | student@uso:~/uso.git$ ls -l director_nou/alt_director/ | + | |
- | total 4 | + | |
- | drwxr-xr-x 2 student student 4096 aug 22 23:39 un_al2lea_director | + | |
- | </code> | + | |
- | + | ||
- | Putem șterge acel director fiind în ''~/uso.git'': | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ rmdir director_nou/alt_director/un_al2lea_director | + | |
- | student@uso:~/uso.git$ ls -l director_nou/alt_director/ | + | |
- | total 0 | + | |
- | </code> | + | |
- | Am folosit utilitarul **rmdir** pentru a sterge un director (remove directory). Bineînteles, am verificat la sfârșit că operația s-a executat cu succes și directorul nu mai există. | + | |
- | + | ||
- | **[2b]** În directorul **.** (conform ierarhiei de mai sus) creați un director numit **muzica** și mutați întregul conținut al **.** în **muzica**. Ștergeți directorul **hammerfall**. | + | |
- | + | ||
- | **[2c]** Editați fișierul **metallica** cu 5 nume de melodii. Pentru rezolvarea acestui exercițiu va trebui să folosiți **vim**. | + | |
- | + | ||
- | ==== 3. Arhive ==== | + | |
- | + | ||
- | Putem crea archive folosind diferite extensii. E bine să știm să creăm diferite tipuri de arhive deoarece fiecare are beneficiul ei. Astfel, pentru arhiva.zip folosim: | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ zip backup.zip -r * | + | |
- | adding: README.md (deflated 18%) | + | |
- | adding: TW Warhammer/ (stored 0%) | + | |
- | adding: TW Warhammer/.gitignore (stored 0%) | + | |
- | adding: TW Warhammer/Greenskins/ (stored 0%) | + | |
- | [...] | + | |
- | </code> | + | |
- | + | ||
- | Pentru arhiva.tar.gz: | + | |
- | + | ||
- | <code bash> | + | |
- | student@uso:~/uso.git$ tar -zcvf backup.tar.gz * | + | |
- | README.md | + | |
- | TW Warhammer/ | + | |
- | TW Warhammer/.gitignore | + | |
- | TW Warhammer/Greenskins/ | + | |
- | [...] | + | |
- | </code> | + | |
- | + | ||
- | Pentru arhiva.tar.bz2: | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ tar -cvjSf backup.tar.bz2 * | + | |
- | README.md | + | |
- | TW Warhammer/ | + | |
- | TW Warhammer/.gitignore | + | |
- | TW Warhammer/Greenskins/ | + | |
- | TW Warhammer/Greenskins/Grimgor Ironhide/ | + | |
- | [...] | + | |
- | </code> | + | |
- | + | ||
- | Putem observa rezultatul: | + | |
- | <code bash> | + | |
- | student@uso:~/uso.git$ ls -l | + | |
- | total 91124 | + | |
- | drwxr-xr-x 15 student student 4096 aug 23 00:58 ./ | + | |
- | drwxr-xr-x 21 student student 4096 aug 23 00:58 ../ | + | |
- | drwxr-xr-x 8 student student 4096 aug 20 20:57 .git/ | + | |
- | -rw-r--r-- 1 student student 146 aug 20 20:57 README.md | + | |
- | drwxr-xr-x 4 student student 4096 aug 20 20:57 'TW Warhammer'/ | + | |
- | -rw-r--r-- 1 student student 30916450 aug 23 00:58 backup.tar.bz2 | + | |
- | -rw-r--r-- 1 student student 31132786 aug 23 00:58 backup.tar.gz | + | |
- | -rw-r--r-- 1 student student 31187418 aug 23 00:52 backup.zip | + | |
- | </code> | + | |
- | + | ||
- | Utilitarele **zip** și **tar** au diferite opțiuni pentru arhivare și dezarhivare. Acestea se pot vedea folosind **man tar** / **man zip** sau **tar %%--%%help** / **zip %%--%%help** | + | |
- | + | ||
- | **[3a]** Folosind ierarhia ''uso/labs/01-fs'' creați arhive de tipul **zip**, **tar.gz** și **tar.bz2** ce vor conține întreaga ierarhie. Un exemplu de arhiva este ''01-fs.zip''. | + | |
- | + | ||
- | **[3b]** Afișați conținutul arhivei. | + | |
- | + | ||
- | **[3c]** Dezarhivați arhiva într-un director numit **backup**. | + | |
- | ===== Nice to Know ===== | + | |
- | + | ||
- | ==== 1. 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''. | + | |
- | + | ||
- | ==== 2. 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> | + | |
- | + | ||
- | ==== 3. 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 ==== | + | |
- | + | ||
- | **[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 ==== | + | |
- | + | ||
- | **[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 fișiere ==== | + | |
- | + | ||
- | **[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 și permisiuni ==== | + | |
- | + | ||
- | **[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 ==== | + | |
- | + | ||
- | **[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'' | + | |
- | * Comenzi și executabie: ''PATH'', ''which'', ''file'' | + | |