This shows you the differences between two versions of the page.
systems:uso:laboratoare:laborator-02 [2012/09/23 10:12] paul.vlase [9. Căutarea comenzilor] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 02 - Comenzi de bază. Gestiunea pachetelor ====== | ||
- | <hidden> | ||
- | |||
- | * structură arborescentă - fișiere și directoare, structura de directoare din Linux | ||
- | * căi absolute și relative | ||
- | * lucrul cu fișiere și directoare: ls, cd, cat, cp, mv, rm, mkdir, touch | ||
- | * ștergerea directoarelor | ||
- | * symlinks (link-uri simbolice) | ||
- | * manual, căutare în manual | ||
- | * căutarea comenzilor | ||
- | * redirectări: >, >>, 2>, &> | ||
- | * nume conținând spații, quoting, escaping | ||
- | * globbing | ||
- | * dimensiune totală fișiere și directoare (du), spațiu disponibil pe disc (df) | ||
- | * arhivare (tar) | ||
- | |||
- | * apt-get - utilitar de bază pentru a lucra cu un repository - actualizare bază de date, instalare pachete, dezinstalare pachete. | ||
- | * dpkg - utilitar pentru lucrul cu pachere - instalare .deb, dezinstalare .deb, vizualizare pachete instalare, vizualizare informații pachet | ||
- | * update-alternatives | ||
- | |||
- | * Readline | ||
- | * pushd, popd | ||
- | |||
- | Referințe din urmă: | ||
- | * tabbed terminals (lab 01) | ||
- | * instalare pachete din GUI (lab 01) | ||
- | |||
- | TODO: | ||
- | |||
- | * [OK] Importa laboratorul de anul trecut. | ||
- | * [OK] Scoate din gestiunea pachetelor, tot ce nu ține de dpkg/apt. | ||
- | * Reorganizeaza un pic conținutul. | ||
- | * Dezvoltat exercițiul de la arhivare. | ||
- | * Alte metode de documentatie. | ||
- | * [OK] [apt-get fără dependențe] Adaugă indicații suplimentare. | ||
- | * [Package locations] Testează-l și adaptează-l pentru Ubuntu 12.04. | ||
- | * [Globbing] Mai multe explicații poate. | ||
- | |||
- | </hidden> | ||
- | |||
- | ===== Concepte și comenzi importante ====== | ||
- | |||
- | **Tutorial** | ||
- | * structură arborescentă | ||
- | * căi absolute și relative | ||
- | * lucrul cu fișiere și directoare: ls, cd, cat, cp, mv, rm, mkdir, touch | ||
- | * manual, căutare în manual | ||
- | * căutarea comenzilor | ||
- | |||
- | * **''apt-get''** | ||
- | |||
- | **Hands-On** | ||
- | * redirectări | ||
- | * nume conținând spații, quoting, escaping | ||
- | * ștergerea directoarelor | ||
- | * symlinks (link-uri simbolice) | ||
- | * globbing | ||
- | * dimensiune totală fișiere și directoare | ||
- | * arhivare | ||
- | * Readline | ||
- | * pushd, popd | ||
- | * chroot | ||
- | * **''update-alternatives''** | ||
- | * compilare din surse | ||
- | * link-uri simbolice | ||
- | |||
- | * **''dpkg''** | ||
- | * **''aptitude''** | ||
- | |||
- | |||
- | |||
- | |||
- | ===== Pachete necesare ===== | ||
- | |||
- | * build-essential | ||
- | * g++ | ||
- | |||
- | |||
- | ===== Suport laborator ====== | ||
- | |||
- | * [[http://books.google.com/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA74#v=onepage&q&f=false|4.2. Tipuri de fișiere]] | ||
- | * [[http://books.google.com/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA76#v=onepage&q&f=false|4.3. Operații uzuale asupra fișierelor și directoarelor]] | ||
- | * [[http://books.google.com/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA85#v=onepage&q&f=false|4.4. Redirectări de comenzi]] | ||
- | |||
- | * [[http://books.google.com/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA53#v=onepage&q=introducere%20in%20sisteme%20de%20operare&f=false|Gestiunea pachetelor și a utilizatorilor]] | ||
- | * [[http://books.google.com/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA484#v=onepage&q&f=false| Compilarea unei aplicatii din surse ]] | ||
- | |||
- | Puteți urmări tutorialul video corespunzător laboratorului făcut de [[http://itassistant.org/diverse/utilizarea-sistemelor-de-operare/utilizarea-sistemelor-de-operare-1.html|IT Assistant]]. | ||
- | |||
- | |||
- | ====== Tutorial ====== | ||
- | |||
- | ===== 0. Repornirea calculatorului ===== | ||
- | |||
- | Reporniți calculatorul dacă cineva a stat înaintea voastră la el. Dacă nu sunteți siguri, reporniți-l oricum, durează doar câteva minute. Obișnuiți-vă să faceți asta la fiecare laborator de USO înainte de a începe să lucrați. | ||
- | |||
- | |||
- | ===== 1. Descărcarea arhivei laboratorului ===== | ||
- | |||
- | * Descărcați arhiva laboratorului de [[http://elf.cs.pub.ro/uso/store/lab02.tar.gz|aici]], în directorul implicit. | ||
- | * Pentru dezarhivare folosiți comanda | ||
- | |||
- | <code bash> | ||
- | tar zxf ~/Downloads/lab02.tar.gz | ||
- | </code> | ||
- | |||
- | * La finalul laboratorului, veți înțelege ce face această comandă. | ||
- | * Dezarhivarea creează un director numit **''lab02''** în directorul vostru home. Dacă nu se specifică altfel, toate task-urile și căile pe disc sunt relative la directorul corespunzător arhivei laboratorului (**''lab02''**). | ||
- | * Fiecare laborator are asociată o arhivă. Trebuie să vă obișnuiți să o descărcați și dezarhivați înainte de a începe laboratorul. | ||
- | |||
- | |||
- | ===== 2. Fișiere și directoare ===== | ||
- | |||
- | * Intrați în directorul asociat laboratorului. Folosiți comanda **''cd lab02''** | ||
- | * **''cd''** = change directory | ||
- | * Observați că prompt-ul s-a modificat. Noul director este **''~/lab02''**, adică subdirectorul **''lab02''** din home-ul vostru. | ||
- | |||
- | * Listați conținutul directorului curent. Folosiți comanda **''ls''**. | ||
- | * **''ls = list''** | ||
- | * Numele colorate în albastru sunt directoare. Cele cu alb sunt fișiere. Dar nu ne putem baza exclusiv pe culori. Să investigăm suplimentar. | ||
- | |||
- | * Puteți afla oricând în ce director vă aflați folosind **''pwd''**. | ||
- | * **''pwd''** = print working directory | ||
- | * **Trebuie** să fiți tot timpul atenți în ce director vă aflați. Multe dintre exerciții se referă la crearea sau modificarea de fișiere și directoare în locuri specifice. | ||
- | |||
- | |||
- | ===== 3. Pagini de Manual. Listare în format lung ===== | ||
- | |||
- | * Vreți să listați conținutul directorului cu informații suplimentare (în format lung). | ||
- | * Accesați documentația comenzii ls: | ||
- | |||
- | <code bash> | ||
- | man ls | ||
- | </code> | ||
- | |||
- | * Vreți să căutați cuvântul //long// în manual. Folosiți tasta **''/''** (slash). | ||
- | * Cursorul se mută în partea de jos a ecranului. | ||
- | * Scrieți cuvântul //long//, apoi confirmați cu Enter. | ||
- | * Prima apariție a cuvântului nu este interesantă. Pentru a merge la următoarea, tastați **''n''** (next). | ||
- | * Folosiți **''n''** până ajungeți la opțiunea **''-l''** (use a long listing format). | ||
- | * Dacă vreți să căutați în sens invers (în sus), folosiți tasta **''?''** (semnul întrebării) în loc de **''/''** (slash). | ||
- | * Puteți să folosiți și aici tasta n (next search) | ||
- | * Când vreți să închideți manualul, folosiți **''q''** (quit). | ||
- | |||
- | * Alternativ se poate folosi **''info''**. Pentru a ieși, folosiți aceeași tastă ca și pentru **''man''**. | ||
- | |||
- | <code bash> | ||
- | info ls | ||
- | </code> | ||
- | |||
- | * Acum că ați aflat parametrul, folosiți comanda **''ls -l''** pentru a lista detaliat conținutul directorului. | ||
- | * Nu toate câmpurile sunt relevante acum. Câteva dintre ele sunt prezentate grafic mai jos: | ||
- | |||
- | {{http://elf.cs.pub.ro/uso/store/02_ls-l.png}} | ||
- | |||
- | |||
- | ===== 4. Listare a unui director diferit ===== | ||
- | |||
- | Implicit, **''ls''** listează conținutul directorului curent. Putem specifica un alt director pe care să îl listeze dând numele lui ca parametru. | ||
- | |||
- | Listați conținutul directorului **''j_r_r_tolkien''** în două moduri: | ||
- | * fără a intra în el, din directorul **''lab02''** | ||
- | * folosiți **''ls j_r_r_tolkien''** | ||
- | * folosind întâi cd pentru a intra în director, apoi **''ls''** fără alți parametri. | ||
- | |||
- | Observați cum se face diferența între parametri (numele unui director) și flag-uri (care controlează comportamentul comenzii): | ||
- | * un nume este interpretat ca un fișier sau director | ||
- | * un parametru care începe cu minus (**''-''**) are semnificație specială | ||
- | |||
- | |||
- | ===== 5. Listare recursivă. Combinarea flag-urilor ===== | ||
- | |||
- | <hidden> | ||
- | Ce înseamnă recursiv? Mulți nu știu sau nu sunt siguri în anul 1. Explicațiile sunt în contextul USO, nu insistăm pe funcții recursive, tail call optimization sau alte chestii care i-ar dezorienta :) | ||
- | |||
- | </hidden> | ||
- | |||
- | Vreți să obtineți o imagine de ansamblu a directorului **''lab02''**. Va trebui să îi listați recursiv conținutul. | ||
- | * Deschideți din nou manualul comenzii ''ls'' și căutați cuvântul //recursive//. | ||
- | * Dacă nu sunteți deja în directorul **''lab02''**, mutați-vă acolo. | ||
- | * Pentru a merge în directorul părinte, folosiți **''cd ..''**. | ||
- | * Folosiți **''ls -R''** pentru a lista recursiv. | ||
- | |||
- | Este util să listăm directorul atât recursiv, cât și în format lung. | ||
- | * Puteți folosi **''ls -l -R''** pentru acest task. | ||
- | * O formă echivalentă este **''ls -lR''**. Puteți combina flag-uri //scurte// în acest mod. | ||
- | * Majoritatea flagurilor au și o formă //lungă// (de exemplu **''%%--%%recursive''**). Aceste forme se deosebesc prin prefixul de două caractere "minus" și nu pot fi combinate într-un singur "cuvânt". | ||
- | |||
- | <note tip> | ||
- | Precizările de mai sus sunt valabile pentru majoritatea comenzilor. | ||
- | </note> | ||
- | |||
- | |||
- | ===== 6. Căi absolute și căi relative ===== | ||
- | |||
- | <hidden> | ||
- | * Căi absolute și căi relative | ||
- | * Director părinte, director curent | ||
- | * Forme speciale ale cd: fără parametri, cd - | ||
- | </hidden> | ||
- | |||
- | Intrați în directorul **''lab02/douglas_adams''**. Scopul este să ajungeți, folosind **''cd''**, în directorul **''lab02/j_r_r_tolkien/the_lord_of_the_rings''**. Acest lucru se poate face în două moduri: | ||
- | * Folosiți o cale relativă. Căile relative //pornesc din directorul curent//. | ||
- | Astfel, va trebui să specificăm, separate prin **''/''**, directorul părinte, apoi restul căii: | ||
- | |||
- | <code bash> | ||
- | cd ../j_r_r_tolkien/the_lord_of_the_rings | ||
- | </code> | ||
- | |||
- | * Întoarceți-vă în directorul anterior, folosind tot o cale relativă. De ce este nevoie de două componente de tip "director părinte" (**''..''**)? Întrebați asistentul dacă nu este clar. | ||
- | |||
- | <code bash> | ||
- | cd ../../douglas_adams | ||
- | </code> | ||
- | |||
- | * Acum vreți să ajungeți în celălalt subdirector al **''j_r_r_tolkien''**, numit **''the_hobbit''**. Folosiți pentru acest lucru o cale absolută: | ||
- | |||
- | <code bash> | ||
- | cd /home/student/lab02/j_r_r_tolkien/the_hobbit | ||
- | </code> | ||
- | |||
- | * Întoarceți-vă în directorul anterior folosind forma specială a **''cd''**: | ||
- | |||
- | <code bash> | ||
- | cd - | ||
- | </code> | ||
- | |||
- | * Pentru a vă întoarce în directorul home, folosiți **''cd''** fără parametri. | ||
- | |||
- | |||
- | ===== 7. Tab completion ===== | ||
- | |||
- | Până acum, ați scris niște nume de fișiere și directoare lungi. Shell-ul vă poate ajuta completând automat numele unui fișier. | ||
- | |||
- | * Schimbați directorul în home-ul vostru, dacă nu ați făcut asta deja. | ||
- | * Vreți să ajungeți în directorul **''lab02/j_r_r_tolkien/the_lord_of_the_rings''**. Urmați pașii cu atenție și observați ce și cât se completează din nume. | ||
- | * Tastați **''cd la''**, apoi TAB. Se completează numele directorului **''lab02''**. | ||
- | * Continuați //fără a apăsa Enter//: **''j''**, apoi TAB. Se completează din nou tot directorul. | ||
- | * Scrieți prima literă din numele subdirectorului dorit, **''t''**, apoi TAB. Se completează **''the_''**. | ||
- | * Shell-ul completează până la primul prefix neambiguu. | ||
- | * Mai apăsați o dată TAB. Se listează completările posibile. | ||
- | * Tastați **''l''**, pentru a elimina ambiguitatea, apoi TAB. | ||
- | * Acum toată calea este completă, cu mult mai puțin efort din partea voastră. | ||
- | |||
- | <note tip> | ||
- | Restul laboratorului conține intentionat nume de fișiere și directoare foarte lungi, pentru a vă obișnui să folosiți tab completion. | ||
- | </note> | ||
- | |||
- | |||
- | ===== 8. Vizualizarea fișierelor ===== | ||
- | |||
- | Intrați în directorul **''lab02''**. Vizualizați conținutul fișierului **''TODO''** folosind comanda **''cat''**: | ||
- | |||
- | <code bash> | ||
- | cat TODO | ||
- | </code> | ||
- | |||
- | * **Atenție**: Linux este case-sensitive. Contează dacă scrieți **''todo''**, **''TODO''** sau **''Todo''**. | ||
- | * Folosiți tab completion: tastați **''T''** urmat de TAB. | ||
- | * **''cat''** = concatenate. Comanda concatenează conținutul fișierelor date ca parametru și îl afișează pe ecran. | ||
- | |||
- | <note tip> | ||
- | Aici am folosit o situație particulară a comenzii **''cat''**: dacă se dă un singur fișier, conținutul său este concatenat cu ... nimic. Rezultatul este afișarea conținutului fișierului. | ||
- | </note> | ||
- | |||
- | |||
- | ===== 9. Căutarea comenzilor ===== | ||
- | |||
- | O metodă eficientă prin care puteți afla numele unei comenzi este cu ajutorul **''apropos''**. | ||
- | |||
- | * Vreți să aflați numele unei comenzi care șterge fișiere. | ||
- | * Rulați comanda <code bash>apropos "remove files"</code> | ||
- | * Observați linia corespunzătoare comenzii **''rm''** | ||
- | |||
- | * Pentru a afla calea executabilului comenzii **''rm''**, rulați comanda <code bash>which rm</code> | ||
- | |||
- | <note tip> | ||
- | Pentru mai multe informații despre semnificația directorului **''/bin''**, citiți din carte capitolul {{http://books.google.ro/books?id=_JFGzyRxQGcC&lpg=PA532&dq=introducere%20in%20sisteme%20de%20operare&pg=PA70#v=onepage&q&f=false| 4.1.2 Ierarhia sistemului de fișiere}} | ||
- | </note> | ||
- | |||
- | Shell-ul reține o istorie a comenzilor rulate. | ||
- | |||
- | * Rulați comanda <code bash>history</code> | ||
- | * Vreți să afișați doar ultimele 10 comenzi rulate. | ||
- | * Rulați comanda <code bash>history 10</code> | ||
- | |||
- | **Pentru acasă**: Căutați diverse metode prin care puteți vizualiza și edita fișiere. | ||
- | * Folosiți **''apropos editor''**. Testați câteva editoare. | ||
- | |||
- | |||
- | ===== 10. Operații pe fișiere și directoare ===== | ||
- | |||
- | Redenumiți directorul **''j_r_r_tolkien''** astfel încât să conțină numele întreg al autorului: | ||
- | |||
- | <code bash> | ||
- | mv j_r_r_tolkien john_ronald_reuel_tolkien | ||
- | </code> | ||
- | |||
- | <note tip> | ||
- | Rețineți că redenumirea este considerată un caz special de mutare. | ||
- | </note> | ||
- | |||
- | Gandalf este un personaj care apare nu numai în Lord of the Rings, ci și în The Hobbit. Copiați fișierul corespunzător: | ||
- | |||
- | <code bash> | ||
- | cp john_ronald_reuel_tolkien/the_lord_of_the_rings/gandalf john_ronald_reuel_tolkien/the_hobbit | ||
- | </code> | ||
- | |||
- | * Nu uitați că puteți folosi tab completion. | ||
- | * Observați că sursa este un fișier, dar destinația este un director. Ce nume va avea noul fișier creat? | ||
- | |||
- | Cineva a făcut o glumă nesărată și l-a adăugat pe Edward ca personaj în //Hitchhiker's Guide to the Galaxy//. Ștergeți-l din structură: | ||
- | |||
- | <code bash> | ||
- | rm douglas_adams/the_hitchhikers_guide_to_the_galaxy/edward | ||
- | </code> | ||
- | |||
- | Chiar dacă a fost omorât la finalul primei părți, Boromir este un personaj important în trilogia //Lord of the Rings//. Adăugați-l la lista de personaje: | ||
- | |||
- | <code bash> | ||
- | touch john_ronald_reuel_tolkien/the_lord_of_the_rings/boromir | ||
- | </code> | ||
- | |||
- | * **Pentru acasă**: comanda **''touch''** creează un fișier dacă nu există, dar are un alt rol. Citiți primele rânduri din pagina de manual pentru a vedea ce face. | ||
- | * **Pentru acasă**: după ce ați terminat laboratorul și ați înțeles conceptele, profitați de faptul că încă nu aveți teme și vedeți //Hitchhiker's Guide to the Galaxy// și trilogia //Lord of the Rings//. | ||
- | |||
- | |||
- | ===== 11. Crearea de directoare noi ===== | ||
- | |||
- | * Revedeți continutul fișierului **''TODO''** și urmați instrucțiunile. | ||
- | * Creați directorul **''j_k_rowling''** | ||
- | * **''mkdir j_k_rowling''** | ||
- | * **Just for fun**: Aflați numele complet al lui J. K. Rowling și schimbați corespunzător numele directorului. Încercați pe [[http://en.wikipedia.org/|Wikipedia]]. | ||
- | * Creați subdirectorul **''harry_potter''** și câteva fișiere reprezentând personaje din aceste cărți. | ||
- | * Faceți același lucru pentru un autor și o carte care vă place. | ||
- | * **Folosiți caracterul _ (underscore) în loc de spațiu.** | ||
- | |||
- | |||
- | ===== 12. apt-get fără dependențe ===== | ||
- | |||
- | Vizualizați întreg directorul **''lab02''** sub formă de arbore. | ||
- | |||
- | * Intrați în directorul dorit. | ||
- | * Lansați comanda **''tree''**. | ||
- | * Pachetul nu este instalat. | ||
- | |||
- | Multe din programele pe care le vom folosi nu vin preinstalate. Pe Windows trebuia să rulați un executabil pentru a instala un program. | ||
- | |||
- | Pe sistemele Ubuntu, pachetele se instalează utilizând **''apt-get''**. De exemplu, pentru a instala **''tree''** trebuie să rulăm comanda: | ||
- | |||
- | <code bash> | ||
- | apt-get install tree | ||
- | </code> | ||
- | |||
- | Nu puteți instala pachetul, trebuie să fiți **''root''** (de ce?) | ||
- | |||
- | <code bash> | ||
- | sudo apt-get install tree | ||
- | </code> | ||
- | |||
- | <note tip> | ||
- | Este aceeași comandă afișată de shell, când ați încercat să rulați comanda **''tree''**. | ||
- | </note> | ||
- | |||
- | Vi se vor afișa operațiile care se vor executa și efectele asupra spațiului pe disk și apoi veți fi întrebați dacă vreți să continuați. Dintre cele 2 litere, **''y''** și **''n''** una este majusculă, semnificând __opțiunea implicită__: dacă nu introduceți nimic și apăsați doar pe Enter, se va considera respectiva opțiune. | ||
- | |||
- | Verificați că s-a instalat **''tree''**: | ||
- | |||
- | <code bash> | ||
- | tree | ||
- | </code> | ||
- | |||
- | |||
- | ===== 13. apt-get cu dependențe ===== | ||
- | |||
- | Există cazuri în care un pachet depinde de alt pachet. | ||
- | |||
- | Pentru instalarea unui pachet trebuiesc instalate toate dependențele acestuia. | ||
- | |||
- | Din fericire, **''apt-get''** știe să instaleze dependențele lipsă. Testați instalând **''ack-grep''**. | ||
- | |||
- | Observați că se vor instala mai multe pachete decât ați dorit voi. | ||
- | |||
- | Folosind **''man''**, identificați ce face **''ack-grep''**. | ||
- | |||
- | |||
- | |||
- | ===== 14. Package locations ===== | ||
- | |||
- | Vă întrebați poate //de unde se descarcă pachetele?// Vizualizați conținutul fișierului **''/etc/apt/sources.list''**. | ||
- | |||
- | O linie specifică o posibilă sursă de pachete. Formatul este următorul: | ||
- | |||
- | <code bash> | ||
- | deb url version type tags | ||
- | deb-src url version type tags | ||
- | </code> | ||
- | |||
- | unde **''type''** reprezintă versiunea sistemului Ubuntu folosită (numele de cod al versiunii, de exemplu **''natty''** pentru 11.04 Natty Narwhall) | ||
- | |||
- | Puteți modifica oricând acest fișier. De exemplu, în cazul în care locația repository-urilor este prea departe, pentru o instalare mai rapidă se recomandă să modificați toate URL-urile. | ||
- | |||
- | Schimbați URL-urile din **''ro....''** în **''en...''** (amintiți-vă cum făceați replace pe tot fișierul din laboratorul de Vim) | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ====== Hands-On ====== | ||
- | |||
- | ===== 1. Scrierea în fișiere ===== | ||
- | |||
- | * Amintiți-vă, din laboratorul trecut, ce făcea comanda **''echo''**. | ||
- | * Scrieți textul "all done" în fișierul **''TODO''**. | ||
- | * Folosiți formularea **''> TODO''** după parametrii lui **''echo''**. | ||
- | * Vizualizați fișierul folosind **''cat''**. Observați că vechiul conținut a fost suprascris. | ||
- | * Semnați-vă numele în fișierul **''TODO''**. | ||
- | * Folosiți formularea **''%%>>%% TODO''** pentru a nu suprascrie conținutul vechi (mod //append//). | ||
- | |||
- | * **Pentru acasă**: **''echo''** este o formă foarte limitată de a scrie în fișiere. Citiți din carte secțiunea despre editorul Vim. Îl veți folosi într-un laborator ulterior. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | echo "all done" > TODO | ||
- | echo "Haralambie Popescu" >> TODO | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 2. Nume de fișiere și directoare care conțin spații ===== | ||
- | |||
- | * Creați directorul **''isaac asimov''**. Folosiți spații în nume. | ||
- | * Ce observați? Câte directoare și cu ce nume au fost create? | ||
- | * Shell-ul trimite comenzii **''mkdir''** două argumente, **''isaac''** și **''asimov''**. Nu este efectul urmărit. | ||
- | * Creați directorul dorit, încadrând întreg numele prin ghilimele. Astfel, shell-ul va ști că este vorba de un singur argument. | ||
- | * Un alt mod de a face acest lucru este //escaparea// spațiului, precedându-l cu un backslash (**''\''**). | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | mkdir "isaac asimov" | ||
- | # sau | ||
- | mkdir isaac\ asimov | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 3. Ștergerea directoarelor ===== | ||
- | |||
- | * Acum aveți directorul dorit, dar și două în plus. | ||
- | * Folosiți **''rmdir''** pentru a șterge directorul **''isaac''**. | ||
- | * Folosiți **''rm''** pentru a șterge directorul **''asimov''**. | ||
- | * Aveți nevoie de un parametru în plus pentru **''rm''**. Identificați-l folosind pagina de manual sau cartea de USO. | ||
- | * Care este diferența dintre **''rmdir''** și **''rm''** cu acel parametru? Folosiți, din nou, manualul. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | rmdir isaac | ||
- | rm -r asimov | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 4. Legături simbolice (symlinks) ===== | ||
- | |||
- | <hidden> | ||
- | * Ce sunt legăturile simbolice? | ||
- | * Nu acoperim hard link-uri. E suficientă o abordare intuitivă: | ||
- | * un link simbolic e un fișier mic, care conține numele unui alt fișier. | ||
- | * un link hard este un alt nume pentru același fișier. | ||
- | </hidden> | ||
- | |||
- | * Folosiți **''echo''** pentru a scrie textul **''Old wise man''** în fișierul **''john_ronald_reuel_tolkien/the_lord_of_the_rings/gandalf''**. | ||
- | * Afișați conținutul fișierului **''john_ronald_reuel_tolkien/the_hobbit/gandalf''**. De ce nu sunt cele două fișiere identice? | ||
- | * Ștergeți ultimul fișier și creați în locul lui un link simbolic la fișierul din **''the_lord_of_the_rings''**. | ||
- | * Pentru simplitate, intrați întâi în directorul //destinație//, unde veți crea link-ul. | ||
- | * Folosiți o cale relativă pentru a crea link-ul. | ||
- | * Comanda folosită este ''ln'', dar trebuie să folosiți un parametru adițional pentru a specifica faptul că link-ul creat trebuie să fie simbolic. | ||
- | * Folosiți **''ls''** în format lung pentru a confirma că fișierul nou este, de fapt, un link. | ||
- | * Afișați conținutul link-ului pentru a vă asigura că fișierele **''gandalf''** din cele două directoare au același conținut. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | ln -s ../the_lord_of_the_rings/gandalf . | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 5. Globbing ===== | ||
- | |||
- | Afișați conținutul tuturor fișierelor cu extensia **''conf''** din directorul **''/etc''**. | ||
- | * Nu este nevoie să le afișați și pe cele din subdirectoare. | ||
- | * Folosiți o singură comandă **''cat''**. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | cat /etc/*.conf | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 6. Utilizarea discului ===== | ||
- | |||
- | Folosiți **''du''** pentru a afla cât spațiu pe disc ocupă întreg directorul **''lab02''**. | ||
- | * **''du''** = disk usage | ||
- | * afișați doar totalul, nu cât ocupă fiecare fișier în parte | ||
- | * afișați dimensiunea în format //human readable// | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | du -hs lab02 | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | Folosiți **''df''** pentru a afla ce partiții există, ce dimensiune au și cât spațiu este ocupat pe acestea. | ||
- | * afișați dimensiunile în format //human readable// | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | df -h | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 7. Arhivare ===== | ||
- | |||
- | <hidden> | ||
- | * Diferența dintre arhivare și comprimare | ||
- | * Relația dintre tar și gzip; de ce nu folosim direct gzip | ||
- | * Diferența dintre a arhiva un director și a arhiva doar conținutul lui. | ||
- | </hidden> | ||
- | |||
- | Folosiți **''tar''** pentru a arhiva directorul **''lab02''**. | ||
- | * **Atenție**: arhivați tot directorul, nu doar conținutul lui. | ||
- | * Creați două arhive (folosind două comenzi separate): | ||
- | * **''lab02.tar''**, care nu este comprimată | ||
- | * **''lab02.tar.gz''**, comprimată cu gzip | ||
- | |||
- | Ce constatați legat de dimensiunile fișierelor rezultate, raportat la dimensiunea directorului inițial? | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | tar cf lab02.tar lab02 | ||
- | tar czf lab02.tar.gz lab02 | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | <note tip> | ||
- | * Linux oferă suport pentru majoritatea tipurilor de arhive. O particularitate este aceea că pentru arhivele RAR va trebui să instalați de mână pachetul numit **''unrar''**. | ||
- | * În mod normal, fiecare tip de arhivă are un program asociat. Pentru o tratare uniformă a arhivelor, puteți folosi interfața grafică sau un pachet numit **''atool''**. | ||
- | </note> | ||
- | |||
- | |||
- | ===== 8. PPA ===== | ||
- | |||
- | Uneori, unele pachete se găsesc în repository-uri private, aparținând unor dezvoltatori Ubuntu. Acestea se găsesc pe [[https://launchpad.net/ubuntu/+ppas|Personal Package Archives]] (PPA) | ||
- | |||
- | Instalați pachetul [[https://launchpad.net/~gmchess/+archive/ppa|gmchess]]. | ||
- | |||
- | Folosiți acest [[http://linuxers.org/howto/how-install-software-ubuntu-ppa|tutorial]] ca hint. | ||
- | |||
- | |||
- | ===== 9. Instalare manuală deb-uri ===== | ||
- | |||
- | Putem instala un pachet și având descărcat fișierul **''.deb''** asociat. Trebuie să avem toate dependențele instalate sau să le instalăm noi. | ||
- | |||
- | Descărcați [[http://www.skype.com/intl/en-us/get-skype/on-your-computer/linux/downloading.ubuntu32|Skype]] și instalați folosind fișierul **''.deb''** obținut. | ||
- | |||
- | |||
- | ===== 10. Compilare din surse ===== | ||
- | |||
- | În trecut, pe Linux singura metodă de a instala ceva era compilarea din surse. Acum aproape toate sistemele oferă o metodă de instalare utilizând un package manager. Cu toate acestea, există situații când veți dori să instalați din surse (dacă pachetele sunt prea vechi, nu puteți să le luați din altă parte - PPA, deb sau versiunea următoare -). | ||
- | |||
- | <note tip> | ||
- | Sistemele tip rolling-release folosesc mai des instalarea din surse. __Gentoo__ și __Arch__ sunt două asemenea sisteme (__Arch__ are și package manager - **''pacman''** și **''yaourt''**). | ||
- | </note> | ||
- | |||
- | Instalați din surse [[http://nmap.org/dist/nmap-5.51.tar.bz2|nmap]] | ||
- | |||
- | |||
- | ===== 11. update-alternatives ===== | ||
- | |||
- | Există situații când avem mai multe programe cu aceeași funcționalitate: Firefox și Chromium pentru browsing, **''vim''** și **''nano''** pentru editare. | ||
- | |||
- | Programele care au nevoie, de exemplu, de un editor, nu vor apela direct unul din aceste editoare. În schimb, vor încerca să apeleze un editor generic, numit **''editor''**. Administratorul sistemului va configura legătura între **''editor''** și editorul folosit | ||
- | |||
- | Folosind **''update-alternatives''** setați ca **''editor''** **''vim.basic''**. Comanda **''visudo''** ar trebui să deschidă un editor **''vim''**. | ||
- | |||
- | |||
- | ===== 12. symlinks ===== | ||
- | |||
- | În spate, **''update-alternatives''** realizează un symlink între cele 2 executabile. | ||
- | |||
- | Verificați, utilizând **''which''** și **''ls -l''** care este executabilul apelat în momentul rulării comenzii **''vi''**. | ||
- | |||
- | Faceți astfel încât **''game''** să ruleze **''mahjongg''** (folosiți **''which''** pentru a vedea locația **''mahjongg''**). | ||
- | |||
- | |||
- | ===== 13. symlinks și PATH ===== | ||
- | |||
- | În anumite cazuri veți dori să instalați un pachet din surse dar nu vreți ca resursele să fie instalate în directoarele standard (**''/usr/bin''**, **''/usr/lib''** de exemplu). | ||
- | |||
- | Pentru a putea rula executabilul instalat, puteti proceda în mai multe moduri: | ||
- | |||
- | * adăugați la **''PATH''** calea către noul executabil | ||
- | * realizați un alias pentru executabil | ||
- | * realizați un symlink pentru executabil și plasați link-ul într-un director din **''PATH''** | ||
- | |||
- | Primele două soluții vor fi analizate într-un laborator ulterior. Modul de aflare al directoarelor din **''PATH''** tot atunci. | ||
- | |||
- | Descărcați [[http://elf.cs.pub.ro/uso/store/test_ln_s|următorul]] program simplu. Vrem să-l rulăm ca pe o comandă oarecare. Realizați un link simbolic pentru **''test_ln_s''** în **''/bin''**. Ar trebui ca rulând comanda **''test_ln_s''** să putem rula executabilul. | ||
- | |||
- | |||
- | ===== 14. dpkg ===== | ||
- | |||
- | Pe sistemele Debian based (Ubuntu e unul din ele) există și **''dpkg''** ca manager de pachete. Dacă avem acces la **''apt-get''**, **''dpkg''** e folosit doar pentru aflarea de informații înainte de instalarea unui pachet. | ||
- | |||
- | Folosiți **''dpkg''** pentru a __lista__ toate pachetele legate de **''git''** (hint: **''*git*''**). | ||
- | |||
- | Cine este autorul original pentru pachetul **''tree''**? | ||
- | |||
- | Ce fișiere au fost instalate în sistem odată cu pachetul **''ack-grep''**? | ||
- | |||
- | Hint: vedeți în manual ce fac opțiunile de la **''dpkg-query''**. | ||
- | |||
- | ===== 15. Dezinstalarea unui pachet ===== | ||
- | |||
- | **''gwibber''** este un pachet interesant pentru un utilizator obișnuit, dar nu și pentru laboratorul de USO. Dezinstalați-l. | ||
- | |||
- | Găsiți o metodă de a dezinstala pachetul, împreună cu toate fișierele sale de configurare. | ||
- | |||
- | * Folosiți pagina de manual a utilitarului **''apt-get''**. | ||
- | * Nu uitați să precedați comanda cu **''sudo''**, pentru că este vorba despre un task administrativ. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | sudo apt-get purge gwibber | ||
- | # sau | ||
- | sudo apt-get remove gwibber | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | ===== 15. Readline ===== | ||
- | |||
- | [[http://tiswww.case.edu/php/chet/readline/rltop.html|Readline]] este o facilitate care ajută la editarea eficientă a comenzilor pe care le scriem în shell. Vom explora câteva concepte utile. | ||
- | |||
- | * Creați un director care se numește **''supercalifragilisticexpialidocious''**. | ||
- | |||
- | <note tip> | ||
- | Combinația Shift-Insert este o scurtătură pentru Paste în terminal. Puteți face copy-paste pe numele de mai sus. | ||
- | </note> | ||
- | |||
- | * Ce rol are combinația de taste **''Alt-.''** (Alt și punct)? | ||
- | * Folosiți tasta **''Alt''** din stânga tastaturii. | ||
- | * Folosiți această combinație pentru a șterge directorul creat. | ||
- | |||
- | * Repetați ultima comandă de tip **''mkdir''** folosind //reverse search//. Puteți citi mai multe despre acest concept [[http://www.linuxjournal.com/article/7385?page=0,2|aici]], secțiunea //Searching the command history//. | ||
- | |||
- | * Scrieți în terminal comanda **''rm -rf /tmp''**. Nu apăsați enter. | ||
- | * Folosiți combinația de taste **''Alt-#''** (Alt și diez). | ||
- | * Ce s-ar fi întâmplat dacă executam comanda? | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | mkdir supercalifragilisticexpialidocious | ||
- | rm **''Alt-.''** | ||
- | **''Ctrl-r''** + mkdir | ||
- | rm -rf **''Alt-#''** | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 16. Istoria directoarelor ===== | ||
- | |||
- | * Reamintiți-vă ce face forma **''cd -''**. Identificați o problemă a ei. Ce se întâmplă dacă o folosim de două ori consecutiv? | ||
- | * Explicați funcționarea comenzilor **''pushd''** și **''popd''**. Cum putem afișa stiva de directoare, fără a o modifica? | ||
- | * **''pushd''** și **''popd''** sunt comenzi //built-in// ale shell-ului. Drept urmare, nu au propria pagină de manual. | ||
- | * Shell-ul pe care îl folosim se numește **''bash''**. Folosiți pagina de manual aferentă pentru a găsi semnificația comenzilor **''pushd''** și **''popd''**. | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | pushd lab02 | ||
- | pushd j_r_r_tolkien | ||
- | pushd the_lord_of_the_rings | ||
- | popd | ||
- | popd | ||
- | popd | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ===== 17. chroot ===== | ||
- | |||
- | Folosiți **''chroot''** pentru a face ca **''pwd''** în directorul | ||
- | **''/tmp/chroot_jail''** să returneze **''/''**. Puteți naviga în exteriorul | ||
- | directorului **''/tmp/chroot_jail''**, după ce ați făcut **''chroot''**? | ||
- | |||
- | Listați conținutul directorului din **''chroot''**. Faceți astfel încât listarea | ||
- | să fie posibilă (pentru a ieși din jail folosiți **''exit''**) | ||
- | |||
- | <note hint> | ||
- | Construiți în directorul **''/tmp/chroot_jail''** directoare pentru | ||
- | executabilele **''bash''**, **''pwd''** (folosiți **''which''** pentru a afla locația | ||
- | lor) și pentru bibliotecile necesare acestor programe (folosiți **''ldd''** | ||
- | pentru a le afișa). | ||
- | </note> | ||
- | |||
- | <note tip> | ||
- | Folosiți aplicații precum **''chroot''** pentru a crea un mediu virtual, protejat, pentru testarea unor aplicații. Tehnica este denumită [[http://en.wikipedia.org/wiki/Sandbox_%28computer_security%29|sandboxing]]. | ||
- | </note> | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | $ cd /tmp/ | ||
- | $ mkdir chroot_jail | ||
- | $ which bash | ||
- | /bin/bash | ||
- | $ mkdir chroot_jail/bin | ||
- | $ cp /bin/bash chroot_jail/bin/ | ||
- | $ which pwd | ||
- | /bin/pwd | ||
- | $ cp /bin/pwd chroot_jail/bin/ | ||
- | $ ldd /bin/bash | ||
- | linux-gate.so.1 => (0x00867000) | ||
- | libncurses.so.5 => /lib/libncurses.so.5 (0x00949000) | ||
- | libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00cde000) | ||
- | libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00685000) | ||
- | /lib/ld-linux.so.2 (0x009d6000) | ||
- | $ mkdir chroot_jail/lib | ||
- | $ mkdir -p chroot_jail/lib/tls/i686/cmov | ||
- | $ cp /lib/libncurses.so.5 chroot_jail/lib/ | ||
- | $ cp /lib/tls/i686/cmov/libdl.so.2 chroot_jail/lib/tls/i686/cmov/ | ||
- | $ cp /lib/tls/i686/cmov/libc.so.6 chroot_jail/lib/tls/i686/cmov/ | ||
- | $ cp /lib/ld-linux.so.2 chroot_jail/lib/ | ||
- | $ ldd /bin/pwd | ||
- | linux-gate.so.1 => (0x008fc000) | ||
- | libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00606000) | ||
- | /lib/ld-linux.so.2 (0x004b5000) | ||
- | $ sudo chroot chroot_jail/ | ||
- | bash-4.1# pwd | ||
- | / | ||
- | bash-4.1# cd .. | ||
- | bash-4.1# ls | ||
- | bash: ls: command not found | ||
- | bash-4.1# exit | ||
- | $ which ls | ||
- | /bin/ls | ||
- | $ cp /bin/ls chroot_jail/bin/ | ||
- | $ ldd /bin/ls | ||
- | linux-gate.so.1 => (0x007d4000) | ||
- | librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00a6e000) | ||
- | libselinux.so.1 => /lib/libselinux.so.1 (0x00ec3000) | ||
- | libacl.so.1 => /lib/libacl.so.1 (0x00bdc000) | ||
- | libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000) | ||
- | libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x003fc000) | ||
- | /lib/ld-linux.so.2 (0x00601000) | ||
- | libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00a23000) | ||
- | libattr.so.1 => /lib/libattr.so.1 (0x00773000) | ||
- | $ cp /lib/tls/i686/cmov/librt.so.1 chroot_jail/lib/tls/i686/cmov/ | ||
- | $ cp /lib/libselinux.so.1 chroot_jail/lib/ | ||
- | $ cp /lib/libacl.so.1 chroot_jail/lib/ | ||
- | $ cp /lib/tls/i686/cmov/libpthread.so.0 chroot_jail/lib/tls/i686/cmov/ | ||
- | $ cp /lib/ld-linux.so.2 chroot_jail/lib/ | ||
- | $ cp /lib/tls/i686/cmov/libdl.so.2 chroot_jail/lib/tls/i686/cmov/ | ||
- | $ cp /lib/libattr.so.1 chroot_jail/lib/ | ||
- | $ sudo chroot chroot_jail/ | ||
- | bash-4.1# ls | ||
- | bin lib | ||
- | bash-4.1# exit | ||
- | exit | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | FIXME |