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 <fișier> creare fișier (modificare timestamp)
mkdir <director creare director
rm ștergere
cd <director> mutare din directorul curent în director
ls <director> fără a specifica un director ls va afișa conținutul directorului curent
cp <sursă> <destinație> copiere de la sursă la destinație
mv <sursă> <destinație> 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 <pachet> instalare pachet
apt-get remove <pachet> 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 <ENTER>
  • 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 "<comandă> <argumente>". 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 <pattern> <file>
  • This is bad:
    cat <file> | grep <pattern>

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

  • 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 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
cdl.txt · Last modified: 2015/03/07 11:02 by gmuraru
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki