= 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}}}