= Introduction to Linux = === Reminders === Pentru a deschide un terminal puteți fie să navigați la o iconiță specifică (**nu faceți asta**), fie puteți utiliza o anumită combinație de taste ^Shortcut ^ Desciere ^ | **''ALT + F2''** | urmat de numele (pseudo)terminalului: în cazul nostru {{{gnome-terminal}}}| | **''CTRL + ALT + T''** | deschide un nou terminal | | **''CTRL + SHIFT + T''** | deschide un nou tab în terminalul curent | | **''CTRL + PageUp/PageDown''** | navigare printre tab-urile deschide | | **''CTRL + ALT + Arrows''** | navigare printre workspace-uri | |**''CTRL + ALT + SHIFT + Arrows''** | mutare fereastră focusată într-un nou workspace | ^ Comandă ^ Descriere ^ | **''touch ''** | creare fișier (modificare timestamp) | | **''mkdir ''** | mutare din directorul curent în {{{director}}} | | **''ls ''** | fără a specifica un director {{{ls}}} va afișa conținutul directorului curent | | **''cp ''** | copiere de la sursă la destinație | | **''mv ''** | mutare de la sursă la destinație; folosit și la redenumire | | **''echo''** | afișare la ieșire șirul primit ca argument | | **''cat''** | afișare conținut fișier | | **''ps''** | afișare informații despre procese | | **''kill''** | trimite un semnal unui proces | | **''top''** | afișare în mod interactiv informații despre procese | | **''tr''** | transformă sau șterge caractere dintr-un flux de text | | **''sed''** | manipulare flux de text; poate face înlocuiri, ștergeri etc. | | **''cut''** | decupează anumite coloane dintr-un fișier formatat | | **''head''** | afișare primele linii din fișier | | **''tail''** | afișare ultimele linii din fișier | | **''grep''** | caută și afișează liniile dintr-un text ce urmează respectă un pattern | | **''apt-get install ''**| instalare pachet | | **''apt-get remove ''** | dezinstalare pachet (rămân fișierele de configurare) | | **''apt-get autoremove''** | ștergere pachete instalate pentru a satisface anumite dependințe | ===Basic stuff=== 1. Scrieți la prompt: cd /h și apoi folosiți tasta {{{TAB}}} pentru autocompletare. * Pentru listarea tuturor comenzilor ce încep cu {{{ap}}}, scrieți acest prefix în terminal și folosiți de două ori consecutiv tasta {{{TAB}}}. 2. Scrieți (dar nu executați) la prompt următoarea comandă de instalare a unui pachet: apt-get install ekiga * Folosiți combinația de taste {{{Ctrl + a}}} pentru a vă deplasa la începutul comenzii. Similar, folosiți {{{Ctrl + e}}} pentru a vă deplasa înapoi la finalul comenzii. * Folosind săgețile, plasați cursorul după cuvântul {{{get}}}. După aceea, folosiți combinația {{{Ctrl + k}}}. Observați efectul. * Pentru a "lipi" ce s-a șters ultima dată, folosiți {{{Ctrl + y}}}. * După ce comanda este din nou completă, din aceeași poziție a cursorului, folosiți {{{Ctrl + w}}} și observați ce efect are. 3. Rulați următoarea comandă: ping -c 1 google.com > result.out * După aceea, folosiți combinația de taste {{{Alt + .}}}. Observați efectul acesteia. * Folosiți de mai multe ori {{{Alt + .}}}. Care este rezultatul? * Ștergeți ce s-a afișat la punctul anterior. Rulați comanda: echo $_ Care este diferența față de {{{Alt + .}}}? 4. În același terminal în care ați tastat comenzile de mai sus, rulați comanda: ping -c 1 8.8.8.8 * Apăsați {{{Ctrl + r}}} și în noul prompt apărut tastați {{{ping}}}. Mai apăsați o dată {{{Ctrl + r}}}. Observați ce se afișează. * Folosiți tasta {{{ENTER}}}. Apoi repeteți primul pas și folosiți {{{ESC}}}. Observați diferența dintre cele două utilizări. 5. Rulați comanda de schimbare a directorului: cd /etc * După aceea, folosiți: cd - pwd Observați ce efect are. 6 Fiecare comandă din Linux este însoțită de pagini de manual. Pentru a accesa manualul editorului {{{vim}}}, folosiți comanda: man vim * Navigați prin manual folosind {{{PageUp}}} și {{{PageDown}}}. * Pentru a căuta prin manual după cuvântul {{{fork}}}, folosiți: /fork * Deplasați-vă între ocurențele cuvântului folosind {{{n}}} și {{{N}}}. 7. Pentru a obține o scurtă descriere referitoare la o comandă, cât și secțiunea din manual în care se află, tastați comanda: whatis make * După aceea, folosiți comanda: apropos make Observați diferența dintre ce returnează fiecare comandă. 8. Manualele sunt grupate pe secțiuni. Pentru a vedea ce conține fiecare secțiune, consultați manualul utilitarului {{{man}}}: man man și consultați tabelul aflat în paragraful {{{Description}}}. * Rulați comanda: man printf În ce secțiune se află pagina? * Pentru a afla informații despre funcția de bibliotecă {{{printf}}}, rulați comanda: man 3 printf ===One-liners=== 1. Vrem să afișăm informații despre utilizatorii din sistem. * Trebuie inspectat fișierul {{{/etc/passwd}}}. * Amintiți-vă formatul fișierului {{{/etc/passwd}}}: cat /etc/passwd * Vrem să selectăm coloanele corepunzătoare numelor și UID-urilor utilizatorilor din sistem: cut -d ':' -f 1,3 /etc/passwd * Observați output-ul. Sortarea după o coloană specificând un delimitator se poate face astfel: cut -d ':' -f 1,3 /etc/passwd | sort -t ':' -k2n * Vrem să facem rezultatul mai "vizibil". Înlocuiți ":" cu tab-uri(Hint: {{{tr}}}) * Modificați one liner-ul astfel încât să selecteze și home-ul utilizatorilor și să sorteze după numele utilizatorilor. 2. Vrem să afișăm cele mai folosite 10 comenzi. * Pentru aceasta trebuie să inspectăm fișierul {{{~/.bash_history}}}: cat ~/.bash_history * Pot exista comenzi înlănțuite într-o comandă folosind operatorii | și ;. Vrem să separăm comenzile printr-un newline: cat ~/.bash_history | tr "\|\;" "\n" * Eliminăm spațiile de la început dacă există folosind {{{sed}}}: cat ~/.bash_history | tr "\|\;" "\n" | sed "s/^ //g" * Observați output-ul. Ar trebui să fie de forma {{{" "}}}. Vrem să extragem doar comenzile. Remember: cut -d "delimiter" -f fields * Sortați output-ul. * Vrem să eliminăm duplicatele și să vedem de câte ori a fost folosită fiecare comandă(Hint: man {{{uniq}}}, /count}}}) * Sortați output-ul, numeric de data aceasta. * Selectați cele mai folosite 10 comenzi. * Afișați a 5-a cea mai folosită comandă. 3. Vrem să afișăm cele mai mari 15 fișiere dintr-un director. Remember: du * Pentru a afișa fișierele împreună cu dimensiunea acestora din {{{/var/log/}}}: du /var/log/* * Sortați descendent și numeric(Hint: {{{man sort}}}, /reverse). * Selectați primele 15 fișiere. * Selectați fișierele de pe pozițiile 5-10 din lista sortată. 4. Vrem să aflăm numele utilizatorilor care s-au autentificat în sistem în ziua de //Vineri//. * Pentru a determina ce utilizatori au folosit sistemul în ultima perioada se folosește {{{last}}}: last * Pentru a selecta ziua de //Vineri//: last | grep "Fri" * Selectați coloana corespunzătoare numele de utilizator. * Sortați ascendent lista. * Eliminați duplicatele. ===Notes=== * Utilizați {{{ALT + .}}} pentru a extrage argumentului comenzilor date anterior. * Pentru rularea ultimei comenzi utilizați {{{!!}}}: apt-get install sl Ups...forget to sudo :( sudo !! * This is good: grep * This is bad: cat | grep == Advanced shell scripts == 1 Creați scriptul {{{backup-script.sh}}} în {{{/home/student}}} care copiază toate fișierele cu extensia {{{.conf}}} din {{{/etc}}}. * Scriptul primește ca argument un string care reprezintă numele directorului în care vor fi copiate fișierele cu extensia {{{.conf}}}: ./backup-script.sh "backup-dir" * Dacă directorul nu există, acesta va fi creat. * Dacă directorul există, conținutul său va fi salvat într-o arhivă de forma {{{nume_dir.zip}}} și conținutul directorului va fi șters. * Dacă directorul există și este gol, se va scrie direct în el. * **Din linia de comandă** căutați toate fișierele din {{{/etc}}} care se termină în {{{.conf}}}: Hint: man find /type, /name * În script folosiți {{{find}}} cu {{{xargs}}} pentru a copia fișierele în director-ul de backup: Comanda {{{xargs}}} este proiectată să construiască liste de argumente și să execute alte comenzi. Pentru a aflat statistici despre fișierele din directorul curent: ls | xargs stat Despre folosirea comenzii {{{xargs}}} puteți afla mai multe de [[http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/|aici]]. * Folosiți comanda {{{tree}}} pentru a verifica că fișierele au fost copiate. 2 Creați scriptul {{{backup-tree-script.sh}}} care copiază toate fișierele cu extensia {{{.conf}}} din {{{/etc}}} și păstrează ierarhia. * Scriptul primește ca argument un string care reprezintă numele directorului în care vor fi copiate fișierele cu extensia {{{.conf}}}. * Ierarhia trebuie păstrată: * Fișierul {{{/etc/init/rsyslog.conf}}} va fi copiat în {{{$DIR/etc/init/rsyslog.conf}}}. * Fișierul {{{/etc/host.conf}}} va fi copiat în {{{$DIR/etc/host.conf}}}. * Puteți să folosiți comanda {{{find}}} de la exercițiul anterior. * Cu un {{{for}}} puteți să parcurgeți lista returnată de comanda find. Remember: for i in $(ls); do stat $i done * Din bucla for extrageți numele intrării și numele directorului(Hint: {{{dirname}}}) * După ce ați extras numele directorului, creați directorul dacă nu există(Hint: {{{mkdir}}}, /parent). * Copiați fișierul în directorul asociat printr-un simplu {{{cp}}}. * Folositi comanda {{{tree}}} pentru a verifica că ierarhia a fost menținută. Exercițiul se poate rezolva și utilizând utilitarul {{{cpio}}} cu parametrul {{{-p}}} sau {{{--pass-through}}}. Mai multe informații puteți găsi [[http://www.thegeekstuff.com/2010/08/cpio-utility/|aici]]. 3 Creați un script care să poată crea arhive {{{.zip}}} {{{.tar.gz}}} {{{.tar.bz2}}} ale copiei ierarhiei de la exercițiul 2. * Scriptul primește 2 argumente. * Primul argument reprezintă directorul care va fi arhivat recursiv. * Al doilea argument reprezintă un string care reprenzintă tipul arhivei, din mulțimea: {"zip", "gz, "bz2"}. * Dacă nu este dat al doilea argument, arhivarea se va face folosind utilitarul {{{zip}}}. * Inițial, în script va fi rulat scriptul {{{backup-tree-script.sh}}} pentru a copia ierarhia. * Nu uitați să-i pasați numele directorului ca argument. * Apoi, se va realiza arhivarea. 4 Creați un script {{{my-adduser.sh}}} care să adauge un utilizator nou în sistem în mod interactiv. * Scriptul verifică dacă este executat de un utilizator privilegiat. În caz contrar va fi afișat un mesaj de eroare și va fi întreruptă execuția. * Cere numele utilizatorului și verifică că nu există deja în sistem. Dacă nu există deja, user-ul va fi adăugat în sistem, altfel va fi afișat un mesaj de eroare și va fi întreruptă execuția. * Cere o parolă(fără a o afișa) și se asigură că are mai mult de 8 caractere și cere să fie reintrodusă. * Se va specifica calea către home-ul utilizatorului. Dacă nu este specificată o cale, se va folosi {{{/home/$user-name}}}. * Scriptul va cere în continuare grupul principal, care va fi același cu numele utilizatorului dacă nu este specificat. ==Bonus== {{ guess_the_number.png?300x300 | Guess the Number}} * Realizați un script numit {{{guess.sh}}} în care veți implmenta o versiune minimală a jocul "Guess the number". * Scriptul primește de la {{{stdin}}} intervalul în care se va genera numărul care trebuie ghicit. ** Intervalul va fi primit sub următoarea formă {{{[lower_bound--upper_bound]}}}, voi trebuind să extrageți limita superioară și pe cea inferioară. * Pentru calcularea numărului de încercări posibile utilizați {{generate-number.zip | acestă}} arhivă; conține un executabil. ** Executbilul primește de la {{{stdin}}} un număr (diferența între upper și lower) și afișează la {{{stdout}}} numărul de încercări. * La fiecare introducere a unui număr, va trebui să specificați dacă numărul căutat este mai mare sau mai mic decât numărul introdus. * Se va afișa un mesaj corespunzător în cazul în care nu se găsește numărul. * Dacă numărul este găsit, va trebui sa se introducă o nouă linie în fișierul {{{scores}}} (se va crea dacă nu există), o intrare fiind sub următoarea formă: nume --> scor --> inteval --> data ** nume - numele jucătorului ** scor - număr încercări rămase * 100 ** interval - intervalul în care s-a generat numărul random ** data - data curentă, scrisă sub forma {{{zi-lună-an}}}