Sunteți pe pagina 1din 73

1.

INTRODUCERE N LINUX................................................................................. 2
1.1. Istoria Unix i GNU-Linux ............................................................ 2
1.1.1. Standarde Unix....................................................................... 3
1.1.2. GNU-Linux ............................................................................ 3
1.2. Kernelul.......................................................................................... 4
1.3. Interpretorul de comenzi ................................................................ 4
1.4. Sistemul de fiiere .......................................................................... 7
1.4.1. Lucrul cu directoare i fiiere ................................................ 9
1.1.1. Lucrul cu coninutul fiierelor ............................................. 13

2. REDIRECIONRI I COMENZI .................................................................... 16


2.1. Fiierele standard n Unix ............................................................ 16
2.2. Redirecionarea intrrilor i ieirilor standard ............................. 16
2.2.1. Redirecionarea ieirii standard............................................ 17
2.2.2. Redirecionarea erorilor ....................................................... 19
2.2.3. Redirecionarea intrrii standard .......................................... 19
2.3. Conectarea proceselor .................................................................. 20
2.4. Filtre ............................................................................................. 21
2.5. Cutarea fiierelor ........................................................................ 25

3. EDITOARE DE TEXT ........................................................................................ 27


3.1. Editorul de text vim ..................................................................... 27

4. MANAGEMENTUL PACHETELOR N UBUNTU .......................................... 31


4.1. Managerul de pachete .................................................................. 31
1.1. Sistemul de administrare a pachetelor ......................................... 32

5. CONTROLUL ACCESULUI LA FIIERE I DIRECTOARE.......................... 34


5.1. Drepturi de acces.......................................................................... 34
1.1.1. Permisiuni implicite ............................................................. 38
1.1.2. Permisiuni avansate ............................................................. 38
1.1.3. Liste de control al accesului ................................................. 39
1.1.4. Legturi simbolice i hard .................................................... 41

6. MANAGEMENTUL UTILIZATORILOR .......................................................... 44


6.1. Adugarea i tergerea unui utilizator.......................................... 45
6.2. Modificarea opiunilor pentru un utilizator.................................. 47
6.3. Gestionarea grupurilor ................................................................. 49
6.4. Comenzi privilegiate .................................................................... 50
6.5. Identificatorii reali i efectivi ....................................................... 53

7. INTERPRETORUL DE COMENZI .................................................................... 54


7.1. Terminal vs interpretor de comenzi ............................................. 54
7.2. Mediul de lucru bash .................................................................... 55
7.2.1. Parametri i variabile ........................................................... 55
7.2.2. Istoricul interpretorului de comenzi ..................................... 61
7.2.3. Generarea dinamic a numelor de fiiere............................. 63
7.2.4. Procesarea comenzilor i interpretarea argumentelor .......... 67
7.2.5. Aliasuri................................................................................. 69
7.2.6. Operatori de control ............................................................. 70

1. INTRODUCERE N LINUX

1
Linux nu este Unix, dar o prezentare a sistemelor Linux nu poate ncepe fr a vorbi
de Unix.

1.1. Istoria Unix i GNU-Linux

Prima versiune de Unix a fost scris n anul 1969 de membrii laboratoarelor Bell din
cadrul corporaiei AT&T (printre care Ken Thompson, Dennis Ritchie i Brian Kerningham),
fiind proiectat ca sistem de operare pentru calculatoarele PDP de la Digital Equipment. n
1973, Unix a fost rescris n C, limbaj de programare creat de Kerningham i Ritchie tocmai n
acest scop, urmrindu-se ca Unix s fie uor de portat pe toate platformele hardware existente.
n ianuarie 1974, UCB (University of California at Berkeley) a achiziionat de la Bell Labs
Unix Version 4 n scopul de a aduga alte funcionaliti. Mai trziu n acel an, AT&T a
nceput s licenieze Unix-ul la universiti. ntre 1974 i 1979, UCB i AT&T au dezvoltat
copii independente de Unix. Prima versiune folosit extensiv n afara laboratoarelor Bell a
fost Unix System, Sixth Edition, cunoscut sub numele de V6. Simplitatea design-ului,
cuplat cu faptul c a fost distribuit mpreun cu codul surs, a condus la preluarea i
dezvoltarea rapid. Versiunea V6 a fost preluat i folosit ca instrument de predare de mai
multe universiti, printre cele mai importante numrndu-se UCB, JHU (Johns Hopkins
University) i UNSW (University of New South Wales). Berkeley a distribuit un set de
programe suplimentare numit 1BSD (First Berkeley Software Distribution), care mai trziu a
devenit un sistem de operare de sine stttor. Prin 1978, diferitele versiuni de Unix nglobau
majoritatea funcionalitilor regsite n prezent, dar nu toate ntr-o singur versiune. n 1979,
AT&T a schimbat regulile jocului, atribuind o licen proprietar versiunii lor de Unix i
ncepnd s o vnd comercial. Altfel spus, au nregistrat marca Unix i au stabilit un pre
prohibitiv.
Codul BSD era protejat de o licen mult mai generoas dect codul AT&T i nu
obliga la plata unei licene. Rezultatul a fost c mare parte din codul surs BSD a fost
ncorporat n diferite variante comerciale de Unix. La momentul lansrii, 4.3BSD aproape c
nu mai coninea nimic din codul surs AT&T original. FreeBSD, NetBSD i OpenBSD
descind toate din 4.3BSD, fr a conine nimic din codul surs AT&T, i fr drepturi la
marca Unix, dar foarte multe variante comerciale de Unix folosesc codul lor. n consecin,
exist dou versiuni majore de Unix - cele bazate pe versiunea BSD i cele bazate pe
versiunea AT&T.
n anii 1980 i 1990, majoritatea companiilor productoare de servere i staii de
lucru i echipau produsele cu propriile variante comerciale de Unix. Printre acestea erau

1
http://www.compsci.hunter.cuny.edu/~sweiss/course_materials/unix_lecture_notes/chapter_01.pdf
Tru64 de la Digital, HP-UX de la Hewlett Packard, IBM AIX, SGI IRIX, SUN Solaris.
n acest context, n 1991, Linus Torvalds a dezvoltat prima variant de Linux. Spre
deosebire de BSD, Linux a fost dezvoltat de la zero i a profitat de existena proiectului GNU,
care deja rescrisese o mare parte din utilitarele Unix. Este mult mai diferit de AT&T dect
BSD. Linus, pe atunci student la Universitatea din Helsinki, folosea Minix, un sistem Unix
ieftin creat n scop educaional. Deranjat de imposibilitatea distribuirii modificrilor aduse
codului surs (din cauza licenei Minix) i de deciziile de proiectare luate de autorul Minix2-
ului, Andrew Tanenbaum, decide s scrie propriul sistem de operare i, la finele anului 1991,
ncarc pe Internet o prim versiune. Din acel moment, numrul celor care lucreaz la Linux a
crescut n mod impresionant. n prezent, Linux este folosit pe o varietate foarte mare de
platforme, ncepnd de la telefoane mobile inteligente pn la clustere dedicate calculelor de
nalt performan.
n 1993, AT&T a renunat la marca Unix vnznd-o corporaiei Novell, care un an
mai trziu a vndut-o la rndul su consoriului industrial X/Open. n prezent ntlnim mai
multe distribuii de Unix, fiecare cu propriul comportament, cum ar fi sistemele Solaris i
UnixWare bazate pe SVR4, versiunea AT&T lansat n 1989, i FreeBSD bazat pe
distribuiile Berkeley. Sistemele Linux sunt hibride, la fel AIX, IRIX i HP-UX. Ceea ce leag
toate aceste sisteme sunt standardele. Standardele definesc sistemele de familia Unix.

1.1.1. Standarde Unix

Un standard Unix acceptat la scar larg este POSIX (Portable Operating System
Interface [for Unix]). Cea mai recent versiune POSIX este IEEE Std 1003.1-2008, numit i
POSIX.1-2008. Standardul POSIX.1-2008 consolideaz standardele majore dinaintea sa,
inclusiv POSIX.1 i SUS (Single UNIX Specification). Standardul SUS a derivat dintr-un
standard scris n 1994, cunoscut sub numele de X/Open System Interface i a fost revizuit de
mai multe ori, ultima dat n 2003 de un consoriu industrial care deine i marca Unix, numit
The Open Group (format n 1996 prin contopirea X/Open i OSF - Open Software
Foundation). Acest consoriu folosete SUS pentru a defini interfeele pe care trebuie s le
recunoasc o implementare pentru a se numi sistem Unix. POSIX.1-2008 i SUSv4
standardizeaz colecia de apeluri de sistem, bibliotecile de sistem i utilitare care fac un
sistem s se comporte ca Unix. Colecia de apeluri de sistem definete kernelul Unix.
Apelurile i bibliotecile de sistem constituie interfaa de programare a aplicaiilor (API) Unix.
Faptul c aceste standarde exist nu nseamn c toate implementrile Unix ader la
ele. Dei sisteme ca AIX, Solaris i Mac OS X sunt compatibile complet cu POSIX,
majoritatea sunt aproape compatibile. Sistemele FreeBSD i Linux fac parte din aceast
categorie.

1.1.2. GNU-Linux

Aadar, Unix reprezint o familie de sisteme de operare care implementeaz o


interfa de programare a aplicaiilor comun, numit POSIX. POSIX este o colecie de
standarde definit de IEEE (Institute of Electrical and Electronics Engineers) care specific
cerinele ce trebuie ndeplinite de o aplicaie pentru a fi compatibil cu Unix. Acest standard
poate fi extins i pentru alte sisteme de operare. Linux ncearc s respecte acest standard i
din aceast cauz este compatibil cu Unix, dar nu este Unix. Linux mprumut multe idei de
la Unix i implementeaz API-ul Unix (aa cum este definit de POSIX i SUS), dar nu este un
descendent direct al codului surs Unix. Cnd s-a dorit, acesta a deviat de la calea urmat de
implementrile sistemelor Unix. Totui, nu a abandonat niciodat obiectivele generale de
proiectare Unix i a respectat interfeele de programare standardizate. Spre deosebire de alte
sisteme de operare, nicio firm nu este proprietara sistemului Linux. Mai mult dect att, el

2
Polemica continu i n ziua de astzi. Site-ul sistemului Minix este www.minix3.org
este protejat de licena GPL (GNU Public License). GPL stipuleaz faptul c programele pot
fi copiate i utilizate gratuit cu condiia de a se permite i altora s fac acelai lucru.
Conceptul aparine iniiatorului micrii FSF (Free Software Foundation), Richard Stallman,
iniiatorul proiectului GNU. Proiectul GNU a luat fiin din ncercarea acestuia de a crea un
sistem de operare i un mediu de dezvoltare compatibil cu Unix. Printre aplicaiile distribuite
n cadrul proiectului GNU sub licen public sunt: gcc (compilator de C), g++ (compilator de
C++), gdb (utilitar pentru depanare), GNU Make (versiune de Unix Make), bash (interpretor
de comenzi), GNU Emacs (editor de text).
Sistemul Linux propriu-zis este alctuit din kernel (aportul principal adus de Linus
Torvalds) i un numr de unelte de programare i utilitare de sistem, dintre care cele mai
importante (biblioteci C, editor de text pentru cod surs, compilator, editor de legturi,
depanator, interpretorul de comenzi, etc.) sunt GNU. Un sistem Linux alctuit dintr-un
program de instalare, un kernel i un set de aplicaii gata compilate, se numete distribuie
Linux. Numeroase companii i organizaii au realizat asemenea distribuii. Acestea sunt
disponibile gratuit sau pot fi achiziionate contra cost. Dintre cele gratuite, cele mai rspndite
sunt Ubuntu, CentOS, Debian, Fedora, OpenSuSE.

1.2. Kernelul

Sistemul de operare Linux este reprezentat de kernelul su. Muli folosesc cuvntul
Linux numai n acest sens3. Kernelul este programul care controleaz operarea sistemului de
calcul. Ca orice alt program, const dintr-o secven de instruciuni executat de procesor.
Ceea ce l difereniaz de programele obinuite (editoare de text sau jocuri pe calculator) sunt
funcionalitile speciale pe care le deine asupra calculatorului. Kernelul administreaz
resursele hardware i software ale sistemului: asigur accesul i controlul dispozitivelor
periferice, organizeaz informaia n memoria principal, ncarc i execut programele de
aplicaii, etc.. n Linux, kernelul este complet separat de interfaa cu utilizatorul (care
cuprinde i interfaa grafic) i este protejat de funcionarea defectuoas a altor programe din
sistem. Memoria este mprit logic n dou pri, zona dedicat kernelului (spaiul kernel) i
zona dedicat utilizatorului (spaiul utilizator). Spaiul utilizator este dedicat aplicaiilor, iar
spaiul kernel se ocup efectiv de controlul componentelor hardware. Niciun program care
ruleaz n spaiu utilizator nu poate scrie (n general nici citi) ceva stocat n spaiul kernel.
Comunicaia ntre cele dou zone se face prin apeluri de sistem strict controlate. Accesul
direct la componentele fizice, incluznd memoria i perifericele, este limitat numai la codul
care ruleaz n spaiul kernel. Programele din spaiul utilizator acceseaz perifericele numai
prin intermediul driverelor de sistem care ruleaz n kernel.

1.3. Interpretorul de comenzi

Interpretorul de comenzi (shell) este o interfa ntre utilizator i sistemul de operare;


preia comenzile utilizatorului i le transmite sistemului de operare spre execuie. Totui,
interpretoarele de comenzi sunt indepedente de sistemul de operare. Primul interpretor de
comenzi important, numit Bourne shell, a fost dezvoltat de Steve Bourne i inclus n Unix
Version 7 lansat n 1977. Acest interpretor de comenzi este cunoscut n cadrul sistemului de
operare sub numele de sh. Un alt interpetor de comenzi utilizat pe scar larg este csh, scris
de Bill Joy4 ca parte integrant a distribuiei BSD de Unix, i aprut la civa ani dup sh.
Numele de csh l-a primit datorit asemnrii sintaxei comenzilor sale cu cea a instruciunilor

3
n cazul nostru Linux se refer la sistemul de operare n ansamblu: kernel, utilitare, aplicaii, interfa
grafic.
4
Cel care a dezvoltat i 1BSD i care mai trziu a nfiinat compania SUN Microsystems.
din limbajul C, fapt ce l face mai uor de utilizat de ctre cei familiarizai cu limbajul C.
Toate aceste interpretoare au fost iniial dezvoltate pentru Unix, dar s-au dezvoltat versiuni i
pentru Linux. Interpretorul de comenzi standard n Linux este bash (GNU Bourne-Again
Shell), compatibil cu sh. Poate fi accesat din cadrul interfeei grafice cu ajutorul unei aplicaii
numit terminal.
Iniial, pe timpul cnd sistemele de calcul tocmai deveneau interactive (nainte de asta
funcionau pe baz de cartele perforate), utilizatorul interaciona cu sistemul de calcul printr-
un dispozitiv care se conecta la sistemul de calcul prin conexiune serial. Din punctul de
vedere al aspectului fizic acesta se numea consol, iar din punct de vedere electric, se numea
terminal (punctul terminal al unei conexiuni). n prezent, utilizatorul interacioneaz cu
sistemele de calcul prin intermediul tastaturii i monitorului. n Linux, acestea permit
accesarea a dou tipuri de console: terminale virtuale (console n mod text) i emulatoare de
terminal (console n mod grafic). Consolele n mod text se numesc terminalele virtuale
deoarece utilizatorul dispune de mai multe console dei, fizic, exist o singur pereche
tastatur-monitor. Terminalele virtuale pot fi accesate din cadrul interfeei grafice cu ajutorul
tastelor Ctrl+Alt+F1Ctrl+Alt+F6 (n mod implicit). Din aceste terminale virtuale se poate
reveni n interfaa grafic cu ajutorul combinaiei de taste Ctrl+Alt+F7. Consolele n mod
grafic reprezint emulatoare de terminal. Ele se numesc emulatoare deoarece simuleaz ntr-o
fereastr grafic funcionalitatea dispozitivului tradiional conectat la sistemul de calcul
printr-o conexiune serial. Un asemenea emulator de terminal poate fi deschis cu Ctrl+Alt+T.
n prezent se obinuiete ca emulatorul de terminal s se numeasc pur i simplu terminal,
convenie la care aderm i noi de acum nainte.
Terminalele vor rula interpretorul de comenzi bash, responsabil cu afiarea unui
prompt. Prompt-ul are rol de interfa n linie de comand (CLI Command Line Interface).
La aceast linie de comand vor fi introduse comenzile executate de interpretorul de comenzi.
Aspectul su depinde de la distribuie la distribuie. n mod standard, afieaz numele
utilizatorului conectat i directorul curent n care se lucreaz:

user@host:~$

n exemplul de mai sus, user va fi numele dumneavoastr de utilizator, host numele


calculatorului pe care lucrai, iar simbolul ~ semnific faptul c directorul curent este chiar
directorul personal. Directorul personal este creat o dat cu contul unui utilizator i reprezint
directorul din sistem destinat s conin fiierele proprii acelui utilizator. Simbolul $ (dollar)
semnific faptul c utilizatorul nu are drepturi de administrare asupra sistemului. Utilizatorul
cu drepturi depline n sistem, numit root, este indicat cu simbolul # (diez). Prompt-ul
afieaz tot felul de informaii dar nu este parte a comenzilor pe care le dm sistemului.
Aproape toate comenzile din aceast carte pot fi executate fr privilegii de administrator.
Atunci cnd utilizatorul obinuit are nevoie s ruleze o comand care necesit privilegii de
root, scrie n faa acesteia sudo.
Comenzile sunt cuvinte cheie care se introduc la consol i interpretate de
interpretorul de comenzi. Se folosesc pentru a configura sistemul de operare sau pentru a
obine informaii de la acesta. Comenzile pot fi introduse ca atare, de exemplu, ls, sau pot
primi diverse opiuni care modific rezultatul acestora. Opiunile sunt de regul precedate de
caracterul liniu, precum n ls -a. Folosit n alt comand, acelai caracter de opiune
poate avea alt semnificaie. Unele programe pot avea opiuni lungi, precedate de dou
caractere liniu, precum ls -all, altele nu au nicio opiune. Separarea ntre numele
comenzii i opiune, sau ntre opiuni, se face prin caracterul spaiu.

user@host:~$ ls --all /

Pe lng opiuni, comenzile pot lua argumente. Argumentele specific obiectul asupra
cruia trebuie s acioneze comanda. Un exemplu ar fi ls /etc, unde directorul /etc este
argument al comenzii ls. Aceast comand nseamn c dorim s listm coninutul
directorului dat ca argument, n loc de ceea ce afieaz comanda simpl ls, adic coninutul
directorului n care ne aflm (directorul curent). Anumite comenzi au neaprat nevoie de
argumente.
Putem verifica dac o comand recunoate opiuni i argumente i care dintre ele sunt
valide consultnd paginile de ajutor (manual) ale respectivei comenzi. Citirea acestora se face
tot n terminal. Tastai comanda urmtoare, urmat de Enter.

user@host:~$ man ascii

Navigai la pagina urmtoare folosind tasta Space. V putei ntoarce la pagina precedent
folosind tasta b. Tastai q dac dorii s ieii din paginile manual nainte de a ajunge la
sfritul lor sau dac programul nu se nchide automat la sfritul paginilor. Mai multe opiuni
de navigare sunt date n Tabelul 1.1.
Tabelul 1.1 Navigarea n paginile de manual
Comand Rezultat
Space Deruleaz nainte (n jos) cu un ecran
PageDown Deruleaz nainte (n jos) cu un ecran
PageUp Deruleaz napoi (n sus) cu un ecran
Sgeat jos Deruleaz nainte (n jos) cu o linie
Sgeat sus Deruleaz napoi (n sus) cu o linie
d (down) Deruleaz nainte (n jos) cu o jumtate de ecran
u (up) Deruleaz napoi (n sus) cu o jumtate de ecran
/string Caut nainte (n jos) cuvntul string
n (next) Repet cutarea dinainte nspre nainte (n josul paginii de manual)
N Repet cutarea dinainte nspre napoi (n sus)
g Sri la nceputul paginii de manual
G Sri la sfritul paginii de manual
q (quit) Iei din pagina de manual

Paginile de manual sunt mprite n seciuni, Tabelul 1.2. Unele comenzi dispun de informaii
n mai multe seciuni. De exemplu passwd, comanda utilizat la schimbarea parolei de
utilizator. Informaia cu privire la comand este inclus n seciunea 1. O alt intrare pentru
passwd este n seciunea 5. Aceast intrare descrie fiierul de sistem /etc/passwd.
Paginile de manual prezentate implicit sunt cele din seciunea cu cel mai mic numr de
identificare. Dac dorii s vedei o alt seciune dect cea afiat implicit, specificai numrul
acesteia dup comanda man:

user@host:~$ man 5 passwd

Seciunile paginilor de manual sunt descrise n pagina de manual a comenzii man. Aadar,
man man va explica rolul fiecrei seciuni. O alt opiune de interes o reprezint k
(keyword), cutarea unui cuvnt cheie n titlul i seciunea de descriere a paginilor de manual.

user@host:~$ man -k passwd


chpasswd (8) - update passwords in batch mode
gpasswd (1) - administer /etc/group and /etc/gshadow
lpasswd (1) - Change group or user password
pam_localuser (8) - require users to be listed in /etc/passwd
passwd (1) - update user's authentication tokens
Tabelul 1.2 Seciunile paginilor de manual
Seciune Descriere
1 Comenzi disponibile utilizatorului (comenzi i scripturi)
2 Apeluri de sistem (rutine din kernel invocate din spaiul utilizator)
3 Funcii din bibliotecile C
4 Dispozitive i fiiere speciale (cum ar fi fiierele de dispozitiv)
5 Formate de fiiere i convenii (pentru fiiere de configurare i structuri)
6 Jocuri
7 Convenii, standarde i diverse (protocoale, sisteme de fiiere)
8 Comenzi de administrare a sistemului
9 Rutine kernel
Opiunea -K caut n tot textul paginii de manual, nu numai n titlu i descriere ca -k. ns o
astfel de cutare poate folosi resurse consistente i ia mai mult timp.

Locaia unei pagini de manual poate fi aflat cu comanda whereis.

user@host:~$ whereis -m passwd


passwd: /usr/share/man/man1/passwd.1.gz

Fiierul poate fi citit direct de man.

user@host:~$ man /usr/share/man/man1/passwd.1.gz

1.4. Sistemul de fiiere

ntr-un sistem UNIX, orice este un fiier; dac ceva nu este un fiier, atunci este un
proces.

Aceast propoziie nu este complet adevrat, deoarece exist fiiere speciale care
sunt mai mult dect nite simple fiiere (cele numite pipes i sockets, de exemplu), dar pentru
simplitate, a spune c orice este un fiier constituie o generalizare acceptabil. Un sistem
Linux, la fel ca Unix-ul, nu face diferena ntre director i fiier. Un director este doar un fiier
care conine numele altor fiiere. Programele, serviciile, textele, imaginile, i aa mai departe,
sunt toate fiiere. Din punct de vedere al sistemului de operare, dispozitivele de intrare/ieire
sunt tot fiiere. Dar cele mai multe fiiere, n special cele cu care vom interaciona n aceast
carte, sunt fiiere simple (conin date obinuite). De exemplu, fiiere text, fiiere executabile,
fiiere de cod sau rezultate. Aadar, de acum nainte ne vom concentra asupra directoarelor i
fiierelor obinuite.
Sistemul de fiiere este organizat ca ierarhie de directoare cu structur arborescent. 5

5
man hier
//

bin/
bin/ media/
media/ etc/
etc/ sbin/
sbin/ mnt/
mnt/ home/
home/

ls
ls chmod
chmod mkdir
mkdir cat
cat student/
student/ stefan/
stefan/

Desktop/
Desktop/ asm/
asm/ fisier.txt
fisier.txt

Figura 1.1 Ierarhia de directoare Linux


Structura arborescent ncepe cu trunchiul, indicat de caracterul / (slash). Acest
director conine toate celelalte directoare i fiiere ale sistemului i reprezint directorul root
sau rdcina sistemului de fiiere. Directoarele care se afl pe palierul imediat urmtor
directorului rdcin sunt adesea precedate de caracterul /. Lucru care indic poziia acestora
pe al doilea nivel i evit confuzia cu alte directoare cu acelai nume aflate pe alte niveluri.
Fiecare din aceste directoare pot conine alte directoare sau fiiere. Totodat, fiecare director
din rdcin are un scop predefinit. De exemplu, directorul /home conine directoarele
personale ale utilizatorilor obinuii.

Nume director6 Coninut


/ Directorul rdcin.
/bin Fiiere executabile de uz general (binare).
/boot Conine o parte a ncrctorului de sistem i kernelul.
/dev Fiiere speciale folosite pentru accesul direct la dispozitivele hardware
sau logice ale sistemului.
/etc Fiiere de configurare pentru sistem i aplicaii.
/home Conine directoarele personale ale utilizatorilor obinuii.
/lib Biblioteci de funcii i module de kernel necesare pentru iniializarea
sistemului i rularea comenzilor din /bin i /sbin.
/lib64 Biblioteci de funcii i module de kernel pe 64 de bii.
/lost+found Director pentru fiiere recuperate (gsite n urma unei verificri a
sistemului de fiiere).
/media Folosit pentru montarea dispozitivelor mobile: uniti optice, stick-uri,
etc..
/mnt Folosit pentru montarea temporar a unor sisteme de fiiere locale sau
partajate n reea.
/opt Aplicaii suplimentare care nu fac parte din distribuie.
/proc Un pseudo sistem de fiiere care are rolul s exporte informaii din
spaiul kernel n spaiul utilizator.
/root Directorul personal al utilizatorului root.
/sbin Conine executabile pentru administrarea sistemului (inaccesibile
utilizatorilor neprivilegiai).

6
Dei exist diferene ale ierarhiei de directoare de la distribuie la distribuie, n general se ncearc
aderarea la standardul FHS (Filesystem Hierarchy Standard) care specific structura sistemelor de
fiiere Linux.
/srv Informaii legate de serviciile care ruleaz n sistem.
/sys Informaie n timp real despre dispozitivele folosite de kernel.
/tmp Fiiere temporare cu permisiuni de scriere/citire pentru oricine.
/usr Aplicaii destinate utilizatorului. Conine i el o ierarhie de directoare
deoarece informaiile sunt structurate.
/var Fiiere cu dimensiune variabil. Fiiere cu durat de via mic sau al
cror coninut se modific des.

Pe lng /, care semnific directorul rdcin, i ~, care reprezint directorul personal


al utilizatorului, mai ntlnim caracterele . i .. - directorul curent, respectiv directorul aflat
pe nivelul imediat superior (printe).
O adres de fiier, neleas ca traseu ce trebuie parcurs n structura de fiiere pentru a
ajunge la acel fiier, poate fi descris n dou moduri. n primul, traseul ncepe de la directorul
rdcin
/home/user/fisier.txt

i este denumit cale absolut. n acest caz, nu pot exista confuzii, numai un singur fiier din
sistem corespunde acestui traseu.
n al doilea mod, denumit cale relativ, traseul nu ncepe cu caracterul /, de exemplu

~/fisier.txt
sau
bin/fisier.txt

i pot fi generate confuzii. ~/fisier.txt nseamn fiierul care se afl n directorul


personal al utilizatorului, dar nu se specific care utilizator. La fel, bin/fisier.txt
nseamn fiierul din directorul bin/ cu plecare din directorul n care te afli n prezent.
Directorul curent se poate afla prin comanda pwd.
Cile relative folosesc i caracterele . i .. . Iat cteva exemple:
documentaia de instalare a unui program surs (necompilat) specific s rulm
comanda ./configure. Aceasta execut programul configure din directorul
curent (cel care vine cu noul cod), i nu alt program omonim, care se gsete n alt
parte a sistemului.
n fiierele HTML, cile relative sunt folosite la specificarea celorlalte fiiere,
independent de locaia directorului n care se afl site-ul, specific unui server web.

<a href=../files/begin.html> .. </a>

1.4.1. Lucrul cu directoare i fiiere

Trecerea dintr-un director n altul se face prin comanda cd urmat de adresa absolut
sau relativ a noului director.

user@host:~$ cd /usr/local
user@host:~$ pwd
/usr/local
user@host:~$ cd ..
user@host:~$ pwd
/usr

Comanda cd .. trece la directorul printe (cel de pe nivelul superior fa de directorul


curent). Scrierea lui cd fr specificarea vreunui director plaseaz utilizatorul n directorul
personal. Comanda cd ~ are acelai efect.
user@host:~$ cd
user@host:~$ pwd
/home/user
user@host:~$ cd ~
user@host:~$ pwd
/home/user

O alt prescurtare util este cd -, care duce la directorul anterior.

user@host:~$ pwd
/home/user
user@host:~$ cd /usr/local
user@host:~$ pwd
/usr/local
user@host:~$ cd
user@host:~$ pwd
/home/user
user@host:~$ cd
user@host:~$ pwd
/usr/local

Interpretorul de comenzi permite crearea unei liste de directoare de lucru, facilitndu-


i utilizatorului lucrul cu acestea. Aceast list se numete stiv. Este o analogie cu o stiv de
farfurii: de obicei adugm farfurii la i lum farfurii de la vrful stivei, astfel nct aceast
stiv este de tipul ultimul intrat, primul ieit. Comanda dirs afieaz coninutul stivei de
directoare. Dac stiva este goal, afieaz numele directorului curent.

stefan@centos ~$ dirs
~

Cnd scriem comanda pushd (push directory) mpreun cu un argument, interpretorul de


comenzi introduce directorul specificat n stiv i totodat schimb directorul curent la
directorul specificat asemenea lui cd.

stefan@centos ~$ pushd /usr/share/


/usr/share ~
stefan@centos share$ pwd
/usr/share
stefan@centos share$ pushd ../lib
/usr/lib /usr/share ~
stefan@centos lib$ pwd
/usr/lib

Cnd scriem pushd fr niciun argument, interpretorul de comenzi comut primele dou
directoare de la varful stivei (ca i cum am schimba ntre ele primele dou farfurii de la vrf).

stefan@centos lib$ pushd


/usr/share /usr/lib ~
stefan@centos share$ pushd
/usr/lib /usr/share ~

Folosit astfel, putem comuta cu uurin ntre dou directoare (asemenea lui cd -). Putem
folosi cd - pentru a trece la directorul anterior, indiferent dac a fost creat sau nu o stiv de
directoare. Pentru a intra n alt director din stiv, dup comanda pushd specificm un
argument numeric precedat de semnul plus. Directoarele din stiv sunt numerotate ncepnd
cu vrful stivei, care este numrul 0. Urmtorul exemplu modific directorul de lucru la ~ i
mut directorul personal la vrful stivei.

stefan@centos share$ pushd


/usr/lib /usr/share ~
stefan@centos lib$ pushd +2
~ /usr/lib /usr/share

tergerea unui director din stiv se face cu popd (pop directory). Fr niciun argument,
popd scoate din stiv directorul de la vrf i mut directorul curent la noul vrf al stivei.

stefan@centos ~$ popd
/usr/lib /usr/share
stefan@centos lib$ pwd
/usr/lib

Pentru tergerea unui director diferit de cel din vrf, se folosete un argument numeric
precedat de semnul plus. Urmtorul exemplu terge directorul cu numrul 1, /usr/share.
tergerea unui director diferit de cel de la vrf nu modific directorul de lucru.

stefan@centos lib$ popd +1


/usr/lib
stefan@centos lib$ dirs
/usr/lib

Dac dorim s intrm ntr-un director cu nume foarte lung, nu trebuie s tastm tot
numele, este de ajuns s scriem primele caractere i s apsm Tab, consola va completa
numele n locul nostru. n cazul n care sunt i alte directoare sau fiiere care ncep cu aceeai
secven de caractere, consola va semnala sonor acest lucru, iar apsarea tastei Tab de dou
ori ntr-un interval scurt de timp va afia toate variantele.
Comanda mkdir (make directory) creaz un nou director. Dac nu se specific o
cale, acesta se va afla n directorul curent. De asemenea, reinei faptul c Linux face
distincie ntre literele mari i mici. Altfel, un director assembly este diferit de unul numit
Assembly.

user@host:~$ mkdir assembly

Un director gol se terge cu rmdir (remove directory). De exemplu, comanda

user@host:~$ rmdir assembly

terge directorul creat nainte. Dac directorul specificat nu este gol, rmdir nu va terge
directorul. Pentru a terge un director cu coninut trebuie nti s tergi coninutul (fiiere sau
sub-directoare), sau s foloseti comanda rm cu opiunea -r.

user@host:~$ rm r assembly

n mod normal, rm (remove) terge un fiier:

user@host:~$ rm fisier.txt

Interpretorul de comenzi ne permite s specificm anumite grupuri de fiiere. Acesta poate


substitui n numele fiierelor orict de multe caractere, cu un asterisc, sau un singur caracter,
cu un semn de ntrebare (poate substitui serii de numere i caractere, majuscule sau nu, dar nu
detaliem). De exemplu,

user@host:~$ rm prog*
terge toate fiierele care ncep cu prog. ndeprtarea tuturor fiierelor din directorul curent
se face cu

user@host:~$ rm *

Directoarele nu sunt terse. Pentru asta e nevoie de opiunea -r menionat anterior:

user@host:~$ rm -rf *

Implicit, rm r (recursive) nu terge directoarele cu coninut. Dar rm accept


opiunea -f (force), care ne permite s tergem orice director. Comanda rm rf este foarte
cunoscut, foreaz tergerea recursiv. Rulat cu drepturi de root, comanda rm -rf poate
terge efectiv tot sistemul de fiiere. i comanda din exemplul anterior este foarte puternic
terge toate directoarele i fiierele din directorul curent cu excepia directoarelor . i .. .
Deoarece sunt absolut necesare, acestea sunt imposibil de ters. Ele determin rangul acelui
director n sistemul de fiiere. Dar acest lucru nu cred c ne bucur prea tare. Aadar, mare
atenie! n Linux nu exist co de gunoi cel puin nu n cazul consolei, pentru c n cazul
interfeei grafice exist destule alternative. Aa c, odat ters, un fiier este pierdut i, n
general, nu exist posibilitate de recuperare. Ca msur de precauie, n cazul comenzilor rm,
cp i mv se poate activa comportamentul interactiv prin opiunea -i. n acest mod, la o
cerere de acest tip, sistemul va cere confirmare, astfel nct, pentru a produce o pagub, este
nevoie de o a doua apsare a tastei Enter:

user@host:~$ rm -ri Director

Coninutul unui director este afiat cu ls. Fr specificarea unui director ls afieaz
coninutul directorului curent.

user@host:~$ touch Director/fisier.txt


user@host:~$ ls Director
fisier.txt
user@host:~$ pwd
/home/user
user@host:~$ ls
anaconda-ks.cfg Director install.log Mail

O opiune folosit frecvent cu ls este a, care arat toate fiierele. Prin sintagma toate
fiierele nelegem i fiierele ascunse. n Linux, cnd numele unui fiier sau director ncepe
cu punct este considerat fiier sau director ascuns.

user@host:~$ ls -a
. .bash_history .bashrc install.log .mc .viminfo
.. .bash_logout .cshrc .lesshst .pki Director

Observai c Linux nu folosete extensii pentru determinarea tipului de fiier. Pentru editorul
de text nu conteaz dac fiierul se sfrete n .txt sau .doc. Comanda file arat tipul
de fiier.

user@host:~$ file /etc/passwd


/etc/passwd: ASCII text
user@host:~$ file prog.c
prog.c: ASCII C program text

Comanda file folosete un fiier cu abloane destinate recunoaterii tipului de fiier.


Fiierul este /usr/share/file/magic. Pentru mai multe informaii tastai man 5
magic.
Copierea unui fiier se face cu utilitarul cp. Acesta primete ca argumente o surs i
o destinaie. Dac destinaia este un director, atunci fiierele surs sunt copiate n acel
director.

user@host:~$ touch Fisier1


user@host:~$ ls
Fisier1
user@host:~$ cp Fisier1 Fisier2
user@host:~$ ls
Fisier1 Fisier2
user@host:~$ cp Fisier1 Fisier2 Director
user@host:~$ ls Director
Fisier1

Opiunea r permite copierea unor directoare (-r foreaz copierea recursiv a tuturor
fiierelor din toate subdirectoarele).

user@host:~$ mkdir Director1 Director2


user@host:~$ ls
Director1 Director2
user@host:~$ cp r Director1 Director2
user@host:~$ ls Director2
Director1

Opiunea -i (interactive) previne suprascrierea unor fiiere existente.

user@host:~$ cp i Fisier1 Fisier2


cp: overwrite `Fisier2'? y

Comanda mv redenumete un fiier sau mut fiierul n alt director. Recunoate de asemenea
opiunea i.

user@host:~$ ls
Fisier1
user@host:~$ mv Fisier1 fisier.txt
user@host:~$ ls
fisier.txt
user@host:~$ touch fisier1
user@host:~$ mv i fisier.txt fisier1
mv: overwrite `fisier1'? no

1.1.1. Lucrul cu coninutul fiierelor

Coninutul fiierelor text poate fi afiat la ecran cu cat, tac, head, tail, more i
less. Comanda cat este una din cele mai versatile unelte, dar deocamdat o folosim numai
ca s afim pe ecran coninutul unui fiier i s concatenm (de altfel, cat este prescurtarea
de la concatenate) mai multe fiiere ntr-unul mai mare.

user@host:~$ cat /etc/passwd


user@host:~$ echo 1 > part1
user@host:~$ echo 2 > part2
user@host:~$ echo 3 > part3
user@host:~$ cat part1 part2 part3
1
2
3
user@host:~$ cat part1 part2 part3 > count
user@host:~$ cat count
1
2
3
user@host:~$ tac count
3
2
1

Alte opiuni utile pentru cat sunt -n, care numeroteaz liniiile din fiier, -b, care
numeroteaz numai liniile cu text, -s, care combin mai multe linii goale ntr-una singur sau
-T, care nlocuiete caracterele TAB cu combinaia de caractere ^I. Tot din exemplul anterior
se observ c tac este opusul lui cat.
Comanda head afieaz primele zece linii dintr-un fiier. Acest numr poate fi
specificat ca opiune. De asemenea, cu opiunea -c poate afia un numr de octei dai de la
nceputul fiierului.

user@host:~$ head 3 /etc/passwd


root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

user@host:~$ head c4 /etc/passwd


root

n mod similar, comanda tail afieaz ultimele zece sau un numr specificat de linii dintr-
un fiier.

user@host:~$ tail 3 /etc/passwd


sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
stefan:x:500:500::/home/stefan:/bin/bash

Comanda more este util atunci cnd coninutul fiierului depete dimensiunea unui ecran.
More permite s vedem coninutul fiierului pagin cu pagin (ecran cu ecran). Observai c
n stnga jos, comanda more afieaz ct la sut din text a fost afiat. La urmtoarea pagin
se trece cu tasta Space, iar q (quit) ntrerupe comanda. Derularea unei pagini nainte i napoi
se face cu f (skip forward) i b (skip backword). Alte comenzi utile n cadrul more sunt v
(vi), pentru a porni editarea liniei curente cu editorul vi, i =, care afieaz numrul liniei
curente.
Dei din numele ei comanda less pare c nglobeaz mai puin funcionalitate
dect more, less reprezint o versiune mai avansat a lui more (numele de less vine de la
"less is more"). Furnizeaz funcionaliti de derulare nainte i napoi prin textul fiierului i
cteva posibiliti avansate de cutare. Comanda less poate de asemenea s afieze
coninutul unui fiier nainte de a termina de citit ntregul fiier. Acesta reprezint un mare
minus pentru cat i more cnd avem de a face cu fiiere foarte mari. n rest, comanda less
opereaz asemntor comenzii more, afind textul ecran cu ecran. Comanda less
recunoate acelai set de comenzi more plus cteva opiuni n plus. Unele dintre acestea
const din faptul c less recunoate tastele sgei i pagin sus i jos, sau caracterele j
pentru derulare cte un rnd n jos i k derulare un rnd n sus. Pentru toate opiunile
disponibile citii pagina de manual pentru comanda less.

Urmtorul tabel prezint cteva combinaii de taste care v ajut la editarea mai
rapid a liniei de comand.
Ctrl+A Mut cursorul la nceputul liniei de comand.
Ctrl+E Mut cursorul la sfritul liniei de comand.
Ctrl+D nchide sesiunea curent. Similar cu tastarea exit.
Ctrl+R Caut n istoricul comenzilor.
Ctrl+U terge linia curent.
Ctrl+K terge cuvintele din dreapta cursorului.
Ctrl+W terge cuvntul din stnga cursorului.
Ctrl+L terge tot ce este afiat n consol.
Ctrl+H terge poziia curent (similar cu Backspace).
Shift+Ctrl+C Copiaz textul selectat n memoria temporar.
Shift+Ctrl+V Scrie coninutul din memoria temporar.
(Shift+Insert)
Alt+F Mut cursorul un cuvnt nainte.
Alt+D terge cuvntul din dreapta cursorului.
Alt+B Mut cursorul un cuvnt napoi.
Sgeat sus / jos Navigare prin istoricul comenzilor. Executai linia pe
care dorii s o repetai cu Enter.
Shift+PageUp / Navigare prin terminal (pentru a vedea textul care a
PageDown ieit din ecran.
TAB Completeaz comanda sau numele de fiier. Dac sunt
mai multe posibiliti, apsarea a dou TAB-uri
succesive afieaz lista acestora.
2. REDIRECIONRI I COMENZI

Am deschis discuia referitoare la sistemul de fiiere enunnd principiul fundamental


de proiectare al sistemelor Unix - everything is a file. Sintagma orice este un fiier
trebuie neleas ca orice este reprezentat ca fiier. Un fiier poate fi o colecie de date pe
disc, dar, ntr-un sens mai general, un fiier este punctul final al unui traseu parcurs de date.
Cnd scrii ntr-un fiier, transmii date de-a lungul unui traseu la un punct final. Cnd citeti
un fiier, preiei date dintr-un punct final. n cazul unui transfer ntre fiiere, calea parcurs de
date se poate afla n totalitate n interiorul unui calculator sau poate traversa o reea de
calculatoare, datele pot suferi modificri de-a lungul traseului sau nu, .a.m.d.. Ceea ce
trebuie s nelegem este faptul c n sistemele Unix totul este reprezentat ca fiier i toate
fiierele, indiferent de natura lor, sunt tratate de ctre mecanismele interne ale sistemului de
operare mai mult sau mai puin identic.

2.1. Fiierele standard n Unix

n acest sens, fiierele nu sunt reprezentate numai de coleciile de date stocate pe disc, ci de
toate componentele hardware care pot juca rol de surs sau destinaie pentru date. Tastatura
este un fiier: un punct final care genereaz date i le transmite undeva. Monitorul este un
fiier: un punct final care primete date de undeva i le afieaz. Fiierele Unix nu sunt
neaprat fiiere text. Fiierele binare au parte de acelai tratament. Tabelul 1.4 prezint cele
trei fiiere standard definite de sistemele Unix sau nrudite, cum este Linux. Aceste fiiere
sunt deschise i disponibile ntotdeauna n timpul rulrii programelor.
Tabelul 2.1 Cele trei fiiere standard n Unix
Fiier Identificator C Descriptor de fiier Hardware
Standard Input STDIN 0 Tastatur
Standard Output STDOUT 1 Monitor
Standard Error STDERR 2 Monitor

Pentru sistemul de operare, un fiier este reprezentat printr-un descriptor de fiier.


Descriptorul de fiier este un numr. Primele trei numere aparin celor trei fiiere standard.
Dac un program deschide un fiier existent sau creaz unul nou, Linux va returna un
descriptor de fiier unic. Programul va gestiona fiierul prin descriptorul de fiier respectiv.
Tabelul 1.4 prezint i numele de identificare specific limbajului de programare C. De obicei,
cnd cineva spune STDOUT nelegem c se refer la descriptorul de fiier 1, adic la
monitor. Pe de alt parte, STDERR semnific destinaia implicit la care programele trimit
mesajele de eroare. Descriptorii de fiier 1 i 2 au aceeai destinaie, monitorul. Implicit, i
mesajele standard i cele de eroare vor fi afiate pe ecran. Totui, n Unix i Linux putem
separa ieirile standard de mesajele de eroare (sau alte mesaje specifice modului n care se
comport programul) printr-un mecanism numit redirecionare I/O.

2.2. Redirecionarea intrrilor i ieirilor standard

Aa cum am afirmat anterior, n mod predefinit, ieirile standard sunt direcionate la


monitor i afiate pe ecran (n general prin intermediul unui terminal). Dar asta numai
predefinit. Punctul final pentru un flux de date care se ndreapt ctre STDOUT poate fi
modificat. Datele trimise ctre STDOUT pot fi redirecionate ctre un fiier aflat pe disc. Un
fiier este un fiier, traficul de date ntre fiiere, indiferent de natura acestora, este gestionat de
Linux n acelai mod, aadar schimbarea unui punct final cu altul nu ridic probleme. Datele
direcionate ctre ieirea standard pot fi redirecionate ctre un fiier existent sau ctre un
fiier nou, creat n timpul rulrii programului.
La fel, predefinit, datele de intrare pentru programe provin de la tastatur. Cum tot
ceea ce trimite tastatura este text, acest text poate proveni i de la alte fiiere text. Pentru un
program, comutarea ntre sursele de intrare este la fel de facil precum comutarea destinaiilor
aferente datelor sale de ieire. Mecanismul care realizeaz aceast comutare se numete
redirecionare I/O.

2.2.1. Redirecionarea ieirii standard

Toate comenzile specifice interpretorului de comenzi din Linux trimit datele de ieire
la STDOUT (ecran). Comanda ls, de exemplu, trimite coninutul directorului curent la
STDOUT. Scriem n terminal ls, i ne este afiat la ecran un listing al directorului curent.
Putem captura acest listing prin redirecionarea textului emis de ls ctre un fiier aflat pe
disc.

user@host:~$ ls > continut.txt

Dac nu exist, fiierul continut.txt va fi creat automat i va conine tot textul


emis de comanda ls. Aadar, am comutat ieirea standard de la ecran la fiierul
continut.txt. Simbolul > (mai mare) este doar unul din operatorii de redirecionare.
Simbolul < (mai mic) realizeaz funcia invers, comut intrarea standard; schimb fiierul
STDIN (tastatura) cu un alt fiier, de obicei un fiier aflat pe disc. n Linux dispunem de un
program care schimb caracterele mari cu mici, sau invers.

user@host:~$ tr '[:lower:]' '[:upper:]'

Un program care ruleaz are ntodeauna deschise trei fiiere standard: STDOUT
(pentru afiare la ecran), STDIN (pentru preluarea caracterelor de la tastatur) i STDERR
(pentru afiarea mesajelor de eroare la ecran). Utilitarul tr nu face excepie de la regul. n
timpul rulrii ateapt date de la tastatur, iar rezultatul procesrii este afiat la ecran.
Introducei cuvinte sau litere mici i observai c la ecran sunt afiate cu majuscule.

user@host:~$ tr '[:lower:]' '[:upper:]'


text introdus de la tastatura (stdin) si afisat la ecran (stdout)
TEXT INTRODUS DE LA TASTATURA (STDIN) SI AFISAT LA ECRAN (STDOUT)

Putem schimba intrarea standard cu un fiier aflat pe disc folosind operatorul de


redirecionare a intrrii standard <.

user@host:~$ tr '[:lower:]' '[:upper:]' < input.txt

Putem crea un fiier folosind operatorul de redirecionare a ieirii standard >.

user@host:~$ echo "Acesta este un fisier text" > input.txt

Putem modifica simultan intrrile i ieirile standard ale unui program;

user@host:~$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt


Redirecionarea I/O permite programului s citeasc date din fiierul input.txt,
iar dup procesare s le scrie n fiierul output.txt. Ambele aflate pe disc. Operatorii de
redirecionare pot fi privii ca sgei care indic direcia micrii datelor. Datele sunt luate din
fiierul input.txt i trimise ctre program; astfel, simbolul < arat c datele se deplaseaz
de la fiier ctre program. n mod similar, simbolul > arat c programul trimite datele ctre
fiierul output.txt.
Privind n ansamblu, redirecionarea I/O acioneaz ca un fel de comutator de date,
schimbnd direcia fluxurilor de date de la fiierele standard la fiierele surs i destinaie
dorite de utilizator.
Urmtorul exemplu afieaz la STDOUT coninutul unui fiier folosind comanda
cat.

user@host:~$ cat fisier.txt

De fapt, din comand lipsete operatorul de redirecionare a intrrii standard.


Comanda complet ar fi:

user@host:~$ cat < fisier.txt7

Tot ce face comanda cat este s copieze intrarea standard la ieirea standard. Putei
verifica acest lucru scriind pur i simplu cat n terminal i apsai Enter. Nu face altceva
dect s trimit la monitor ceea ce scriei la tastatur. Se iese cu Ctrl-C.

user@host:~$ cat
Acesta este un text
Acesta este un text

Dar n combinaie cu interpretorul de comenzi i redirecionarea I/O acest lucru poate genera
rezultate foarte puternice i diverse. De exemplu, prin redirecionarea ieirii standard ctre un
alt fiier, acesta din urm va fi creat (dac nu exist), sau suprascris (dac exist deja). n
concluzie, aceast comand necesit atenie suplimentar.

user@host:~$ cat input.txt > output.txt8

Tot din acest exemplu reiese cum pot fi copiate fiiere cu cat.
Interpretorul de comenzi bash dispune de o facilitate care ne protejeaz de acest
risc: noclobber. Putem seta variabila noclobber utiliznd comanda set:

user@host:~$ set -o noclobber

Pentru deselectarea variabilei noclobber se folosete comanda:

user@host:~$ set +o noclobber

Dac variabila noclobber este setat, putem fora suprascrierea unui fiier poziionnd
operatorul | (discutat n capitolul urmtor) imediat dup operatorul redirecionare (>|) sau
simbolul de alipire (>>|). Dou caractere mai mare dect, >>, adaug text la un fiier
existent. Urmtoarea comand adaug coninutul fiierului input.txt la fiierul output.txt.

user@host:~$ cat input.txt >> output.txt

Redirecionarea a nimic ctre un fiier existent este acelai lucru cu tergerea

7
Pentru o ilustrare i mai exact, comanda este cat 0< fisier.txt. Dar 0 se subnelege.
8
Iari, comanda complet ar fi cat input.txt 1> output.txt. Dar 1 se subnelege.
coninutului acelui fiier:

user@host:~$ > fisier.txt

Acest proces este numit trunchiere (truncating). Acelai tip de redirecionare, de data aceasta
ctre un fiier inexistent, va crea un nou fiier, gol, cu numele pe care l-ai introdus n
comanda de redirecionare:

user@host:~$ > fisier_nou.txt

De fapt, > nu reprezint direcionarea a nimic, ci reprezint direcionarea ieirii standard,


STDOUT, ctre un fiier. Adugarea lui 1 n fa, obinnd 1> este acelai lucru cu >. De
exemplu, 1> fisier.txt este acelai lucru cu > fisier.txt.

2.2.2. Redirecionarea erorilor

Redirecionarea ieirii standard de eroare, STDERR, se face cu 2>. Acest lucru este
util atunci cnd nu dorim ca mesajele de eroare s umple ecranul. Urmtoarea comand
redirecioneaz ieirea de eroare standard la un fiier. n mod normal, eroarea ar fi fost afiat
la ieirea standard, adic pe ecran.

user@host:~$ rm Dir 2> eroare.txt


user@host:~$ cat eroare.txt

Eroarea a fost generat de faptul c un director nu poate fi ters cu rm fr opiunea


r. Pentru a redireciona att ieirea standard ct i ieirea de eroare standar ctre acelai fiier,
se folosete 2>&1.

user@host:~$ find / -maxdept=1 > hier.txt 2&>1

Ordinea n care se face redirecionarea este important. De exemplu, comanda

user@host:~$ ls > list.txt 2&>1

direcioneaz att ieirea standard ct i ieirea de eroare standard n fiierul list.txt, n


timp ce comanda

user@host:~$ ls 2&>1 > list.txt

direcioneaz numai ieirea standard ctre list.txt, deoarece ieirea de eroare standard a
fost direcionat ctre ieirea standard nainte ca aceasta din urm s fie redirecionat ctre
fiier.

2.2.3. Redirecionarea intrrii standard

Redirecionarea intrrii standard se face cu simbolul < (prescurtare de la 0<).

user@host:~$ echo -e "unu \ndoi" > fisier.txt


user@host:~$ cat fisier.txt
unu
doi
user@host:~$ tr '[:lower:]' '[:upper:]' < fisier.txt
UNU
DOI
Simbolul << reprezint o modalitate prin care putem introduce informaiei pn cnd se
ntlnete o anumit secven (de obicei EOF End Of File). Delimitatorul EOF poate fi scris
ad literam sau poate fi apelat folosind combinaia de taste Ctrl+D.

user@host:~$ cat << EOF > fisier.txt


> one
> two
> three
> EOF
user@host:~$ cat fisier.txt
one
two
three

user@host:~$ cat << sfarsit > fisier.txt


> unu
> doi
> trei
> sfarsit
user@host:~$ cat fisier.txt
unu
doi
trei

Acesta este un mod foarte util de a crea fiiere text. Pentru a furniza unei comenzi ca intrare,
direct un ir de caractere, se folosete simbolul <<<.

user@host:~$ base64 <<< calculatoare


Y2FsY3VsYXRvYXJlCg==
user@host:~$ base64 -d <<< Y2FsY3VsYXRvYXJlCg==
calculatoare

2.3. Conectarea proceselor

O singur comand poate satisface un proces simplu, dar e posibil ca un proces mai
complex s aib nevoie de mai multe comenzi. Poate avem nevoie s folosim datele de ieire
ale unei comenzi ca date de intrare pentru alt comand. Evident, putem memora ieirile
primei comenzi ntr-un fiier temporar i putem folosi fiierul temporar ca intrare pentru
urmtoarea comand. De exemplu, seria de comenzi de mai jos redirecioneaz ieirea
standard a comenzii ls n fiierul temporar temp.txt, apoi folosete temp.txt ca intrare
pentru comanda ce calculeaz i afieaz numrul de cuvinte dintr-un fiier.

user@host:~$ ls > temp.txt


user@host:~$ wc -w < temp.txt

Interpretorul de comenzi permite obinerea aceluiai rezultat fr a fi nevoie de fiiere


temporare, prin intermediul operatorului |(pipe).

user@host:~$ ls | wc -w

Putem conecta mai multe comenzi:

user@host:~$ date; ps ef | awk '{print $1}'|sort|uniq| wc l


2.4. Filtre

Comenzile destinate a fi utilizate cu operatorul | sunt numite filtre. Aceste filtre sunt
programe simple destinate unui scop foarte precis. Deja am ntlnit dou exemple de filtre,
utilitarele cat i tr. nlnuirea comenzilor i filtrelor cu operatori | ne permite s obinem
rezultate foarte utile. De exemplu,
afieaz o list sortat cu utilizatorii conectai n prezent la sistem, fiecare utilizator
specificat o singur dat indiferent de numrul de terminale deschise.

root@centos:~# who | cut -d ' ' -f1 | sort | uniq

afieaz o list cu toate conturile de utilizator care au dreptul s foloseasc


interpretorul de comenzi bash.

root@centos:~# grep bash /etc/passwd | cut -d : -f1 | sort


andrei
cornel
costel
root
stefan

Astfel de nlnuiri de comenzi sunt foarte utile, dar cteodat avem nevoie s
pstrm rezultate intermediare. n acest scop se folosete tee. Filtrul tee redirecioneaz
intrarea standard i la ieirea standard i la un fiier. Astfel, tee este aproape identic cu cat,
dar permite dou ieiri.

root@centos:~# cat count


1
2
3
root@centos:~# tac count | tee temp.txt | tac
1
2
3
root@centos:~# cat temp.txt
3
2
1

Unul din cele mai cunoscute filtre n Linux este grep: filtreaz linii de text care conin
(sau nu conin) un anumit ir de caractere. Este foarte util atunci cnd vrem s verificm dac
exist n sistem un anumit nume de utilizator. Avnd n vedere c fiierul cu utilizatori n
Linux este /etc/passwd, urmtoarea comand verific dac este prezent n el numele cornel.

root@centos:~# grep cornel /etc/passwd


cornel:x:503:504::/home/cornel:/bin/bash

Opiunea -i (ignore-case) ignor distincia dintre litere mari i mici att pentru irul de
caractere cutat ct i pentru fiierul de intrare. O alt opiune util este -v (invert-match),
care afieaz toate intrrile care nu conin irul de caractere specificat. Evident, aceste opiuni
pot fi combinate.
Cu grep A (after-context) i grep B (before-context) putem afia un numr de
linii specificat dup i nainte de rezultat.

root@centos:~# grep -A2 stefan /etc/passwd


stefan:x:500:500::/home/stefan:/bin/bash
andrei:x:501:501::/home/andrei:/bin/bash
costel:x:502:503::/home/costel:/bin/bash

root@centos:~# grep -B 1 stefan /etc/passwd


ntp:x:38:38::/etc/ntp:/sbin/nologin
stefan:x:500:500::/home/stefan:/bin/bash

Comanda grep C (context) afieaz un numr de linii specificat nainte i dup


rezultat.

root@centos:~# grep -C1 stefan /etc/passwd


ntp:x:38:38::/etc/ntp:/sbin/nologin
stefan:x:500:500::/home/stefan:/bin/bash
andrei:x:501:501::/home/andrei:/bin/bash

Dac se dorete numrul liniei care conine irul specificat se folosete parametrul -n
(line-number).

stefan@centos:~$ grep -n adm /etc/passwd


4:adm:x:3:4:adm:/var/adm:/sbin/nologin

Dac trebuie s tim numai numrul de linii care conine irul specificat se folosete
-c (count).

stefan@centos:~$ grep -c bash /etc/passwd


5

Dac dorim s specificm mai mult de un singur ir folosim parametrul -e.

stefan@centos:~$ grep -e stefan -e postfix /etc/passwd


postfix:x:89:89::/var/spool/postfix:/sbin/nologin
stefan:x:500:500::/home/stefan:/bin/bash

Filtrul cut poate selecta anumite coloane dintr-un fiier, n funcie de un delimitator
sau un numr de octei. Urmtorul exemplu afieaz coloanele utilizator i identificator de
utilizator din fiierul /etc/passwd. Folosete dou puncte ca delimitator de coloan i
selecteaz cmpul 1 i 3.

root@centos:~# cut -d : -f1,3 /etc/passwd | tail -3


andrei:501
costel:502
cornel:503

Cnd delimitatorul de coloane este un spaiu, trebuie s l specificm ntre ghilimele.

root@centos:~# cut -d " " -f1 /etc/resolv.conf


nameserver
search

Urmtorul exemplu afieaz intervalul de caractere 2-7 din fiecare linie din /etc/passwd.

root@centos:~# cut -c2-7 /etc/passwd | head -2


oot:x:
in:x:1

Filtrul tr convertete caractere. Urmtorul exemplu nlocuiete caracterul e cu E.


root@centos:~# cat fisier.txt
Acesta este un text.
root@centos:~# cat fisier.txt | tr 'e' 'E'
AcEsta EstE un tExt.

Putem transforma toate literele n majuscule prin definirea a dou intervale.

root@centos:~# cat fisier.txt | tr 'a-z' 'A-Z'


ACESTA ESTE UN TEXT.

Urmtorul exemplu convertete toate caracterele de trecere la linie nou n spaii.

root@centos:~# cat fisier.txt


Acesta
este
un
text.
root@centos:~# cat fisier.txt | tr '\n' ' '
Acesta este un text. root@centos:~#

Cu opiunea d (delete) putem terge caractere obinuite sau speciale dintr-un text. Urmtorul
exemplu terge caracterele de trecere la linie nou dintr-un text.

root@centos:~# cat fisier.txt


Acesta
este
un
text.
root@centos:~# cat fisier.txt | tr -d '\n'
Acestaesteuntext.root@centos:~#

Filtrul tr s (squeeze) poate combina apariia consecutiv a mai multor instane de caracter
n una singur.

root@centos:~# cat fisier.txt


Acesta este un
text cu multe spatii.
root@centos:~# cat fisier.txt | tr -s ' '
Acesta este un
text cu multe spatii.

Filtrul wc afieaz numrul de cuvinte, linii i caractere dintr-un fiier.

root@centos:~# cat fisier.txt


Acesta este un fisier
cu doua linii si zece cuvinte.
root@centos:~# wc fisier.txt
2 10 53 fisier.txt
root@centos:~# wc -l fisier.txt
2 fisier.txt
root@centos:~# wc -w fisier.txt
10 fisier.txt
root@centos:~# wc -c fisier.txt
53 fisier.txt

Filtrul sort sorteaz liniile unui fiier text. Implicit, sorteaz alfabetic.

root@centos:~# cat tari.txt


Romania, Bucuresti, 5
Franta, Paris, 60
Germania, Berlin, 30
Anglia, Londra, 90

root@centos:~# sort tari.txt


Anglia, Londra, 90
Franta, Paris, 60
Germania, Berlin, 30
Romania, Bucuresti, 5

Dar sort permite multe tipuri de sortare (man sort), numeric, aleatoare, dup lunile anului,
n funcie de coloan, etc.. Mai jos sunt cteva exemple.

root@centos:~# sort -k2 tari.txt


Germania, Berlin, 30
Romania, Bucuresti, 5
Anglia, Londra, 90
Franta, Paris, 60

root@centos:~# sort -n -k 3 tari.txt


Romania, Bucuresti, 5
Germania, Berlin, 30
Franta, Paris, 60
Anglia, Londra, 90

Dac fiierul conine linii identice, putem elimina duplicatele cu opiunea u (unique).

root@centos:~# sort tari.txt


Anglia, Londra, 90
Franta, Paris, 60
Germania, Berlin, 30
Romania, Bucuresti, 5
Romania, Bucuresti, 5

root@centos:~# sort tari.txt -u


Anglia, Londra, 90
Franta, Paris, 60
Germania, Berlin, 30
Romania, Bucuresti, 5

Unicitatea poate fi obinut i prin folosirea filtrului uniq.

root@centos:~# sort tari.txt | uniq


Anglia, Londra, 90
Franta, Paris, 60
Germania, Berlin, 30
Romania, Bucuresti, 5

Filtrul uniq poate afia i numrul de apariii cu operatorul c (count).

root@centos:~# sort tari.txt | uniq -c


1 Anglia, Londra, 90
1 Franta, Paris, 60
1 Germania, Berlin, 30
2 Romania, Bucuresti, 5

Parametrul sort -t este util cnd se sorteaz fiiere cu date organizate pe cmpuri, cum ar
fi fiierul /etc/passwd. Parametrul -t specific delimitatorul de cmp.
stefan@centos:~$ sort -t ':' -k 3 -n /etc/passwd | head -4
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

Compararea irurilor de caractere sau fiierelor se poate face cu filtrul comm.


Implicit, comm va afia trei coloane. n exemplul urmtor, andrei i mihai sunt n ambele
liste, gabriel, ionut i ovidiu numai n prima list, iar ciprian, cornel i stefan n a doua list.
Reinei c filtrul comm prefer fiierele deja sortate.

root@centos:~# comm users1 users2


andrei
ciprian
cornel
gabriel
ionut
mihai
ovidiu
stefan

Rezultatul lui comm poate fi citit mai uor cnd se generaz o singur coloan. Numerele
indic coloanele care nu trebuie afiate.

root@centos:~# comm -12 users1 users2


andrei
mihai

Comanda paste permite concatenarea liniilor corespondente din dou fiiere diferite.

stefan@srv ~$ cat users1


andrei
stefan
stefan@srv ~$ cat users2
popescu
gheorghe
stefan@srv ~$ paste users1 users2
andrei popescu
stefan gheorghe

2.5. Cutarea fiierelor

Comanda find folosete un criteriu de cutare pentru a gsi fiiere n ierarhia


sistemului de fiiere. Putem cuta fiiere dup nume, posesor, grup, tip, permisiuni, dat, etc..
Cutarea este recursiv, n sensul c, implicit, se caut i n subdirectoarele directorului
specificat. Sintaxa general este urmtoarea:

find locaie criteriu aciune

Toate argumentele sunt opionale, deoarece au anumite valori implicite. Astfel, locaia
implicit este directorul curent, nu exist criteriu de cutare (altfel spus, selecteaz toate
fiierele), iar aciunea implicit este -print (afieaz numele fiierelor gsite la ieirea
standard). De exemplu,

user@host:~$ find

afieaz toate directoarele i fiierele din directorul curent, incluznd subdirectoarele acestuia.
Comenzile

user@host:~$ find . -print


user@host:~$ find -print
user@host:~$ find .

fac exact acelai lucru. Dac specificm o locaie, atunci afieaz toate directoarele i fiierele
prezente n acel director mpreun cu subdirectoarele sale. Putem redireciona ieirea standard
ntr-un fiier. De exemplu, urmtoarea comand gsete toate fiierele i directoarele din
directorul /etc (mpreun cu subdirectoarele sale) i le introduce n fiierul continut.txt.

user@host:~$ find /etc > continut.txt

Pot fi specificate mai multe locaii n acelai timp, folosind chiar i variabile de mediu.

user@host:~$ find /tmp /var/tmp . $HOME

Urmtoarele exemple folosesc dou criterii de cutare: tipul i numele obiectului cutat. Se
observ c putem folosi operatori de generare dinamic a numelui de fiier (file globbing).
Gsete fiierele cu extensia .conf din directorul curent (i subdirectoare).

user@host:~$ find . type f name *conf

Gsete toate directoarele din /data cu extensia .bak.

user@host:~$ find /data type d name .bak

Gsete fiierele din directorul curent mai noi dect fiierul file.txt.

user@host:~$ find . newer file.txt

Dac dorim s cutm n tot sistemul de fiiere, folosim / ca locaie.

user@host:~$ find / -name passwd

Dac aceast comand nu este executat de root, find va afia un mesaj de eroare pentru
fiecare director n care nu are permisiuni de citire. Mesajele de eroare se ntreprtund cu
fiierele gsite i utilizatorul este nevoit s deruleze pagina n cutarea informaiilor utile.
Aceast problem poate fi evitat prin redirecionarea mesajelor de eroare la un fiier de
dispozitiv special /dev/null, care pur i simplu le elimin.

user@host:~$ find / -name passwd 2>/dev/null

Pe lng find, exist i locate. Utilitarul locate este foarte diferit de find, n
sensul localizeaz fiierele prin intermediul unui index ntr-o baz de date. Locate folosete
o baz de date local n care sunt indexate toate fiierele. Acesta este un proces mult mai rapid
dect parcurgerea recursiv a tuturor directoarelor, dar totodat nseamn i c baza de date
local trebuie actualizat periodic. Actualizarea se face cu ajutorul comenzii updatedb.
root@centos:~# updatedb v
root@centos:~# locate fisier
/root/fisier.txt
/root/fisiere.txt

Majoritatea distribuiilor ruleaz automat updatedb o dat pe zi. Fiierul de configuraie


/etc/updatedb.conf specific directoarele sau numele de fiiere excluse de la indexare.

3. EDITOARE DE TEXT

Editoarele de text sunt utilitare eseniale pentru toi cei care lucreaz cu Linux. Este
foarte important s stpnii cel puin un editor care lucreaz n mod text. Deprinderea unui
astfel de editor de text este foarte important n contextul n care uneori s-ar putea s fii
nevoii s scriei scripturi pe un sistem accesibil numai prin reea. Un editor n mod text poate
fi folosit n lucrul de la distan fr a fi nevoie de mediu grafic instalat pe server sau pe staia
de lucru.

3.1. Editorul de text vim

Vi este editorul de text tradiional al sistemelor Unix. A fost scris de Bill Joy pe cnd
era student la UC Berkeley n 1976 i a servit comunicatea Unix de mai bine de treizeci de
ani. nainte de vi, editorul de text folosit n Unix era ex, un editor de text orientat pe editarea
liniei. Vi a extins ex cu funcionaliti de editare full-screen. Vi i-a primit numele deoarece
pentru a trece din ex la editorul vizual full-screen, utilizatorul trebuia s tasteze vi. Standardul
SUS oblig toate versiunile de Unix s integreze implicit editorul de text vi. Vim este
acronimul lui Vi Improved, o variant extins a lui vi, creat de Bram Moolenaar n 1991.
Vim include toate caracteristicile vi, plus multe altele noi. Vim dispune de un manual
cuprinztor. Manualul poate fi activat din interiorul editorului prin comanda :help (man nu
conine foarte multe informaii). n continuare vom prezenta numai comenzile principale, care
v permit s ncepei s lucrai cu vim.
Deschiderea unui fiier se realizeaz prin comanda vim fisier.txt. Dac
fiierul nu exista nc, va fi creat. Atenie, creat nseamn c a fost selectat o zon temporar
de memorie (buffer) care va reine textul introdus de noi pn la salvarea lui pe disc. Dac
nchidem fiierul fr s salvm datele pe disc, am pierdut tot ce am introdus n fiier, inclusiv
denumirea. Numai salvarea datelor duce la crearea fisier.txt pe disc. Din perspectiva interfeei,
bufferul este zona n care apare textul n curs de editare. Ecranul vim conine un buffer i o
linie de comand aflat n partea de jos a acestuia. n linia de comand sunt afiate informaii
de stare i pot fi introduse comenzi. Vim opereaz n trei moduri de lucru, ceea ce nseamn
c editorul se comport diferit, n funcie de modul de lucru n care se afl: comand, editare
i ultim linie. Urmtoarea figur ilustreaz modul n care lucreaz vim. Sgeile dintre
modurile de lucru sunt etichetate cu tastele care fac trecerea ntre stri.

La pornire, vim se afl n modul comand. n modul comand se poate naviga prin fiier,
aduce modificri n cadrul unei linii, se pot copia pri din linie sau se pot alipi pri la o linie.
Reinei c vim face diferena ntre caractere mari i mici. Modul editare ne permite s
introducem text pn la apsarea tastei ESC, care trece editorul napoi n modul comand.
Acest dualitate de operare nseamn c orice tast poate reprezenta o comand sau un
caracter. De exemplu, tasta i (insert), introdus n mod comand, trece editorul n modul
editare, n modul editare este pur i simplu caracterul i.
Modul editare este indicat prin cuvntul INSERT afiat pe linia de jos a
terminalului. n zona bufferului, liniile libere sunt indicate prin caracterul ~ (tilda). Dac nu
vedem cuvntul INSERT sau prompt-ul de ultim linie (:, /, ?) nseamn c vim se afl
n modul comand.
Salvarea fiierului nseamn o comand, aadar, comutm n mod comand apsnd
tasta ESC. Putem iei din editor cu urmtoarele comenzi:

ZZ salveaz bufferul pe disc i iei


:x - salveaz bufferul pe disc i iei (la fel ca ZZ)
:wq salveaz bufferul pe disc i iei (la fel ca ZZ)
:q iei din editor (funcioneaz numai dac modificrile sunt salvate)
:q! - iei din editor fr s salvezi bufferul pe disc

Comanda : trece editorul n modul de ultim linie. Numele acestui mod este ciudat, dar
provine de la faptul c n acest mod, pe ultima linie exist un prompt. Caracterul : anun
vim c urmeaz o comand. Exemple de astfel de comenzi sunt: salveaz fiierul, prsete
editorul, mut cursorul, terge, caut, nlocuiete, selecteaz poriuni de text. Urmtoarele
comenzi scriu bufferul pe disc.

:w - salveaz bufferul n fiierul curent (fisier.txt)


:w output.txt - salveaz bufferul n fiierul output.txt; nu rescrie fiierul n caz c
acesta exist
:w! output.txt - salveaz bufferul n fiierul output.txt; rescrie fiierul dac exist.

Prima comand salveaz modificrile n fiierul dat ca argument. A doua i a treia comand
ne permite s salvm bufferul ntr-un fiier nou. Pentru a afla informaii suplimentare despre
comanda :w, putem folosi :help :w. Implicit, ecranul va fi mprit n jumtate, cu partea
superioar afind informaii de ajutor. nchiderea noii ferestre de face cu :q.
Navigarea prin text se face de regul cu tastele sgei. Dar pentru c este incomod s
mutm mna frecvent n colul din dreapta jos al tastaturii se pot folosi tastele h, l, k, j (un
caracter la stnga, dreapta, sus, jos). n plus, Space deplaseaz cursorul cu un caracter la
dreapta i Return poziioneaz cursorul la nceputul liniei urmtoare. Alte comenzi care pot
deplasa cursorul sunt:

G - poziioneaz cursorul la ultima linie a documentului


gg - poziionaz cursorul la prima linie a documentului
^ - poziioneaz cursorul la nceputul liniei curente
$ - poziioneaz cursorul la sfritul liniei curente
w - poziioneaz cursorul un cuvnt nainte
b - poziioneaz cursorul un cuvnt napoi
fx - sri la urmtoarea apariie a caracterului x pe linia curent
Fx - sri la precedenta apariie a caracterului x pe linia curent
% - sri la paranteza care corespunde celei de sub cursor.

De asemenea, n mod comand putem modifica textul:

x - terge caracterul sub care este poziionat cursorul


X - terge caracterul dinaintea cursorului
dG - terge de la linia curent pn la sfritul fiierului
dfx - terge tot textul ncepnd cu poziia curent pn la urmtoarea apariei a
caracterului x
dd - terge linia curent
dw - terge urmtorul cuvnt
D - terge restul liniei curente
u - anuleaz ultima comand
U - anuleaz toate modificrile fcute pe ultima linie editat
r - nlocuiete caracterul curent cu cel introdus

Cnd tergi ceva cu x, d (delete), sau alt comand, textul este salvat ntr-o memorie
temporar. l poi realipi cu p (paste, dei termenul tehnic n vi este put). Comanda p are
semnificaii diferite, n funcie de elementele de text terse. Folosit dup dw (delete word):

p - plaseaz textul dup cursor


P - plaseaz textul nainte de cursor

Folosit dup dd:

p - plaseaz textul sub linia curent


P - plaseaz textul deasupra liniei curente

Modificarea unui cuvnt sau a unei pri de cuvnt (de la cursor pn la sfritul cuvntului)
se face prin poziionarea cursorului n locul de nceput i tastarea comenzii cw (change word).
Editorul trece automat n mod editare. Comanda cw este o comand compus din alte dou
comenzi; n acest caz, din alturarea comenzilor c (change) i w (word). Alte exemple:
c$ - schimb ncepnd cu poziia curent pn la sfritul liniei
c^ - schimb ncepnd cu poziia curent pn la nceputul liniei
4cw - schimb urmtoarele 4 cuvinte
5dd - terge urmtoarele 5 linii
3x - terge urmtoarele 3 caractere
3X - terge 3 caractere din faa cursorului
2G - poziioneaz cursorul la a doua linie a documentului

Copierea fr tergere se face cu y (yank). Nu afecteaz textul, dar poate fi folosit n


conjuncie cu p. n acest caz, p se comport la fel ca n cazul lui d.

yw - copiaz urmtorul cuvnt


yy - copiaz linia curent
3yy - copiaz urmtoarele trei linii

Comanda de nlocuire r (replace) plaseaz vim n mod editare. Caracterul tastat va nlocui
caracterul curent, dup care editorul revine automat n mod comand. Pe lng comanda r,
vim trece n mod editare i cu i (insert), a (append) sau o (open). n aceste cazuri, textul va
fi introdus ncepnd cu prima poziie nainte de cursor, prima poziie dup cursor, sau la
nceputul unei linii noi, creat imediat sub linia curent. Alte posibiliti:

O - introduce o linie imediat deasupra celei curente


I - introduce text la nceputul liniei curente
A - introduce la sfritul liniei curente

Pentru a cuta nainte ntr-un text, se folosete comanda /. De exemplu, /text caut
irul text de la poziia curent a cursorului ctre sfritul fiierului. Cutarea napoi se face
cu ? n loc de / . De exemplu, ?text caut de la poziia curent a cursorului ctre nceputul
fiierului.
Comanda de substituie, s (substitute), permite nlocuirea unor pri de text.

:[linii] s/text_vechi/text_nou/opiune

Vechiul text este nlocuit cu cel nou n limita liniilor specificate de domeniul opional [linii].
Domeniul este specificat n format de la, pn la. Dac nu este dat un domeniu, schimbrile
apar numai pe linia curent, considerat implicit. Cmpul opiune modific comanda. De
obicei se folosete caracterul g, care nseamn substituie global. Comanda

:s/test/text

nlocuiete cu text prima apariie a cuvntului test n linia curent. Dac se dorete nlocuirea
tuturor apariiilor din linia curent, se folosete opiunea g

:s/test/text/g
Comanda

:1,10s/test/text

nlocuiete prima apariie a lui test n fiecare din cele 10 linii specificate. Ca s schimbi toate
apariiile lui text n aceste linii, se adaug opiunea g la sfrit.
Vim are cteva comenzi foarte puternice i sofisticate.9 O modalitate de studiu const
n parcurgerea tutorialului vimtutor. Este un tutorial de treizeci de minute care v nva
cele mai ntlnite comenzi vim. Tutorialul poate fi pornit prin introducerea comenzii
vimtutor. Ea va face o copie a fiierului tutore, aa c l putei edita fr a v fi team c
distrugei originalul.

4. MANAGEMENTUL PACHETELOR N
UBUNTU

n Linux, programele pot fi instalate direct din surse (ceea ce presupune compilarea
local a acestora) sau prin intermediul unor pachete. Pachetele conin, de obicei, programe
sub form binar, astfel nct instalarea se face rapid i nu necesit compilare. Pachetele mai
complexe utilizeaz conceptul de dependine. Dependinele sunt pachete suplimentare
necesare funcionrii corecte a pachetului principal. De exemplu, pachetul gcc, care
instaleaz n sistem compilatorul de C, depinde de pachetul cpp care conine preprocesorul,
de pachetul binutils, care conine asamblorul i editorul de legturi, de pachetul libc6-
dev, care conine librriile C standard, etc.. Pentru a putea compila un program, gcc are
nevoie de toate dependinele. De aceea, n afar de fiierele asociate programului, un pachet
conine i un set de metainformaii, precum versiunea, descrierea i dependinele sale. Acestea
sunt folosite de ctre sistemul de gestiune a pachetelor. Sistemul de gestiune a pachetelor
pune la dispoziie toate uneltele necesare instalrii (inclusiv instalarea automat a
dependinelor), dezinstalrii sau actualizrii pachelor de care are nevoie cineva la un moment
dat.
Pachetele specifice sistemului Ubuntu au extensia .deb i de obicei se gsesc n
arhive accesibile prin Internet.

4.1. Managerul de pachete

Managerul de pachete n Ubuntu este dpkg. Poate instala, dezinstala i crea pachete,
dar, spre deosebire de alte managere de pachete, nu le poate descrca de pe Internet i instala
automat i nici nu rezolv dependinele acestora. dpkg lucreaz numai cu pachete descrcate

9
ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf
de utilizator pe sistemul local sau cu pachete deja instalate. Cteva funcionaliti:
afiarea tuturor pachetelor instalate n sistem:

user@host:~$ dpkg -l

n funcie de numrul de pachete instalate n sistem, comanda dinainte poate genera o


cantitate mare de informaii. Putem verifica dac un anumit pachet este instalat prin
conectarea ieirii standard la grep cu operatorul |:

user@host:~$ dpkg -l | grep gnome-terminal

Pachetul gnome-terminal poate fi nlocuit cu orice nume de pachet, parte a unui nume de
pachet sau alte expresii regulate.
listarea fiierelor care aparin unui pachet instalat pe sistem:

user@host:~$ dpkg -L bash

afiarea pachetului care conine un anumit fiier. n acest caz tim fiierul, dar nu tim
din care pachet provine.

user@host:~$ dpkg -S /etc/host.conf

Rezultatul arat c fiiserul aparine pachetului base-files. Totui, multe fiiere generate
automat n timpul procesului de instalare al pachetelor, chiar dac se gsesc pe sistemul de
fiiere, nu pot fi detectate de dpkg -S.
Instalarea unui pachet .deb, descrcat local de administrator:

user@host:~$ sudo dpkg -i zip_2.32-1_i386.deb

dezinstalarea unui pachet:

user@host:~$ sudo dpkg -r zip

Dezinstalarea unui pachet cu dpkg nu este recomandat i trebuie evitat. dpkg nu


rezolv dependine i poate lsa sistemul ntr-o stare inconsistent. Exemplul dezinstaleaz
pachetul zip, dar orice alt pachet care depinde de el va rmne instalat i poate s nu mai
funcioneze corect. Cel mai bine este s se foloseasc un manager de pachete.

1.1. Sistemul de administrare a pachetelor

Sistemul de gestionare al pachetelor, APT (Advanced Package Tool), este un front-


end peste dpkg care permite interogarea arhivelor de pachete, verificarea dependinelor,
descrcarea automat a pachetelor, instalarea unor pachete noi, dezinstalarea pachetelor,
actualizarea pachetelor existente, actualizarea listei de indexuri i chiar actualizarea ntregului
sistem. Comanda apt-get este un utilitar n linie de comand pentru sistemul de gestionare
al pachetelor. apt-get dispune de pagini de manual excelente, n care sunt descrise toate
funcionalitile amintite mai sus.
n general, la prima utilizare a apt-get trebuie s obinei o list cu indexurile
pachetelor disponibile. Lista de indexuri este o baz de date cu pachetele disponibile n
arhivele definite n fiierul /etc/apt/sources.list. Pentru actualizarea listei locale de
indexuri (semnalizeaz modificri aprute recent n arhive), se d comanda :
user@host:~$ sudo apt-get update

Dup aceasta, putei actualiza sistemul:

user@host:~$ sudo apt-get upgrade

Este important de reinut c apt-get upgrade nu dezinstaleaz niciodat pachete sau


adaug pachete noi. n consecin, poate fi folosit n siguran, deoarece nu ar trebuie
niciodat s produc efecte adverse. Totui, ocazional unele pachete nu pot fi actualizate
deoarece n procesul lor de actualizare au nevoie de pachete noi sau de dezinstalarea altora
pentru a satisface anumite dependine. n aceast situaie trebuie folosit comanda sudo
apt-get dist-upgrade.

Instalarea unor pachete noi se face cu urmtoarea comand:

user@host:~$ sudo apt-get install mc

Dezinstalarea pachetelor este un proces la fel de simplu. Pentru a renua la pachetul


mc, instalat n exemplul anterior, scriem:

user@host:~$ sudo apt-get remove mc

Aceast comand nu terge din sistem fiierele de configuraie ale programului astfel nct la
o reinstalare s nu trebuiasc s fie reconfigurat. Dac se dorete ca fiierele de configuraie
s fie terse se adaug opiunea --purge.

user@host:~$ sudo apt-get remove --purge mc

Aceast comand dezinstaleaz tot.

Cu attea pachete la dispoziie, cteodat e dificil de gsit pachetul care conine


comanda sau utilitarul dorit. Comanda de cutare se numete apt-cache i se folosete
astfel:

user@host:~$ sudo apt-cache search emacs

Aceast comand poate returna foarte multe pachete. Multe din rezultate nici mcar nu au
cuvntul emacs n numele pachetului, dar sunt afiate deoarece descrierea lor conine acest
cuvnt. Informaia afiat poate fi filtrat n cteva moduri. O modalitate este s cutm
numai n numele pachetului, nu i n descrierea lor, folosind parametrul -n:

user@host:~$ sudo apt-cache n search emacs

Alt posibilitate este ca rezultatele s fie filtrate folosind cteva expresii regulate simple, cum
ar fi ^, care nseamn ncepe cu, sau $, care nseamn sfrit. De exemplu, se dorete s
afim toate rezultatele care ncep cu cuvntul emacs.

user@host:~$ sudo apt-cache n search ^emacs

Poate cea mai simpl posibilitate este s filtrm rezultatele cu grep.

user@host:~$ sudo apt-cache search games | grep gnome

Dac se dorete mai mult informaie despre pachet, de exemplu, care pachete au nevoie,
recomand sau sugereaz emacs (reverse depends), care pachete sunt necesare, recomandate
sau sugerate de emacs (dependencies), sau ce funcii pune la dispoziie acest pachet
(provides) se folosete comanda:

user@host:~$ sudo apt-cache showpkg emacs

Informaiile mai pot fi afiate i cu sudo apt-cache show emacs. Afiarea arhivelor
din care face parte un pachet, versiunea disponibil, etc.:

user@host:~$ sudo apt-cache policy emacs

Managerul de pachete APT stocheaz toate fiierele .deb pe care le-a descrcat i
instalat n sistem. De obicei directorul folosit este /var/cache/apt/archives i
cteodat poate consuma spaiu considerabil (sute de MB). Eliminarea acestor pachete din
sistem se face cu apt-get clean, comand care terge toate fiierele .deb. Alternativ, se
poate rula apt-get autoclean, care terge fiierele .deb mai vechi dar pstreaz
pachetele mai noi.

5. CONTROLUL ACCESULUI LA FIIERE I


DIRECTOARE

5.1. Drepturi de acces

n Linux, mecanismul standard de control al accesului la fiiere i directoare se


bazeaz pe drepturi de acces la nivel de utilizator i grup. Fiecare fiier i director are
permisiuni de acces care indic cine i n ce mod (doar citire, citire/scriere, etc.) le poate
accesa. De exemplu, pe baza acestor permisiuni, sistemul de operare poate interzice unor
utilizatori accesul la fiierele altui utilizator. Cu toate acestea, sunt situaii n care este nevoie
s partajm fiiere. De exemplu, un grup de programatori care lucreaz la acelai proiect
trebuie s acceseze aceleai fiiere. n acest caz, toi programatorii respectivi pot fi alocai
unui grup creat cu drepturi de acces asupra fiierelor din proiect.
n mod obinuit, un utilizator aparine unui singur grup. Totui, un utilizator poate fi
membru al mai multor grupuri. Din perspectiva drepturilor de acces, n sistem sunt trei tipuri
de utilizatori: posesorul (owner), grupul (group) i toi ceilali (others).
Sistemele de operare Linux, ca i Unix, asociaz fiierelor i directoarelor trei tipuri
de permisiuni de acces: citire (r), scriere (w) i execuie (x). Atributul de citire d acces de
citire, atributul de scriere permite scrierea n fiier sau director, atributul de execuie este
necesar la execuia unui fiier sau afiarea coninutului unui director. Din aceste motive,
permisiunea de execuie trebuie setat pentru fiiere binare sau scripturi care conin cod
executabil sau comenzi.
Deoarece sunt trei tipuri de utilizatori, fiecare cu trei tipuri de permisiuni, sistemul
folosete 9 bii. Pentru vizualizarea drepturilor de acces proprii unui fiier putem folosi
comanda ls cu opiunea -l (long).

user@host:~$ ls -l
drwxr-x--- 3 ubuntu users 4096 2011-08-05 10:29 Documents
-rw-r--r-- 1 ubuntu users 1501 2011-08-12 14:50 fisier.txt

Fiecare linie din listing conine urmtoarea informaie (de la stnga la dreapta):
Prima coloan afieaz tipul i permisiunile de acces pentru fiecare fiier.
o Primul caracter reprezint tipul fiierului. Caracterul d arat c Documents
este un director. Fiierele obinuite se identific prin caracterul (liniu).
o Urmtoarele trei caractere (rwx) reprezint drepturile de acces pentru
utilizatorul ubuntu, care este deintorul directorului. Se observ c
utilizatorul are toate drepturile.
o Urmtoarele trei caractere (r-x) reprezint drepturile de acces pentru
utilizatorii care fac parte din grupul users. Se observ c este prezent
dreptul de citire i execuie, dar lipsete dreptul de scriere.
o Urmtoarele trei caractere (---) reprezint drepturile de acces pentru
utilizatorii care nu sunt ubuntu i nici nu fac parte din grupul users.
Aceti utilizatori nu au niciun drept.
ntregul din a doua coloan arat numrul de legturi. Pentru un director, numrul de
legturi este numrul de subdirectoare pe care le conine, inclusiv . i .. . Pentru un
fiier, legtura poate aprea n cazurile n care partajm fiierul cu alt utilizator aflat
n grupul nostru, ns pentru cele mai multe fiiere numrul de legturi este 1.
Urmtoarea coloan arat posesorul fiierului. De obicei, posesorul este persoana care
l-a creat.
Urmtoarea coloan arat grupul care are acces la fiier.
Urmtorul numr arat dimensiunea fiierului n octei (caractere). n cazul nostru,
dimensiunea fiierului fisier.txt este de 1501 de caractere.
Urmtoarele dou coloane arat data i ora la care a fost creat sau modificat ultima
oar fiierul.
Ultima coloan arat numele fiierului.

Pentru un director, dreptul de citire sau scriere are aceeai semnificaie ca la fiierele
obinuite: ne permite s citim coninutul acestuia, respectiv, ne d posibilitatea s scriem n
directorul respectiv (de exemplu, putem crea un subdirector). Directorul este un fiier ce
conine un tabel cu numele fiierelor din acel director i indicele lor. Permisiunile de citire
pentru un director dau utilizatorului posibilitatea s afieze coninutul tabelului. Dac un
director nu are permisiuni de citire, utilizatorul nu poate lista coninutul acelui director, altfel
spus, nu poate lista numele fiierelor din acel director. Permisiunile de scriere pentru un
director dau utilizatorului posibilitatea s modifice fiierul de tip director. Din moment ce
adugarea unui fiier la director sau tergerea unui fiier din director modific coninutul
fiierului de tip director, utilizatorul nu poate aduga sau modifica fiiere dintr-un director
dect dac acesta are drepturi de scriere. Atenie, utilizatorul poate modifica coninutul
fiierele existente chiar dac nu le poate terge sau aduga unele noi. Utilizatorul poate goli
complet coninutul unui fiier existent ntr-un director fr drepturi de scriere, dar nu l poate
terge din acel director. Dreptul de execuie a fost ns redefinit. Nu putem executa un
director, dar Unix folosete bitul de execuie pentru a controla dac utilizatorul are dreptul s
intre ntr-un director cu cd. Altfel spus, un director fr drept de execuie nseamn c nu
poate fi utilizat ca director curent.

stefan@centos ~$ ls -l
total 4
drw------- 2 stefan stefan 4096 Mar 22 21:27 Director
stefan@centos ~$ cd Director
-bash: cd: Director: Permission denied
stefan@centos ~$ ls Director/
fisier fisier1
Dac acel director face parte dintr-o cale ctre un fiier pe care utilizatorul dorete s
l deschid sau execute, acesta nu va putea accesa acel fiier, deoarece trebuie s treac prin
acel director. n consecin, pentru a putea executa acel fiier, toate directoarele din cale
trebuie s aib setat bitul de execuie.
Un director cu drept de execuie poate fi utilizat ca director curent. Cu toate acestea,
este posibil s nu putem citi sau scrie n acel director. De exemplu, comanda ls nu va lista
fiierele din director dac nu avei dreptul de citire i comanda touch nu va putea crea un alt
fiier dac nu avei dreptul de scriere.

stefan@centos ~$ ls -l
total 4
d--x------ 2 stefan stefan 4096 Mar 22 21:27 Director
stefan@centos ~$ cd Director/
stefan@centos Director$ ls
ls: cannot open directory .: Permission denied
stefan@centos Director$ touch fisier2
touch: cannot touch `fisier2': Permission denied

Dar dac tii numele fiierului, putei obine detalii despre el (ls l fisier) sau
s-l deschidei (cat fisier).

stefan@centos Director$ cat fisier


versiune
stefan@centos Director$ ls -l fisier
-rw-rw-r-- 1 stefan stefan 9 Mar 22 21:40 fisier

Comanda care modific drepturile de acces este chmod (change mode). Cel care
poate determina drepturile de acces pentru un fiier este posesorul acestuia sau utilizatorul
root. Exist dou moduri de reprezentare a drepturilor: numeric sau simbolic.
n form numeric, pentru fiecare entitate exist o cifr n baza 8 care descrie
drepturile, cte un bit pentru fiecare drept. Se scrie 1 pe poziia dreptului activ i 0 pe poziia
celui inactiv. Prin aceast metod, drepturile reprezentate pe 9 bii pot lua valori ntre 000 i
777. Prin aceast procedur, drepturile de acces ale directorului Documents din primul
exemplu (rwx r-x ---) sunt reprezentate n binar ca 111 101 000, echivalent n octal
cu 755. Similar, drepturile fiierului fisier.txt, rw- r-- r--, pot fi exprimate n
octal ca 644. Deoarere acest mod specific drepturile exacte pe care le va avea un fiier, se
numete mod de specificare absolut.

Sistemul de numeraie octal (baza 8), cu simboluri de la 0 la 7, este folosit de obicei


ca modalitate de exprimare a numerelor binare ntr-o form compact, asemenea sistemului
hexazecimal. Numerele n octal sunt convertite n/din binar n acelai mod ca numerele
hexazecimale, numai c grupm cte trei bii, nu patru. Fa de sistemul hexazecimal, are
avantajul c nu folosete digii alfabetici. Totui, rspndirea octetului ca unitate de memorie
fundamental a dus la scderea importanei sistemului de numeraie octal.

n form simbolic, drepturile i entitile sunt exprimate prin iniiala lor. Folosite
mpreun cu expresii de control al modului, acestea pot defini drepturile de acces. n
majoritatea cazurilor, drepturile de acces sunt setate n funcie de drepturile curente. De
exemplu, poi aduga dreptul de scriere sau deselecta dreptul de execuie la drepturile deja
existente ale unui grup. Expresiile de control constau din trei cmpuri, i au forma
<entitate><operator><permisiune>. Valorile acestor cmpuri sunt date mai jos.

Tabelul 5.1 Drepturile de acces n Linux


Cmp Valoare Descriere
Entitate
u Utilizator (user)
g Grupul posesorului (group)
o Toi ceilali care nu sunt n grup (others)
a Toi utilizatorii (all)
Operator
+ Adaug permisiune
- Anuleaz permisiune
= Seteaz permisiune
Permisiune
r Seteaz dreptul de citire
w Seteaz dreptul de scriere
x Seteaz dreptul de execuie
u Seteaz conform permisiunilor curente ale utilizatorului
g Seteaz conform permisiunilor curente ale grupului
o Seteaz conform permisiunilor curente ale tuturor celorlali

Formatul instruciunii chmod este

user@host:~$ chmod mod_de_acces fiier

Modul de acces poate fi exprimat numeric sau simbolic. Iat cteva exemple.
Comanda

user@host:~$ chmod 660 fisier.txt

schimb drepturile de acces ale fiierului fiier.txt n rw- rw- ---. Acest lucru
nseamn c numai proprietarul i grupul din care face parte proprietarul vor putea citi sau
scrie fiierul; toi ceilali utilizatori din sistem nu-l vor putea accesa. Dac dorii s le
permitei acestora din urm s citeasc fiierul, folosii comanda

user@host:~$ chmod o+r fisier.txt

Pentru a modifica permisiunile tuturor fiierelor i subdirectoarelor unui director, se folosete


opiunea -R (recursive). De exemplu, pentru directorul Documents, comanda

user@host:~$ chmod -R 764 Documents

schimb recursiv permisiunile tuturor fiierelor i directoarelor (i subdirectoarelor acestora)


din Documents.

Pentru a modifica grupul care are drepturi asupra unui fiier sau director se folosete comanda
chgrp:

user@host:~$ chgrp root fisier.txt

Posesorul fiierului se poate modifica cu comanda chown:

user@host:~$ chown andrei fisier.txt

De asemenea, comanda chown poate modifica att posesorul ct i grupul n acelai timp:

user@host:~$ chown andrei:andrei fisier.txt


1.1.1. Permisiuni implicite

La crearea unui fiier sau director sunt aplicate anumite permisiuni implicite,
determinate de variabila UMASK. Variabila UMASK specific permisiunile care se aplic n
mod implicit. Valoarea acesteia se afl n fiierul /etc/login.defs iar pentru majoritatea
distribuiilor este 022. Valoarea curent poate fi afiat cu comanda umask.

stefan@centos ~$ umask
0002
stefan@centos ~$ umask -S
u=rwx,g=rwx,o=rx

Dei valoarea este aceeai att pentru fiiere ct i pentru directoare, permisiunile
asupra fiierelor se calculeaz diferit fa de cele ale directoarelor. Pentru fiiere, se scade
valoarea UMASK din 666, iar pentru directoare se scade valoarea UMASK din 777. Aadar,
permisiunile implicite pentru fiiere sunt 644, iar pentru directoare 755.
Valorile 666 i 777 reprezint valorile UMASK maxime pentru fiiere, respectiv
directoare. Valoarea maxim difer deoarece se consider c n cazul fiierelor, drepturi de
execuie trebuie s dein numai fiierele de comenzi (scripturile) i binarele, fiierele
obinuite trebuie s dein numai drepturi de citire i scriere. Directoarele au nevoie de
permisiuni de execuie pentru a putea intra n ele, aadar pot avea permisiunile 777.
Dac se dorete ca nimeni altcineva din sistem s nu poat citi fiierele din directorul
personal se poate configura valoarea umask la 007 editnd fiierul ~/.profile sau
~/.bashrc. Pentru ca valoarea s fie activ trebuie s forai citirea fiierelor de
configuraie bash, dnd comanda source .bashrc.
Ubuntu are o politic mai special. Directoarele create n directorul personal cu
mkdir au permisiunile implicite 755, iar fiierele create cu touch au implicit permisiunile
664 chiar dac varibaila UMASK implicit este 022. Acest lucru se datoreaz unei alte setri,
USERGROUPS_ENAB = yes, prezente tot n fiierul /etc/login.defs, care permite
variabilei UMASK s aib valoarea 002 pentru utilizatorii obinuii dac identificatorul de
utilizator este acelai cu identificatorul de grup, iar numele de utilizator este acelai cu
numele grupului principal (acest lucru este implicit).

1.1.2. Permisiuni avansate

Dac se dorete ca utilizatorii s nu poat terge fiiere care nu le aparin n calitate


de posesor se poate seta bitul sticky pe acel director. Bitul sticky este afiat n aceeai locaie
cu permisiunea de execuie pentru toi ceilali din sistem i este reprezentat de litera t
(semnificnd faptul c i x este prezent acolo) sau cu T (cnd x nu este prezent).

user@host:~$ chmod 1775 /lab2/


user@host:~$ ls ld /lab2
drwxrwxr-t 2 root root 4096 Feb 7 17:38 /project

Bitul sticky este configurat implicit pe directorul /tmp.

user@host:~$ ls ld /tmp
drwxrwxrwt 6 root root 4096 2009-06-04 19:02 /tmp

Dac dorim s ne asigurm c toate fiierele care vor fi create ntr-un director aparin
grupului setat pentru acel director folosim bitul de setgid. Bitul setgid este afiat n acelai loc
cu bitul de execuie de la permisiunile de grup i este reprezentat de un s (cnd x este
prezent) sau S (cnd x nu este prezent). Dup cum arat exemplul de mai jos, chiar dac
utilizatorul student nu aparine grupului proiect, fiierele create de student n /lab2 vor
aparine grupului proiect din moment ce este setat bitul setgid.

user@host:~$ sudo groupadd lab2


user@host:~$ chown student:proiect /lab2
user@host:~$ chmod 2775 /lab2/
user@host:~$ touch /lab2/fisier.txt
user@host:~$ ls ld /lab2/
drwxrwsr-x 2 student proiect 4096 Feb 7 17:45 /lab2/
user@host:~$ ls l /lab2/
total 4
-rw-r--r-- 1 student proiect 0 Feb 7 17:45 fisier.txt

Aplicat la un fiier executabil, bitul setgid va permite execuia acestuia cu


permisiunile grupului configurat pentru acel fiier n loc de permisiunile grupului care l
lanseaz n execuie.
n schimb, dac dorim s executm un executabil cu permisiunile proprietarului su,
nu cu cele ale utilizatorului care l lanseaz n execuie, setm bitul setuid. Acest lucru
nseamn c dac un utilizator execut un program care aparine utilizatorului root i bitul
setuid este setat pentru acel program, atunci programul ruleaz ca root. Acest lucru poate fi
periculos, dar cteodat este util chiar din punctul de vedere al securitii. De exemplu,
parolele sunt stocate n fiierul /etc/shadow, care are numai drepturi de citire din partea
root-ului.

user@host:~$ ls l /etc/shadow
-r-------- 1 root root 1260 Jan 21 07:49 /etc/shadow

Modificarea propriei parole de ctre un utilizator obinuit nseamn actualizarea acestui fiier.
Acest lucru este posibil pentru c binarul /usr/bin/passwd va fi executat cu drepturi de
root, nu cu drepturile utilizatorului care l lanseaz n execuie; altfel spus, are setat bitul
setuid.

user@host:~$ ls l /usr/bin/passwd
-rwsr-xr-x 1 root root 42824 Sep 13 2012 /usr/bin/passwd

1.1.3. Liste de control al accesului

Sistemele de fiiere care recunosc listele de control al accesului trebuie montate cu


opiunea acl. n listingul urmtor se vede cum sistemul de fiiere rdcin are configurat
opiunea acl, n schimb, /home nu are.

root@centos:~# grep acl /etc/fstab


UUID=5e40b3df-3864-4a45-8fde-448e0f7c3dd6 / ext4 acl,defaults 1 1
UUID=8961cdf7-045b-44c6-a298-f282e2d6415e /home ext4 noacl,relatime 0 2

Citirea listelor de control al accesului se face cu /usr/bin/getfacl. Urmtorul exemplu arat


cum pot fi citite acl-urile fiierului fisier.txt.

stefan@centos ~$ getfacl fisier.txt


# file: fisier.txt
# owner: stefan
# group: stefan
user::rw-
group::rw-
other::r--

Scrierea sau modificarea unui acl se face cu /usr/bin/setfacl. Urmtorul exemplu modific acl-
urile fiierului. nti acordm utilizatorului cornel permisiunile octale 7 i grupului helpdesk
permisiunile octale 6.

stefan@centos ~$ setfacl -m u:cornel:7 fisier.txt


stefan@centos ~$ setfacl -m g:helpdesk:6 fisier.txt
stefan@centos ~$ getfacl fisier.txt
# file: fisier.txt
# owner: stefan
# group: stefan
user::rw-
user:cornel:rwx
group::rw-
group:helpdesk:rw-
mask::rwx
other::r--

tergerea unei intrri acl se face cu opiunea setfacl -x.

stefan@centos ~$ setfacl -x cornel fisier.txt


stefan@centos ~$ setfacl -x g:helpdesk fisier.txt
stefan@centos ~$ getfacl fisier.txt
# file: fisier.txt
# owner: stefan
# group: stefan
user::rw-
group::rw-
mask::rw-
other::r--

Observai c omiterea literei u (user) sau g (group) la definirea unui acl pentru un cont va
configura implicit un cont de utilizator.
Dezactivarea unui acl se face cu setfacl b.

stefan@centos ~$ setfacl -b fisier.txt


stefan@centos ~$ getfacl fisier.txt
# file: fisier.txt
# owner: stefan
# group: stefan
user::rw-
group::rw-
other::r--

Masca acl, mask, definete permisiunile maxime efective pentru orice intrare din acl.
Aceast masc este calculat de fiecare dat cnd se execut comenzile setfacl sau chmod.
Putem preveni calcularea mtii folosind opiunea --no-mask.

stefan@centos ~$ setfacl --no-mask -m u:cornel:7 fisier.txt


stefan@centos ~$ getfacl fisier.txt
# file: fisier.txt
# owner: stefan
# group: stefan
user::rw-
user:cornel:rwx #effective:rw-
group::rw-
mask::rw-
other::r--
1.1.4. Legturi simbolice i hard

Pentru a nelege tipurile de legturi dintr-un sistem Linux trebuie ca mai nti s
cunoatem noiunea de inod. Un inod este o structur de date cu informaii despre fiier
(metadate). Cnd sistemul de fiiere stocheaz un fiier nou pe disc, stocheaz nu numai
coninutul (datele) fiierului respectiv, ci i proprieti suplimentare precum numele fiierului,
data crerii, permisiuni, proprietar, etc.. Toate aceste informaii (cu excepia numelui i
coninutului fiierului) sunt stocate n inodul fiierului.
Comanda ls -l afieaz cteva din aceste informaii.

stefan@centos ~$ ls -l
total 4
-rw-rw-r--+ 1 stefan stefan 40 Mar 29 19:08 fisier.txt

Tabela de inoduri conine toate inodurile. Este creat odat cu sistemul de fiiere (cu
mkfs.ext4). Comanda df -i afieaz numrul de inoduri utilizate i libere pentru fiecare
partiie montat.

stefan@centos ~$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 33725 490563 7% /
tmpfs 127547 1 127546 1% /dev/shm

Fiecare inode este identificat printr-un numr unic, numit numr de inode. Numerele de
inoduri pot fi listate cu ls -ali.

stefan@centos ~$ echo 1 > file1


stefan@centos ~$ echo 2 > file2
stefan@centos ~$ echo 3 > file3
stefan@centos ~$ ls -li
total 4
394560 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:48 file1
395626 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:48 file2
395631 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:48 file3

Cele trei fiiere au inoduri diferite (prima coloan). Toate informaiile afiate de ls aparin
inodurilor, cu excepia numelui de fiier (specificat n director). De asemenea, coninutul lor
nu se afl n inod, ci n alt parte a discului. Inodul conine o adres ctre date.
i directoarele au inoduri. De fapt, directorul este un tip special de fiier care conine
un tabel ce mapeaz numele de fiiere la inodurile corespunztoare. Listarea directorului
curent cu ls -ali va afia coninutul fiierului director.

stefan@centos ~$ ls -ali | head -2


total 28
394364 drwx------ 3 stefan stefan 4096 Mar 29 19:57 .
stefan@centos ~$ ls -ali | grep test
393359 drwxrwxr-x 2 stefan stefan 4096 Mar 29 19:57 test
stefan@centos ~$ cd test
stefan@centos test$ ls -ali
total 20
393359 drwxrwxr-x 2 stefan stefan 4096 Mar 29 19:57 .
394364 drwx------ 3 stefan stefan 4096 Mar 29 19:57 ..
394560 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file1
395626 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file2
395631 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file3

n acest caz, cinci nume sunt mapate la inodurile lor. Directorul punct . este o mapare la el
nsui, iar directorul dou puncte .. este o mapare la directorul printe. Celelalte trei nume
sunt mapate la inoduri diferite.

Legturi hard

O legtur hard este creat cu comanda ln fr nicio opiune.

stefan@centos test$ ls -li


total 16
394560 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file1
395626 -rw-rw-r-- 2 stefan stefan 2 Mar 29 19:53 file2
395631 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file3
395626 -rw-rw-r-- 2 stefan stefan 2 Mar 29 19:53 hardlink_to_file2

O legtur hard introduce n director o nou intrare. La un inod existent este mapat un nume
nou de fiier. Dar ambele fiiere au acelai inod, aadar amndou vor avea ntotdeauna
aceleai permisiuni i acelai proprietar. Ambele fiiere vor avea acelai coninut. De fapt,
ambele fiiere sunt acum egale, chiar dac tergem fiierul original, coninutul su va rmne
i va fi gsit cu numele legturii hard. Inodul conine un contor cu numrul de legturi hard
care l adreseaz. Cnd contorul ajunge la zero, inodul este eliberat.
Comanda find poate cuta fiiere n funcie de un inod dat. Urmtorul exemplu
arat cum putem cuta toate fiierele care folosesc inodul 395626. Reinei c numrul unui
inod este unic per partiie.

stefan@centos test$ find / -inum 395626 2> /dev/null


/home/stefan/test/file2
/home/stefan/test/hardlink_to_file2

Legturi simbolice

Legturile simbolice (numite i legturi soft) creaz o mapare nume la nume.


Legturile simbolice sunt create cu comanda ln -s. Dup cum se vede din exemplul
urmtor, legtura simbolic primete propriul inod.

stefan@centos test$ ls -li


total 16
394560 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file1
395626 -rw-rw-r-- 2 stefan stefan 2 Mar 29 19:53 file2
395631 -rw-rw-r-- 1 stefan stefan 2 Mar 29 19:53 file3
395626 -rw-rw-r-- 2 stefan stefan 2 Mar 29 19:53 hardlink_to_file2
395643 lrwxrwxrwx 1 stefan stefan 5 Mar 29 20:19 symlink_to_file2 ->
file2

Permisiunile unei legturi simbolice nu au semnificaie, deoarece se aplic permisiunile


fiierului adresat. Legturile hard sunt limitate la partiia lor (deoarece ele indic un inod),
legturile simbolice pot indica fiiere din orice partiie (chiar i din alte sisteme de fiiere).

tergerea legturilor

Legturile sunt terse cu rm.

stefan@centos test$ rm hardlink_to_file2


stefan@centos test$ rm symlink_to_file2
6. MANAGEMENTUL UTILIZATORILOR

Fiierul cu informaii despre utilizatori este /etc/passwd. Fiecare linie din acest
fiier conine apte coloane desprite prin dou puncte, astfel:
numele utilizatorului;
un caracter x n coloana corespunztoare parolei, care indic faptul c hash-
ul asociat parolei se afl n fiierul protejat de majoritatea utilizatorilor
/etc/shadow;
identificatorul utilizatorului (UID user identifier);
identificatorul grupului principal din care face parte (GID group identifier);
diverse informaii legate de utilizator;
directorul personal;
interpretorul de comenzi rulat n momentul autentificrii n sistem.

Dac este necesar ca fiierul /etc/passwd s fie editat manual, acest lucru trebuie
realizat cu vipw. Comanda vipw nu permite deschiderea fiierului de mai mult de un singur
utilizator odat.
Sistemul de operare identific utilizatorul dup UID (un numr ntreg) nu dup nume.
Identificatorul utilizatorului root este 0, iar directorul personal este /root. Ubuntu
dezactiveaz utilizatorul root i recomand folosirea comenzii sudo. Astfel utilizatorul iniial
creeat la instalarea sistemului este mai special, avnd permisiunea s ruleze comenzi care
necesit drepturi de root, cu sudo precednd numele comenzii, sau s obin un shell cu
drepturi de root dnd comanda sudo -i. De fapt, aceste drepturi sunt generate de
apartenena acestuia la grupul sudo, adugat la fiierul /etc/sudoers ca utilizator
autorizat sudo. Acesta este i rolul grupurilor, s permit aplicarea unor politici n funcie de
apartenena la ele. n loc ca administratorul s aplice permisiuni pentru fiecare utilizator n
parte, permisiunile se configureaz la nivel de grup, iar utilizatorul este adugat la diverse
grupuri n funcie de drepturile pe care trebuie s le primeasc. Pentru a vedea din care grup
face parte un utilizator i, n consecin, ce drepturi are, se folosete comanda id sau
groups.

root@ubuntu:~# id stefan
uid=1000(stefan) gid=1000(stefan) groups=1000(stefan), 4(adm), 27(sudo), 104
(fuse)

root@ubuntu:~# groups stefan


stefan : stefan adm sudo fuse

n momentul crerii unui utilizator, n sistem este adugat automat i un grup cu acelai nume,
introdus n fiierul /etc/group. Acest lucru permite unui utilizator s partajeze fiiere i
directoare cu ali utilizatori adugndu-i pe acetia la grupul su. Grupul adm este folosit
pentru monitorizarea serviciilor de sistem. Membrii acestui grup au dreptul s citeasc fiiere
de jurnal (log) din directorul /var/log. Grupul fuse permite montarea la un director local
a unui sistem de fiiere accesat prin reea.

Fr specificarea numelui de utilizator se afieaz informaii cu privire la utilizatorul curent.

root@ubuntu:~# id
uid=0(root) gid=0(root) groups=0(root)

Dac pentru vreun motiv oarecare se dorete activarea contului de root, pur i simplu i se
atribuie acestuia o parol:

stefan@ubuntu:~$ sudo passwd

Comanda sudo v cere parola personal dup care o parol pentru root. Pentru dezactivarea
parolei pentru contul de root, se folosete comanda:

stefan@ubuntu:~$ sudo passwd l root

ns pentru dezactivarea contului de root:

root@ubuntu:~# usermod --expiredate 1

Pentru mai multe informaii citii pagina de manual, man sudo.

6.1. Adugarea i tergerea unui utilizator

Utilizatorul poate fi creat numai de root cu comanda useradd. n funcie de ce se


dorete aceasta poate lua diverse opiuni. O opiune aproape obligatorie este -m, care creeaz
directorul personal al utilizatorului, implicit un director numit dup numele utilizatorului n
/home i al crui coninut la creeare este o copie a directorului /etc/skel. Cnd
administratorul de sistem creeaz un utilizator, automat se adaug o intrare n /etc/
passwd.

root@ubuntu:~# useradd -m mihai

Dup creearea utilizatorului trebuie s i fie setat o parol iniial. Fr parol utilizatorul nu
poate s intre n sistem.

root@ubuntu:~# passwd mihai


Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Parola trebuie introdus de dou ori. Din motive de securitate caracterele tastate nu vor fi
afiate. Configuraiile implicite pentru noul utilizator pot fi afiate cu comanda useradd -
D:

root@ubuntu:~# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

Aceste opiuni afieaz grupul implicit, directorul n care va fi creat directorul


personal, politicile de expirare a contului i parolei (contul este activ pentru totdeauna i
parola nu expir niciodat), interpretorul de comenzi implicit, directorul care conine valori
implicite pentru interpretorul de comenzi i politica cu privire la csua de email. Toate aceste
opiuni implicite se afl n fiierul /etc/default/useradd. E posibil ca dup adugarea
unui utilizator s fie nevoie s modificm anumite opiuni. De exemplu, s modificm
directorului personal al utilizatorului:

root@ubuntu:~# usermod -d /home/andrei mihai

Atenie, aceast comand nu creaz directorul /home/george, ci numai schimb


numele directorului personal din intrarea corespunztoare utilizatorului mihai din
/etc/passwd.

root@ubuntu:~# grep mihai /etc/passwd


mihai:x:1003:1004::/home/george:/bin/bash

Directorul /home/george trebuie creat manual, atribuindu-se i permisiunile


corespunztoare.

root@ubuntu:~# mkdir /home/george


root@ubuntu:~# chown mihai:mihai /home/george/
root@ubuntu:~# ll /home/
drwxr-xr-x 2 mihai mihai 4096 Mar 16 22:11 george/

E posibil ca utilizatorul s doreasc un anumit nume de utilizator, i ne aduce la


cunotin acest lucru dup crearea contului. n exemplul urmtor am schimbat numele
contului mihai n george:

root@ubuntu:~# usermod -l george mihai


root@ubuntu:~# grep george /etc/passwd
george:x:1003:1004::/home/george:/bin/bash

Comanda usermod este foarte util i poate modifica un numr mare de opiuni. De
exemplu adugarea utilizatorului la un alt grup se realizeaz cu:

root@ubuntu:~# usermod -a -G sudo george


root@ubuntu:~# id george
uid=1003(george) gid=1004(george) groups=1004(george),27(sudo)
Fii foarte ateni atunci cnd folosii usermod pentru adugarea utilizatorilor la
grupuri. Implicit, comanda usermod va scoate utilizatorul din toate grupurile la care era
membru i l va introduce n grupul specificat n comand. Opiunea -a (append) previne
acest comportament. Pentru alte opiuni folosii man usermod.

Comanda userdel terge un utilizator din sistem. Aceast comand ndeprteaz


intrarea corespunztoare din /etc/passwd i din /etc/group. Opiunea -r terge i
toate fiierele i directoarele utilizatorului (cum ar fi fiierul de mailuri din
/var/spool/mail).

root@ubuntu:~# userdel -r mihai

Dac nu se folosete opiunea -r, directorul personal al utilizatorului din /home i


fiierul de email din /var/spool/mail/ trebuie terse manual.

n Ubuntu, adugarea i tergerea unui utilizator pot fi efectuate i prin rularea


scripturilor adduser, respectiv deluser. Acestea au avantajul de a fi ntructva
interactive. Mai multe informaii pot fi aflate cu comanda man.

6.2. Modificarea opiunilor pentru un utilizator

Dac gzduii un sistem cu mai muli utilizatori, trebuie s fii ateni la permisiunile
directoarelor personale. Implicit, directoarele personale n Ubuntu sunt create cu permisiuni
globale de citire i execuie. Acest lucru nseamn c toi utilizatorii pot accesa coninutul
directoarelor personale ale altor utilizatori. Dac acest lucru nu este dorit, se pot modifica
permisiunile folosind urmtoarea comand:

root@ubuntu:~# ll /home/
drwxr-xr-x 2 mihai mihai 4096 Mar 16 21:00 mihai/
root@ubuntu:~# chmod 0750 /home/mihai
root@ubuntu:~# ll /home/
drwxr-x--- 2 mihai mihai 4096 Mar 16 21:00 mihai

O cale mai elegant, atunci cnd se folosete scriptul adduser, este s se modifice fiierul
de configuraie al acestuia, /etc/adduser.conf, astfel nct variabila DIR_MODE s ia
valoarea 0750. n acest caz, oricnd este creat un utilizator cu adduser permisiunile asupra
directorului personal sunt corecte.

Este indicat ca administratorul de sistem s impun o politic de modificare regulat


a parolei prin forarea utilizatorilor s i modifice parola atunci cnd aceasta expir. Pentru
afiarea strii unui cont se folosete urmtoarea comand:

root@ubuntu:~# chage -l mihai


Last password change : Mar 16, 2014
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

Din listing reiese c pentru acest cont nu sunt n vigoare politici de restricionare. Acestea
sunt valorile implicite prezente n fiierul /etc/login.defs i copiate de utilitarul
useradd n intrarea corespunztoare fiecrui utilizator din /etc/shadow. Fiierul
/etc/shadow conine urmtoarele coloane desprite prin dou puncte:
numele utilizatorului;
parola criptat ($1$ nseamn MD5, iar $6$ SHA51210);
data la care a fost modificat parola ultima oar (n zile trecute de la 1 ianuarie 1970);
numrul minim de zile care trebuie s treac nainte ca parola s poat fi modificat;
numrul maxim de zile pentru care parola este activ;
numrul de zile nainte de expirarea parolei cu care este atenionat utilizatorul c
trebuie s i schimbe parola;
numrul de zile dup expirare pn la dezactivarea contului. Utilizatorul poate nc
intra n cont i modifica parola n aceast perioad. Dup acest numr de zile contul
este blocat, devenind inactiv;
data la care contul va expira (n zile trecute de la 1 ianuarie 1970);
nu nseamn nc nimic, rezervat pentru utilizri viitoare.

Pentru modificarea oricrei valorile referitoare la parol i cont se d urmtoarea


comand i se rspunde la ntrebri:

root@ubuntu:~# chage mihai

Alt posibilitate este s se foloseasc opiunile chage pentru modificare manual a


datei de expirare a contului (-E), numrul minim de zile ntre modificrile parolei (-m),
numrul maxim de zile pentru care parola este activ (-M), perioada de inactivitate dup
expirarea parolei (-I) i perioada de atenionare nainte de expirarea parolei (-W).

root@ubuntu:~# chage -E 01/31/2015 -m 5 -M 90 -I 30 -W 14 mihai


root@ubuntu:~# chage -l mihai
Last password change : Mar 16, 2014
Password expires : Jun 14, 2014
Password inactive : Jul 14, 2014
Account expires : Jan 31, 2015
Minimum number of days between password change : 5
Maximum number of days between password change : 90
Number of days of warning before password expires : 14

Comanda date poate calcula o dat aflat n viitor:

root@ubuntu:~# date -d +45 days


Sun Jan 24 21:19:16 EET 2016

10
mkpasswd m sha-512 parola
Urmtoarea comand va fora utilizatorul s i nlocuiasc parola la prima intrare n
cont:

root@ubuntu:~# chage -d 0 mihai

Contul poate fi blocate oricnd cu comanda passwd -l (lock) i deblocat cu


passwd -u (unlock).

6.3. Gestionarea grupurilor

Crearea i tergerea unui grup se efectueaz cu comenzi groupadd i groupdel.


n Ubuntu pot fi folosite scripturile addgroup i delgroup.

root@centos:~# groupadd helpdesk


root@centos:~# groupdel helpdesk

stefan@ubuntu:~$ sudo addgroup numegrup


stefan@ubuntu:~$ sudo delgroup numegrup

Un utilizator poate face parte din mai multe grupuri. Apartenena la grupuri este
definit n fiierul /etc/group.

root@centos:~# tail 5 /etc/group


sshd:x:74:
slocate:x:21:
ntp:x:38:
stefan:x:500:
andrei:x:501:

Primul cmp reprezint numele grupului. Al doilea cmp reprezint parola (criptat) a
grupului (poate lipsi). Al treilea cmp este identificatorul de grup (GID). Al patrulea cmp
este o list de membrii, grupurile de mai sus nu au niciun membru. Dac trebuie editat direct,
fiierului /etc/group trebuie modificat numai cu utilitarul vigr. La fel ca vipw, vigr
d control exclusiv pe fiierul /etc/group i l protejeaz de o dubl editare.

Numele unui grup se modific cu groupmod.

root@centos:~# groupadd helpdesk


root@centos:~# tail -1 /etc/group
helpdesk:x:502:
root@centos:~# groupmod n help helpdesk
root@centos:~# tail -1 /etc/group
help:x:502:

Administratorul de sistem poate delega controlul unui grup altui utilizator din sistem. n
urmtorul exemplu delegm drepturile de adugare i tergere a membrilor la grupul
helpdesk utilizatorului costel. Apoi comutm (su -) la utilizatorul costel i adugm
utilizatorul cornel la grupul helpdesk.

root@centos:~# groupadd helpdesk


root@centos:~# gpasswd -A costel helpdesk
root@centos:~# su - costel
costel@centos ~$ id costel
uid=502(costel) gid=503(costel) groups=503(costel)
costel@centos ~$ gpasswd -a cornel helpdesk
Adding user cornel to group helpdesk
costel@centos ~$ id cornel
uid=503(cornel) gid=504(cornel) groups=504(cornel),505(helpdesk)
costel@centos ~$ tail -1 /etc/group
helpdesk:x:505:cornel

Nu este neaprat necesar ca administratorii de grupuri s fac parte din grupul gestionat.
Informaia cu privire la administratorii de grupuri se afl n fiierul /etc/gshadow.

root@centos:~# tail -1 /etc/gshadow


helpdesk:!:costel:cornel

Pentru a retrage drepturile de administrare se folosete comanda gpasswd cu o list goal de


administrare.

root@centos:~# gpasswd -A "" helpdesk


root@centos:~# tail -1 /etc/gshadow
helpdesk:!::cornel

6.4. Comenzi privilegiate

n majoritatea distribuiilor, contul de root este activ, n sensul c dispune de o


parol configurat n timpul procesului de instalare. n acest caz, tot ce trebuie s faci pentru a
deveni root este s foloseti comanda su (substitute user) i s introduci parola de root.
Cnd se dorete ieirea din sesiunea de lucru root se revine cu exit.

stefan@centos:~$ su
Password:
root@centos:~# exit

Ubuntu dezactiveaz contul de root. Din moment ce n Ubuntu utilizatorul root nu


are parol, comenzile care necesit drepturi de root trebuie rulate cu sudo.

stefan@ubuntu:~$ sudo apt-get install vim-nox

Diferena dintre su i sudo este c su te foreaz s partajezi parola de root cu ali


utilizatori n timp ce sudo permite execuia unor comenzi de sistem fr a cunoate parola de
root. Sudo este un binar cu bitul setuid setat, care execut n locul utilizatorilor
autorizai comenzi cu drepturi de root. Utilizatorii trebuie s precead comanda cu sudo i
s introduc propria parol a le executa.
Comanda sudo este configurat prin intermediul fiierul de configuraie /etc/
sudoers. Acesta trebuie editat de ctre root cu utilitarul visudo, niciodat cu un editor
standard de text. Pentru a se asigura c nu sunt prezente erori de sintax, utilitarul visudo
ruleaz un proces de validare a fiierului sudoers nainte de a-l nchide. Acest lucru este
foarte important deoarece o astfel de eroare poate bloca operaiile cu sudo, uneori singura
posibilitate de a obine privilegii de root. Tradiional, visudo deschide fiierul
/etc/sudoers cu editorul de text vi. Totui, Ubuntu a configurat visudo s foloseasc
editorul de text utilizat implicit n sistem, care este nano. Modificarea editorului implicit de
text se realizeaz face cu urmtoarea comand (selectai numrul corespunztor editorului de
text dorit).
stefan@ubuntu:~$ sudo update-alternatives --config editor

Fiierul de configuraie conine o list cu utilizatorii care pot executa sudo. Mai jos
sunt listate rolurile definite implicit n fiierul /etc/sudoers ntr-o distribuie Ubuntu.

# User privilege specification


root ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges


%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command


%sudo ALL=(ALL:ALL) ALL

Sintaxa unei linii este:

Nume_utilizator Nume_sistem=(utilizator_efectiv) comand

unde,
Nume_utilizator este utilizatorul sau grupul de utilizatori pentru care se aplic
aceast regul sudo. n cazul grupurilor, numele acestora se prefixeaz cu
simbolul %, deoarece un sistem poate avea utilizatori i grupuri cu acelai nume.
Nume_sistem definete hosturile pentru care se aplic aceast regul sudo. Acest
cmp este util cnd sunt folosite mai multe maini.
Utilizator_efectiv este o valoare introdus ntre paranteze rotunde i
definete utilizatorul n locul cruia utilizatorul din prima coloan paote executa o
comand.
Comanda sau setul de comenzi care poate fi rulat de utilizatorul specificat n prima
coloan cu drepturile utilizatorului din a treia coloan.

Cuvntul cheie ALL semnific toi utilizatorii, toate sistemele, toate comenzile, n
funcie de poziia sa n linie. Astfel, ntr-o regul de genul:

root ALL=(ALL:ALL) ALL

Primul ALL indic faptul c aceast regul se aplic tuturor hosturilor. Al doilea ALL
indic faptul c utilizatorul root poate rula comenzi n locul tuturor utilizatorilor. Al treilea
ALL indic faptul c root poate rula comenzi cu drepturile oricrui grup. Ultimul ALL indic
faptul c aceste reguli se aplic la toate comenzile. Acest lucru nseamn c utilizatorul root
poate s foloseasc sudo pentru a rula orice comand cu drepturile oricrui utilizator din
sistem.
A doua i a treia regul din fiierul /etc/sudoers permite oricrui utilizator care
este membru n grupul admin sau sudo s ruleze orice comand cu drepturi de root.
Diferena dintre ele este determinat de (ALL) i (ALL:ALL). Prima nseamn c pot fi
rulate comenzi cu drepturile oricrui utilizator. A doua, c pot fi rulate comenzi cu drepturile
oricrui utilizator i oricrui grup de utilizatori din sistem. n Ubuntu, utilizatorul creat la
instalare este automat inclus n grupul sudo.
Cteva exemple:

andrei ALL=(root) /usr/sbin/useradd, /user/sbin/userdel


%accounts ALL=(root) /usr/sbin/adduser, /usr/sbin/passwd

Prima regul spune c utilizatorul andrei are dreptul s ruleze cu drept de root
comenzile /usr/sbin/useradd i /usr/sbin/userdel. A doua regul spune c toi
membrii grupului accounts au dreptul s ruleze cu drepturi de root comenzile
/usr/sbin/adduser i /usr/sbin/passwd. Observai c am specificat calea
complet pentru comenzi. Aceasta din motive de securitate. Dac, de exemplu, n loc de
/usr/sbin/useradd am fi specificat numai useradd, utilizatorul ar fi putut creea i
lansa n execuie din directorul su personal un script propriu numit useradd, care ar fi
executat orice ar fi dorit acesta. n acest fel, andrei ar fi putut rula ca root orice comand
ar fi dorit prin intermediul scriptului local useradd.
Dac numrul de comenzi pe care utilizatorul are dreptul s l dea este mai mic de
zece, comenzile pot fi specificate una dup alta, desprite prin spaiu. Dac lista de comenzi
este mai lung sau se dorete o descriere elocvent pentru comenzile respective se poate crea
un alias. Fiierul de configuraie /etc/sudoers permite mai multe tipuri de alias-uri: host-
uri, utilizatori i comenzi (man sudoers pentru mai multe informaii). De exemplu,

User_Alias administratori=ion, catalin, andrei


Cmnd_Alias conturi=/usr/bin/useradd,/usr/sbin/userdel

O regul care folosete aceste aliasuri este urmtoarea:

administratori ALL= conturi

Dac nu specificm utilizatorul (i/sau grupul) cu drepturile cruia trebuie s rulm


comenzile, se folosete implicit root. Dac dorim ca utilizatorii din grupul administratori s
execute comenzile din aliasul conturi fr s introduc o parola, putem modifica regula astfel:

administratori ALL= NOPASSWD: conturi

Eticheta NOPASSWD arat c nu se va cere parola la rularea comenzii. Exist i


eticheta PASSWD, folosit implicit. O etichet este relevant din poziia sa ctre restul liniei
dac mai ncolo nu este prezent eticheta cu semnificaie opus. De exemplu,

administratori ALL= NOPASSWD: conturi, PASSWD: /usr/sbin/passwd

Alt etichet util este NOEXEC, care poate preveni comportamenul periculos a unor
programe precum less. Programul less poate lansa n execuie alte comenzi din interiorul
interfeei sale dac se folosete semnul exclamrii astfel:

!comand

Acest lucru execut practic orice comand cu drepturile cu care ruleaz less n acel moment,
lucru care poate fi chiar root. Pentru a limita acest lucru se folosete urmtoarea regul:

username ALL = NOEXEC: /usr/bin/less

Pe lng liniile de reguli, n fiierul /etc/sudoers se mai ntlnesc cteva.

Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:
/usr/bin:/sbin:/bin"

Prima linie reseteaz mediul de lucru al terminalului pentru a ndeprta orice variabile
de mediu ale utilizatorului care lanseaz o comand cu sudo. Aceasta este o msur de
siguran destinat s curee variabilele de mediu cu potenial periculos din sesiunea sudo. A
doua linie specific directoarele n care interpretorul de comenzi va cuta binarele folosite
pentru operaiile sudo. Acest lucru previne utilizarea variabilei PATH a utilizatorului, tot din
motive de securitate.

6.5. Identificatorii reali i efectivi

La nivelul kernelului utilizatorii i grupurile nu sunt identificate dup nume, ci dup


numere. Fiecare nume de utilizator sau grup este mapat la un ntreg pozitiv unic numit
identificator de utilizator, respectiv de grup. Aceast mapare se face prin intermediul fiierelor
/etc/passwd i /etc/group. Am vzut c identificatorul de utilizator i grup 0 se
numete root.
Pe de alt parte, fiecare proces are asociat un identificator de utilizator i grup i,
atunci cnd ncearc s deschid un fiier, aceti identificatori determin dac procesului
trebuie s i se acorde dreptul sau nu. Aceti identificatori constituie privilegiile efective ale
procesului, deoarece ei determin ce poate i ce nu poate s fac un proces. n mod obinuit,
aceti identificatori poart numele de identificator efectiv de utilizator, respectiv de grup.
Atunci cnd un utilizator obinuit execut comanda passwd, identificatorul efectiv
de utilizator al procesului este setat la 0, adic la identificatorul utilizatorului root. n
consecin, programului i se permite s modifice fiierul /etc/passwd. Dar un utilizator
normal poate modifica numai propria parol, nu are dreptul s modifice parola altui utilizator.
Se pune ntrebarea de unde tie procesul cine l-a lansat n execuie? Acesta este rolul altei
perechi de identificatori, numii identificatori reali de utilizator i grup. Aceti identificatori
determin cine este un utilizator cu adevrat. Valoarea identificatorului real de utilizator nu
este modificat atunci cnd se ruleaz un program ca passwd i programul nu trebuie dect s
verifice dac numele de utilizator corespunde identificatorului real de utilizator pe care l
cunoate.
Un utilizator poate face parte din mai multe grupuri n acelai timp. Toate aceste
grupuri sunt introduse ntr-un vector de grupuri adiionale asociat cu fiecare proces, numit
identificator suplimentar de grup. Ceea ce noi am numit pn acum GID, reprezint de fapt
identificatorul prima de grup. n acest caz nu exist un set real sau efectiv de identificatori
suplimentari de grup, exist un singur set. Pe de o parte, ei fac parte din privilegiile efective
ale unui proces, deoarece determin de exemplu, dac un proces are dreptul de acces la un
fiier. Pe de alt parte, lansarea n execuie a unei aplicaii cu bitul setgid setat nu altereaz
acest vector de grup.
7. INTERPRETORUL DE COMENZI

7.1. Terminal vs interpretor de comenzi

Consola, terminalul i tele-imprimanta (tty - teletypewriter) sunt nrudite. Ele


semnific un dispozitiv prin care se poate interaciona cu calculatorul. n anii de nceput a
sistemelor de calcul interaciunea cu mainframe-urile i minicomputerele se fcea printr-un
dispozitiv numit teleimprimant, compus dintr-o tastatur, o main de scris (astfel nct
utilizatorul s vad ce a scris) i un transmitor. Teleimprimantele au fost adaptate s
funcioneze ca interfee cu utilizatorul. Transmiteau datele caracter cu caracter, pe msur ce
erau tastate, i imprimau rspunsul. Acest dispozitiv, din punct de vedere electronic era numit
terminal (captul terminal al unui fir electric), iar din punct de vedere al aspectului fizic (ca
pies de mobilier), consol. n timp, locul imprimantei a fost luat de monitor, dar interfaa cu
utilizatorul a rmas practic aceeai. Aceasta a fost originea terminalului text i a interfeei n
linie de comand (CLI - Command Line Interface).
La sistemele de operare timpurii, precum RT-11 de la Digital, teleimprimantele erau
conectate prin linii seriale de comunicaie i primeau nume de dispozitiv care ncepeau cu tt.
Aceast convenie a fost adoptat i de alte sisteme de operare, de exemplu cele din familia
Unix. Unix i toate sistemele nrudite folosesc prefixul tty. Aadar, iniial, terminalele
comunicau cu calculatorul prin portul serial, folosind interfaa serial RS-232. Sistemele IBM
erau conectate cu un cablu coaxial folosind protocolul IBM SNA. Mai trziu au fost introduse
aa numitele terminale inteligente, cum ar fi IBM 3270, VT52 i VT100 realizate de DEC.
Ele se numeau inteligente deoarece puteau s interpreteze caractere de control (secvene de
escape11) utile n procesul de poziionare a cursorului i de control a afirii (multe terminale
aveau comenzi incompatibile).
n prezent, cuvntul terminal a pstrat sensul de dispozitiv prin care cineva
interacioneaz cu calculatorul, de obicei o tastatur i un monitor. n sensul cel mai ntlnit,
terminalul este sinonim cu un dispozitiv tty (fiier de dispozitiv implementat de kernel). n
terminologie Unix, /dev/tty este un tip special de fiier de dispozitiv care, pe lng
comenzile de citire i scriere, recunoate i un numr de comenzi de control (ioctl). Unele
fiiere de dispozitiv tty sunt puse la dispoziie de kernel i nu de dispozitive hardware.
Acestea, numite i pseudo-tty, sunt simple programe, numite emulatoare de terminal. Un
emulator de terminal este o aplicaie care poate emula unul sau mai multe tipuri de terminale
ntr-o fereastr grafic. Printre exemple, enumerm, xterm (care ruleaz n sistemul X
Window), gnome-terminal (terminalul din mediul grafic GNOME), konsole (terminalul din
mediul grafic KDE), screen (care ofer un nivel de izolare ntre un program i alt terminal),
ssh (care conecteaz un terminal aflat pe staia local de interpretorul de comenzi al unei
maini accesate prin reea), expect (pentru interaciuni la nivel de script), etc.. n prezent,
majoritatea emulatoarelor de terminal emuleaz cel mai comun terminal, DEC VT100, care
folosete standardul de caractere de control ANSI X3.64.
Consola denot un terminal fizic conectat direct la main. Sistemul de operare
reprezint consola tot ca fiier de dispozitiv tty. Pe unele sisteme, cum ar fi Linux, consola
apare sub forma mai multor dispozitive tty (combinaia de taste CTRL-ALT-F1 CTRL-
ALT-F6 comut ntre aceste tty-uri).

11
Funcii cum ar fi tergerea unei linii, tergerea ecranului, controlul poziiei cursorului.
7.2. Mediul de lucru bash

n Linux, un shell este mai mult dect un interpretor de comenzi. Poate face mai mult
dect s citeasc comenzi i s le execute. Un shell este i un interpretor de limbaj de
programare, permite utilizatorului s defineasc variabile, s evalueze expresii sau s
foloseasc structuri de execuie condiionat, cum ar fi while i if.

7.2.1. Parametri i variabile

Mediul de lucru al interpretorului de comenzi reprezint informaia folosit de


programele rulate n linie de comand n scopuri de configurare. Informaia mediului de lucru
este stocat sub forma unor variabile de tipul VARIABIL=valoare, unde VARIABIL
este numele variabilei, iar valoare este valoarea sa. Funcionalitatea tipic a informaiei
mediului de lucru include abilitatea de a defini directorul implicit al utilizatorului, terminalul
implicit, navigatorul web implicit, editorul de text implicit, etc.. Dac variabila primete mai
multe valori, acestea sunt separate prin simbolul dou puncte, :. Programele parcurg valorile
n ordine (de la stnga la dreapta). Variabilele mediului de lucru sunt de dou tipuri:
variabile globale folosite pentru transmiterea de informaie ntre interpretorul de
comenzi i programele rulate de acesta. Pot fi accesate de procesele copil ale
programelor lansate n execuie din interpretorul de comenzi curent sau de
interpretoarele de comenzi derivate din acesta (copil). Acest lucru este posibil
deoarece procesul derivat motenete variabilele mediului de lucru proprii printelui.
Pot fi vzute cu comanda env sau printenv. Sunt create cu comanda export
var=valoare.
variabile locale variabile cu efect restricionat la interpretorul de comenzi curent.
Acest lucru nseamn c programele i comenzile care folosesc interpretorul curent
pot folosi i modifica aceste variabile. Dac este deschis o instan de shell separat
sau dac programul creaz un copil atunci variabilele interpretorului nu sunt vizibile.
Aadar, variabilele interpretorului pot fi privite ca variabile temporare de mediu de
lucru, active numai pn la sfritul sesiunii curente. Pot fi vzute cu comanda set.
Sunt setate cu var=valoare.

Variabilele locale sunt disponibile numai interpretorului de comenzi care le creaz


(unei sesiuni de lucru), n timp ce variabilele globale pot fi accesate de procesele copil ale
interpretorului de comenzi. Variabilele mediului de lucru sunt scrise ntotdeauna cu majuscule
pentru a le diferenia de variabilele create de utilizator.
Un caracter important interpretat de shell este semnul $ (dolar). Shell-ul va cuta o
variabil de mediu de lucru cu numele irului care urmeaz dup semnul dolar i o va nlocui
cu valoarea variabilei (sau cu nimic dac variabila nu exist).

stefan@centos ~$ echo $TERM


xterm-256color

Cel mai vechi emulator de terminal integrat n interfaa grafic X Window este xterm.
Terminalul xterm emuleaz att modul text al terminalelor VT102/220 ct i mediul grafic
Tektronix 4014 (similar cu 4010). Deoarece nu consum foarte multe resurse (n special
memorie) este foarte popular. Versiunile mai noi emuleaz inclusiv codurile pentru controlul
culorii. Textul color este manipulat cu secvena CSI n1 [;n2 [; ]] m, unde n1, n2,
este un parametru de selecie a randrii grafice. Caracterul m de la final indic faptul c
este vorba de un cod de formatare a culorii 12 . Poate fi specificat un singur parametru de

12
Numit i cod SGR (Select Graphic Rendition).
randare grafic sau mai muli n acelai timp, separai prin caracterul punct i virgul. Exist
trei clase de parametrii de randare grafic: coduri de control a formatrii, a culorii textului i a
culorii fundalului. Tabelul urmtor prezint civa parametrii de randare grafic.

Cod Efect Descriere


0 Reset / Normal Dezactiveaz toate atributele.
1 Bolduiete sau crete intensitatea
2 Scade intensitatea culorii Implementat rar.
3 Folosete font nclinat (italic) Implementat rar.
4 Subliniaz jos
5 Pulseaz rar Mai puin de 150 de ori pe minut.
6 Pulseaz rapid Mai mult de 150 de ori pe minut. Implementat rar.
7 Imagine negativ Inverseaz culoarea fundalului cu a textului.
8 Ascunde textul Seteaz culoarea textului la culoarea fundalului.
Implementat rar.
30-37 Configureaz culoarea textului 30 + x, unde x este luat din tabelul de culoare de
(foreground) mai jos.
38 Configureaz culoarea textului Urmtoarele argumente sunt 5;x, unde x este
pentru terminalele xterm- indexul culorii (0..255)
256color (foreground)
39 Culoarea implicit a textului Definit de fiecare implementare (conform
(foreground) standardului)
40-47 Configureaz culoarea 40 + x, unde x este luat din tabelul de culoare de
fundalului mai jos
48 Configureaz culoarea Urmtoarele argumente sunt 5;x, unde x este
fundalului pentru terminalele indexul culorii (0..255)
xterm-256color
49 Culoarea implicit a fundalului Definit de fiecare implementare (conform
standardului)
90-99 Configureaz culoarea textului,
intensitate ridicat
100-109 Configureaz culoarea
fundalului, intensitate ridicat

Aa cum reiese din tabelul de mai sus, codurile CSI 30+n definesc culoarea pentru text, unde
n se afl n tabelul de mai jos, iar codurile CSI 40+n definesc culoarea pentru fundal.

Negru ar fi \e[30m, rou \e[31m. Putem combina parametrii de randare grafic. Astfel,
obinem acelai efect i dac specificm codul de reset n fa, \e[0;30m, respectiv
\e[0;31m. Dac am dori gri bold am folosi \e[30;1m, iar bold rou \0x1b[31;1m
(observai c, la ultimul cod, caracterul ESC a fost specificat prin valoarea sa numeric n
hexazecimal \0x1b). Acelai lucru se obine i cu \e[1;30m . Pentru anularea culorilor,
putem reseta culorile la valorile implicite, \e[39;49m, sau anula toate atributele, \e[0m.
Putem testa valorile prezentate modificnd aspectul promtului.
Variabila PS1 definete aspectul prompt-ului. Interpretorul de comenzi bash
permite utilizarea unor caractere speciale cum ar fi \u pentru numele de utilizator sau \w
pentru directorul de lucru.
stefan@centos ~$ PS1='\e[31m\u \w\$ '
stefan ~$ PS1='\e[34m\u \w\$ '
stefan ~$ PS1='\e[39;49m\u \w\$ '
stefan ~$

Pentru terminalele xterm care suport 256 de culori, codurile de culoare se obin cu
secvenele \e[38;5;km i \e[48;5km, pentru culoarea textului respectiv fundalului, unde
k este culoarea:
0x00 - 0x07: culorile standard (ca n \e[30..37m);
0x08 - 0x0F: culori de intensitate ridicat (ca n \e[90..97m);
0x10 - 0xE7: 666=216 culori: 16 + 36r + 6g +b (0 r,g,b 5, unde r, g, b
reprezint valorile rou, verde, albastru);
0xE8 - 0xFF: scal gri de la negru la alb n 24 de pai.

Exist i alte dou standarde de culoare, culorile standard CSS/HTML i culorile X Windows,
care standardizeaz att numele culorilor ct i valorile RGB asociate acestora, dar secvenele
de control standard specific numai numele culorii, nu i valorile RGB. De aceea, fiecare tip
de terminal folosete o nuan diferit pentru o anumit culoare13.
Tabelul de mai jos arat caracterele speciale ce pot fi folosite n irul promptului.

Caracter Descriere
\a Emite un sunet.
\d Afieaz data n format "Zi Lun Dat".
\e Caracter de control ASCII.
\h Numele local al calculatorului.
\H Numele de domeniu al calculatorului.
\j Numrul de sarcini gestionat n prezent de interpretorul de comenzi.
\l Numrul fiierului de dispozitiv al terminalului curent.
\n ASCII newline.
\r ASCII carriage return.
\s Numele interpretorului de comezi.
\t Timpul curent n format HH:MM:SS de 24 de ore.
\T Timpul curent n format HH:MM:SS de 12 ore.
\@ Timpul curent n format am/pm 12 ore.
\u Numele utilizatorului curent.
\v Versiunea interpretorului de comenzi bash.
\V Versiunea complet a interpretorului de comenzi bash.
\w Directorul de lucru curent.
\W Numele de baz al directorului de lucru curent.
\! Numrul comenzii n istoricul interpretorului de comenzi.
\# Numrul comenzii n istoric pentru comanda dat.
\$ Un caracter dolar pentru un utilizator normal, sau un diez pentru root.
\nnn Caracterul corespunztor valorii octale nnn.
\\ Un caracter \.
\[ ncepe o secven de caractere de control.
\] Sfrete o secven de caractere de control.

Observai c toate caracterele de control ncep cu \. Acest lucru distinge ntre un caracter de
control i un caracter obinuit. n urmtorul exemplu modificm de cteva ori aspectul
prompt-ului.

13
Pentru un tabel cu codurile RGB mapate la numele culorii pentru terminalele xterm, putty,
Terminal.app vizitai http://en.wikipedia.org/wiki/ANSI_escape_code.
stefan@centos ~$ PS1='> '
> PS1='\u@\h:\W$ '
stefan@centos:~$ PS1='[\t][\u]\$ '
[12:53:34][stefan]$

n exemplul urmtor ntlnim urmtoarele variabile de mediu de lucru: HOSTNAME,


USER, UID, SHELL i HOME.

stefan@centos ~$ echo Interpretorul de comenzi folosit este $SHELL


Interpretorul de comenzi folosit este /bin/bash
stefan@centos ~$ echo Numele calculatorului este $HOSTNAME
Numele calculatorului este centos
stefan@centos ~$ echo Identificatorul de utilizator pentru $USER este
$UID
Identificatorul de utilizator pentru stefan este 500
stefan@centos ~$ echo Directorul personal este $HOME
Directorul personal este /home/stefan

Urmtorul exemplul arat c variabilele interpretorului de lucru sunt sensibile la dimensiunea


caracterelor.

stefan@centos ~$ echo $USER


stefan
stefan@centos ~$ echo $user

stefan@centos ~$

Variabila de mediu PATH definete directoarele n care interpretorul de comenzi caut


comanda introdus de utilizator (n caz c aceasta nu este intern sau un alias). Variabila
conine o list de directoare separate prin caracterul dou puncte :.

stefan@centos:~$ echo $PATH


/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/st
efan/bin

Din motive de securitate, interpretorul de comenzi nu execut comenzi din directorul curent.
Dac dorim ca interpretorul de comenzi s fie capabil s gseasc un executabil sau script din
directorul curent trebuie s adugm un . la la lista de directoare din PATH.

stefan@centos:~$ PATH=$PATH:.
stefan@centos:~$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/st
efan/bin:.

Urmtorul exemplu creaz variabila oras i seteaz valoarea acesteia la Bucuresti.

stefan@centos:~$ oras=Bucuresti
stefan@centos:~$ echo $oras
Bucuresti
stefan@centos:~$ numar=45
stefan@centos:~$ echo $numar
45

Observai c ghilimelele obinuite interpreteaz variabilele, n timp ce ghilimele simple nu.

stefan@centos:~$ echo "$oras"


Bucuresti
stefan@centos:~$ echo '$oras'
$oras

Interpretorul de comenzi nlocuiete variabilele cu valoarea lor dac sunt folosite ghilimele
obinuite. Pentru tergerea unei variabile prezente n mediul de lucru curent se folosete
unset.

stefan@centos:~$ unset oras


stefan@centos:~$ unset numar
stefan@centos:~$ echo $oras

stefan@centos:~$

Din cadrul interpretorului curent de comenzi putem lansa n execuie un alt


interpretor de comenzi. n acest caz, interpretorul de comenzi surs se numete printe, iar
interpretorul de comenzi generat se numete copil. Urmtorul exemplu obine o ierarhie de
interpretoare de comenzi, fiecare generat din precedentul.

stefan@centos ~$ pstree | grep bash


|-sshd---sshd---sshd---bash-+-grep
stefan@centos ~$ pstree | grep bash
|-sshd---sshd---sshd---bash-+-grep
stefan@centos ~$ bash
stefan@centos ~$ pstree | grep bash
|-sshd---sshd---sshd---bash---bash-+-grep
stefan@centos ~$ bash
stefan@centos ~$ bash
stefan@centos ~$ pstree | grep bash
|-sshd---sshd---sshd---bash---bash---bash---bash-+-grep
stefan@centos ~$

Ieirea din interpretoarele de comezi se face cu exit.

stefan@centos ~$ exit
exit
stefan@centos ~$ exit
exit
stefan@centos ~$ exit
exit
stefan@centos ~$ pstree | grep bash
|-sshd---sshd---sshd---bash-+-grep

Comanda env fr nicio opiune afieaz o list de variabile exportate. Diferena dintre set
i env este c set afieaz toate variabilele, inclusiv cele care nu sunt exportate
interpretoarelor de comenzi copil. Comanda env afieaz variabilele care sunt exportate
interepretoarelor copil. Dar cu ajutorul lui env putem genera i un interpretor de comenzi
curat (un interpretor de comenzi fr mediu de lucru motenit). Comanda env -i cur
mediul de lucru pentru interpretorul de comenzi copil.
Observai din urmtorul exemplu c bash va configura variabila SHELL la pornire.

stefan@centos ~$ bash -c 'echo $SHELL $HOME $USER'


/bin/bash /home/stefan stefan
stefan@centos ~$ env -i bash -c 'echo $SHELL $HOME $USER'
/bin/bash

Putem utiliza comanda env pentru a configura LANG, sau orice alt variabil, pentru o
singur instan de bash. Exemplul urmtor folosete aceast caracteristic pentru a arta
influena variabilei LANG asupra operatorilor de generare dinamic a numelui de fiier.
stefan@centos ~$ touch File{a,b,A,B}
stefan@centos ~$ env LANG=C bash -c 'ls File[a-z]'
Filea Fileb
stefan@centos ~$ env LANG=en_US.UTF-8 bash -c 'ls File[a-z]'
Filea FileA Fileb FileB

Variabilele interpretorului de comenzi printe pot fi exportate interpretoarelor de comenzi


copil cu comanda export.

stefan@centos ~$ var1=unu
stefan@centos ~$ var2=doi
stefan@centos ~$ export var1
stefan@centos ~$ echo $var1 $var2
unu doi
stefan@centos ~$ bash
stefan@centos ~$ echo $var1 $var2
unu

Dar nu export variabile din interpretorul de comenzi copil n interpretorul de comenzi


printe (continum exemplul anterior).

stefan@centos ~$ export var3=trei


stefan@centos ~$ echo $var1 $var2 $var3
unu trei
stefan@centos ~$ exit
exit
stefan@centos ~$ echo $var1 $var2 $var3
unu doi

Pn acum am vzut c bash interpreteaz o variabil ncepnd de la caracterul dolar,


continund pn la prima apariie a unui caracter non-alfanumeric diferit de underscore
(liniu jos). n unele situaii, acest mecanism poate genera o problem. Problema poate fi
rezolvat cu acolade, ca n exemplul urmtor.

stefan@centos ~$ prefix=Super
stefan@centos ~$ echo Hello $prefixman and $prefixwoman
Hello and
stefan@centos ~$ echo Hello ${prefix}man and ${prefix}woman
Hello Superman and Superwoman

Urmtorul exemplu ncearc s afieze valoarea variabilei oras, dar nu reuete deoarece
variabila nu exist. Implicit, cnd o variabil nu exist, interpretorul de comenzi nu afieaz
nimic.

stefan@centos ~$ echo $oras

stefan@centos ~$

Interpretorul de comenzi cunoate n schimb opiunea nounset care genereaz o eroare


cnd o variabil nu exist.

stefan@centos ~$ set -u
stefan@centos ~$ echo $oras
-bash: oras: unbound variable
stefan@centos ~$ set +u
stefan@centos ~$ echo $oras
stefan@centos ~$

Pentru interpretorul de comenzi set -u este identic cu set -o nounset i set +u


este identic cu set +o nounset. Att set ct i unset sunt comenzi interne. Ele pot
configura opiuni ale interpretorului de comenzi. Urmtorul exemplu clarific acest lucru.
Implicit, interpretorul de comenzi trateaz o variabil inexistent ca fiind o variabil care nu
deine o valoare. Prin configurarea opiunii -u, interpretorul de comenzi trateaz orice
referin la o variabil neconfigurat ca o eroare. Pentru a lista toate opiunile active ale
interpretorului de comenzi, se folosete echo $-. Opiunea -C a fost deja explicat,
noclobber.

stefan@centos ~$ echo $-
himBH
stefan@centos ~$ set -C ; set -u
stefan@centos ~$ echo $-
himuBCH
stefan@centos ~$ set +C ; set +u
stefan@centos ~$ echo $-
himBH

Cnd scriem set fr opiuni, se afieaz lista tuturor variabilelor fr funcii cnd
interpretorul de comenzi se afl n modul posix. Interpretorul de comenzi se trece n modul
posix scriind set -o posix.
Utilizatorul poate crea un interpretor de comenzi temporar. Urmtorul exemplu
demonstreaz faptul c prin folosirea combinaiei $()a fost generat un interpretor de
comenzi temporar. Variabila exist numai n interpretorul de comenzi temporar.

stefan@centos ~$ echo $var1

stefan@centos ~$ echo $(var1=5; echo $var1)


5
stefan@centos ~$ echo $var1

stefan@centos ~$

Acesta poate fi folosit pentru rularea unei comenzi.

stefan@centos ~$ echo $(ls)


Desktop Filea FileA Fileb FileB fisier.txt

Acelai lucru poate fi obinut folosind caracterul ` (backtick)14.

stefan@centos ~$ echo `ls`


Desktop Filea FileA Fileb FileB fisier.txt

Un interpretor de comenzi temporar poate genera la rndul su alt interpretor de comenzi


temporar, i tot aa, proces numit imbricare. Notaia $() poate imbrica interpretoare de
comenzi, n schimb, backtick-urile nu pot face asta.

7.2.2. Istoricul interpretorului de comenzi

Pentru vizualizarea comenzilor anterioare se folosete comanda history. ntregul care i


urmeaz specific cte comenzi n urm dorim s afim.

14
Atenie, nu confundai backtick-urile cu ghilimelele simple.
stefan@centos ~$ history 5
382 echo $(var1=5; echo $var1)
383 echo $var1
384 echo $(ls)
385 echo `ls`
386 history 5

Ultima comand se repet cu !!.

stefan@centos ~$ !!
history 5
382 echo $(var1=5; echo $var1)
383 echo $var1
384 echo $(ls)
385 echo `ls`
386 history 5

Putem executa comanda 383 scriind !383.

stefan@centos ~$ !383
echo $var1

stefan@centos ~$

Dac dorim s executm a patra comand n urm scriem !-4. Dac folosim aceast notaie,
!-1 este echivalent cu !!.

stefan@centos ~$ history 4
385 echo `ls`
386 history 5
387* echo $var
388 history 4
stefan@centos ~$ !-4
echo `ls`
Desktop Filea FileA Fileb FileB fisier.txt

Pe lng parcurgerea comenzilor din istoric, o opiune foarte util este cutarea acestora.
Cutarea comenzilor n istoric se face cu Ctrl-r. n urmtorul exemplu am tastat Ctrl-r
i introdus caracterele ls. Interpretorul de comenzi gsete comanda care conine aceste dou
caractere consecutive (chiar dac nu fcea parte din numele comenzii). Dac se tasteaz din
nou Ctrl-r se caut urmtoarea potrivire. Cu Enter se execut comanda gsit. Dac se
dorete ca mai nti comanda gsit s fie modificat se apas Esc sau ctrl-j.

stefan@centos ~$
(reverse-i-search)`ls': echo `ls`

Variabila HISTSIZE definete numrul de comenzi reinute de istoric pentru sesiunea


curent. Majoritatea distribuiilor seteaz aceast variabil la valoarea 500 sau 1000.

stefan@centos ~$ echo $HISTSIZE


1000

Aceast valoare poate fi modificat dup preferin.

stefan@centos ~$ HISTSIZE=500
stefan@centos ~$ echo $HISTSIZE
500

Variabila HISTFILE indic fiierul care conine istoricul. Interpretorul de comenzi bash
folosete implicit fiierul ~/.bash_history.

stefan@centos ~$ echo $HISTFILE


/home/stefan/.bash_history

Istoricul unei sesiuni este salvat n acest fiier dac sesiunea este terminat corect, cu exit,
logout sau Ctrl-d. nchiderea unui terminal de la semnul x cu mouse-ul nu va salva
istoricul sesiunii. Numrul de comenzi pstrat n fiierul de istoric este configurat de variabila
HISTFILESIZE.

stefan@centos ~$ echo $HISTFILESIZE


1000

7.2.3. Generarea dinamic a numelor de fiiere

Caracterul * (stelu) este interpretat de shell ca indicator de generare a numelui de


fiiere, echivalnd stelua cu orice combinaie de caractere (chiar i niciunul). n concluzie,
caracterul * nseamn orice. Cnd nu este specificat un director anume, interpretorul de
comenzi va folosi fiierele din directorul curent.

stefan@centos ~$ ls
file1 file2 file3 file4 filea Filea FileA fileab fileAB
fileb Fileb FileB fisier.txt
stefan@centos ~$ ls f*
file1 file2 file3 file4 filea fileab fileAB fileb fisier.txt
stefan@centos ~$ ls F*
Filea FileA Fileb FileB
stefan@centos ~$ rm *.txt
stefan@centos ~$ ls
file1 file2 file3 file4 filea Filea FileA fileab fileAB
fileb Fileb FileB
stefan@centos ~$ ls fi*ab
fileab

Similar cu stelua, semnul de ntrebare, ?, este interpretat de shell ca indicator c


trebuie s genereze nume de fiiere, echivalnd semnul de ntrebare cu exact un singur
caracter. Altfel spus, semnule de ntrebare nseamn exact un singur caracter.

stefan@centos ~$ ls file?
file1 file2 file3 file4 filea fileb
stefan@centos ~$ ls File?
Filea FileA Fileb FileB
stefan@centos ~$ ls Fil??
Filea FileA Fileb FileB

Semnul de acolad ptrat, [, este interpretat de shell tot ca indicator de generare


nume de fiiere, cu sensul c numele respectiv trebuie s conin orice caracter dintre [ i
primul ]. Ordinea caracterelor specificate n aceast list nu conteaz. Fiecare pereche de
paranteze ptrate este nlocuit cu exact un singur caracter. Astfel, o contrucie de genul
[aeiou] nseamn orice caracter din a, e, i, o, u.

stefan@centos ~$ ls File[aA]
Filea FileA
stefan@centos ~$ ls file[aA][bB]
fileab fileA

Putem exclude caractere dintr-o list specificat ntre paranteze ptrare cu semnul de
exclamare, !, sau semnul ^. De exemplu, putem nega apartenena la un grup cu sintaxa
[^aeiou], care semnific orice caracter diferit de a, e, i, o, u.

stefan@centos ~$ ls [!F]*
file1 file2 file3 file4 filea fileab fileAB fileb
stefan@centos ~$ ls file[!a]?
fileAB
stefan@centos ~$ ls file[^a]?
fileAB

Interpretorul de comenzi bash recunoate i domenii de caractere scrise ntre paranteze


ptrate.

stefan@centos ~$ ls file[a-z]
filea fileb
stefan@centos ~$ ls file[0-9]
file1 file2 file3 file4
stefan@centos ~$ ls fi[a-z][a-z][0-9]
file1 file2 file3 file4

* Orice ir de 0 sau mai multe caractere


? Orice caracter singular
~ Directorul personal al utilizatorului curent
~user Directorul personal al utilizatorului user
~+ Directorul de lucru curent
~- Directorul de lucru anterior
[a-zA-Z] ablon pentru orice caracter
[0-9] ablon pentru orice cifr
[a-zA-Z0-9] ablon pentru orice liter sau cifr
[[] Semnul [
[-a] Litera a sau semnul -
[]] Semnul ]
[! ] Orice character care nu este spaiu
[!a-zA-Z] Orice caracter cu excepia literelor
[! .]* Toate fiierele care nu ncep cu punct
man 7 glob Pagina de manual a expresiilor de generare automat a numelor de
fiiere

Dar nu uitai de influena variabilei LANG. Unele limbi conin caracterele cu litere mici n
domenii de majuscule (i invers).

stefan@centos ~$ echo $LANG


en_US.UTF-8
stefan@centos ~$ ls [A-Z]ile?
file1 file2 file3 file4 filea Filea FileA fileb Fileb FileB
stefan@centos ~$ ls [a-z]ile?
file1 file2 file3 file4 filea Filea FileA fileb Fileb FileB
stefan@centos ~$ LANG=C
stefan@centos ~$ echo $LANG
C
stefan@centos ~$ ls [a-z]ile?
file1 file2 file3 file4 filea fileb
stefan@centos ~$ ls [A-Z]ile?
FileA FileB Filea Fileb

n Linux, variabilele mediului de lucru LANG, LC_ALL i restul LC_* definesc


conveniile specifice unei ri, cum ar fi codificarea caracterelor, notaia de timp i dat,
reguli pentru sortarea alfabetic, unitile de msur, etc.. (locale). Un program trebuie s
determine aceste reguli pentru a funciona n concordan cu diferite reguli zonale. Numele
acestor configuraii locale combin dou litere ale codului de limb ISO 639-1 i dou litere
ale codului de ar ISO 3166-1, n format ll_CC. De exemplu, en_US reprezint
configuraia pentru limba englez din Statele Unite, de_DE limba german din Germania,
de_AT limba german din Austria, ro_RO limba roman din Romnia. O valoare C
nseamn compatibilitate cu standardul POSIX, n care sunt valide numai caracterele ASCII
stricte.
O codificare diferit a caracterelor poate genera probleme. De exemplu, scriem un
fiier pe un server care folosete setul de caractere ISO-8859-15, unde caracterul este
codificat $A4$. Dac copiem acest fiier pe un alt calculator configurat cu UTF-8, care
mapeaz la $E282AC$, octeii stocai n fiier cu un set de caracterele sunt acum
decodificai cu alt set de caractere incompatibil.
Codificarea caracterelor folosit n Linux depinde de valorile variabilelor de mediu
LC_ALL, LC_* sau LANG. Valorile lor reprezint numele unei configuraii locale. Nu este
neaprat necesar ca toate trei s fie configurate explicit, dar este important de tiut ierarhia lor
i ce anume seteaz propriu-zis.
Variabilele mediului de lucru LC_*, cum ar fi LC_CTYPE, LC_MESSAGES,
LC_MONETARY, LC_NUMERIC, etc, controleaz fiecare un anumit aspect al configuraiei
locale. Ele permit controlul punctual al acestei configuraii. De exemplu, variabila
LC_CTYPE controleaz clasificarea caracterelor i modul n care are loc conversia de la
caractere mari la mici, LC_TIME definete formatul datei i timpului, LC_MESSAGES
definete limba pentru mesajele primite de la aplicaii, LC_COLLATE influeneaz ordinea de
sortare (rolul celorlalte variabile poate fi gsit cu man 7 locale). Variabila LANG seteaz
o valoare implicit pentru toate aceste aspecte, dar comportamentul individual poate fi
modificat cu variabilele LC_*. Variabila LC_ALL suprascrie att LC_* ct i LANG. n
Linux, la pornire, sistemul configureaz codificarea caracterelor interognd LC_ALL, LC_*
i LANG, n aceast ordine. Va fi folosit prima variabil cu valoare valid, celelalte vor fi
ignorate. Acest lucru nseamn c dac LANG nu are efect, trebuie s verificai dac nu cumva
sunt configurate LC_* corespunztor i LC_ALL. Dac niciuna din aceste variabile nu este
configurat, sistemul folosete configuraia implicit prezent n directorul /usr/lib/
locale.
Comanda locale afieaz valorile curente ale variabilelor de mediu ce afecteaz
codificarea caracterelor.

root@centos:~# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Observm c LC_ALL nu are valoarea atribuit, acest lucru nseamn c rezultatul comenzii
date este afiat conform variabilei LANG:

root@centos:~# date
Mon Dec 21 17:46:46 EET 2015

Dac atribuim o valoare direct din linie de comand vedem c LC_ALL are ntietate fa de
LANG:

root@centos:~# LC_ALL=ro_RO.utf8 date


luni 21 decembrie 2015, 17:48:23 +0200

Comanda locale charmap afieaz setul de caractere folosit n prezent.

root@centos:~# locale charmap


UTF-8

Comanda locale este util i pentru determinarea resurselor disponibile pentru codificarea
caracterelor. Comanda locale -m afieaz o list cu toate seturile de caractere disponibile
pe un sistem. Comanda locale -a afieaz o list cu toate configuraiile locale disponibile.
Reinei c este posibil ca nu toate seturile de caractere s dispun de o configuraie local
care s le foloseasc.
Un fiier scris cu o anumit codificare poate fi translatat cu comanda iconv sau
recode. Urmtorul exemplu convertete un fiier din ISO-8859-1 n UTF-8.

root@ubuntu:~# echo ares > fisier.ascii


root@ubuntu:~# file fisier.ascii
fisier.ascii: ASCII text
root@ubuntu:~# od -x fisier.ascii
0000000 7261 7365 000a
0000005
root@ubuntu:~# iconv -f ascii -t utf16 -o fisier.utf16 fisier.ascii
root@ubuntu:~# file fisier.utf16
fisier.utf16: Little-endian UTF-16 Unicode text, with no line
terminators
root@ubuntu:~# od -x fisier.utf16
0000000 feff 0061 0072 0065 0073 000a
0000014
root@ubuntu:~# cat fisier.utf16
ares
root@ubuntu:~# cat -v fisier.utf16
M-^?M-~a^@r^@e^@s^@

Distribuiile de linux recunosc un numr mare de limbi (de exemplu, RHEL 7 recunoate
oficial 22). Dac nu este modificat la instalare, limba implicit a sistemului este engleza
vorbit n SUA, folosind ca set de caractere codificarea Unicode UTF-8 (en_US.utf8). n
Centos, utilizatorul root poate modifica configuraia din linie de comand folosind comanda
localectl. Fr niciun argument, localectl afieaz configuraia curent. Comanda localectl
set-locale LANG=ro_RO.utf8 schimb limba implicit la nivelul ntregului sistem.
Modificarea are efect la urmtoarea intrare n sistem a utilizatorilor i este salvat n fiierul
/etc/locale.conf.

root@centos:~# localectl set-locale LANG=ro_RO.utf8

Dac n sistem este folosit o limb diferit de englez, putem instala un pachet specific
limbii folosite care ofer traduceri adiionale, dicionare, .a.m.d.. Comanda yum
langavailable afieaz o list cu pachete disponibile pentru alte limbi. Afiarea pachetelor
instalate n sistem se face cu yum langlist. De exemplu, pentru adugarea suportului de
limba romn putem folosi comanda yum langinstall ro, unde ro reprezint codul dintre
parantezele ptrate afiat de comanda yum langavailable. Toate comenzile menionate mai sus
sunt disponibile numai dac se instaleaz pachetul yum-langpacks.

7.2.4. Procesarea comenzilor i interpretarea argumentelor

n aceast seciune studiem modul n care shell-ul proceseaz comenzile i


argumentele. Cunoaterea acestui proces este important deoarece multe comenzi sunt
procesate i de cele mai multe ori modificate de shell nainte de a fi executate.
Una din funcionalitile principale realizate de shell este parsarea liniei de comand.
Cnd utilizatorul introduce o comand i apas tasta Enter, interpretorul de comenzi ncepe
s scaneze linie de comand mprind-o n argumente. n timpul parsri liniei, shell-ul poate
modifica argumentele introduse de utilizator. Acest proces se numete shell expansion. Dup
parsare i modificare, linia este executat.
Prile separate cu unul sau mai multe caractere spaiu (sau tab-uri) sunt considerate
argumente distincte, i orice spaiu alb este ndeprtat. Primul argument este interpretat ca
fiind comanda ce trebuie executat, celelalte argumente se adreseaz acestei comenzi.
Interpretorul de comenzi mparte efectiv comanda n unul sau mai multe argumente. Aceste
lucru explic de ce urmtoarele patru linii diferite arat exact la fel dup procesare.

stefan@centos ~$ echo Hello World


Hello World
stefan@centos ~$ echo Hello World
Hello World
stefan@centos ~$ echo Hello World
Hello World
stefan@centos ~$ echo Hello World
Hello World

Comanda echo afieaz fiecare argument primit de la interpretorul de comenzi. De


asemenea, comanda echo va aduga un caracter spaiu dup fiecare argument primit.
Utilizatorul poate preveni ndeprtarea caracterelor spaiu prin introducerea textului ntre
ghilimele simple. n acest caz, irul aflat ntre ghilimelele simple este interpretat ca un singur
argument. n urmtorul exemplu, echo primete un singur argument.

stefan@centos ~$ echo 'O linie intre ghilimele simple'


O linie intre ghilimele simple

Acelai lucru se obine dac textul se afl ntre ghilimele obinuite. Diferena dintre aceste
dou metode o vom vedea cnd vom discutat despre variabile.

stefan@centos ~$ echo "O linie intre ghilimele duble"


O linie intre ghilimele duble

Liniile aflate ntre ghilimele pot include caractere de control speciale recunoscute de comanda
echo (cnd este folosit cu opiunea e). Urmtorul exemplu arat cum se poate folosi \n
pentru trecere la linie nou i \t pentru un spaiu orizontal (de obicei, 8 caractere spaiu
consecutive).

stefan@centos ~$ echo -e "O linie cu \ntrecere la linie noua"


O linie cu
trecere la linie noua
stefan@centos ~$ echo -e "O linie cu \ttab"
O linie cu tab

Comanda echo poate genera mai mult de spaii albe. O opiune util este -n care
dezactiveaz afiarea caraterului de trecere la linie nou introdus de utilizator la sfritul
irului prin apsarea tastei Enter.

root@centos:~# echo test


test
root@centos:~# echo -n test
testroot@centos:~#

Pentru alte caractere speciale folosii man echo.


Nu toate comenzile sunt separate de interpretorul de comenzi. n Linux, comenzile
sunt de dou tipuri:
comenzi interne interpretorului de comenzi (builtin), care se gsesc n fiierul executabil
al acestuia, de exemplu, cd, echo, enable, alias, exec, exit, etc..
comenzile externe sunt programe cu propriul binar, fiecare ntr-un fiier propriu.
Majoritatea comenzilor externe se afl n directoarele /bin i /sbin. La rndul lor
acestea pot fi de dou feluri:
fiiere executabile, adic programe executabile obinute prin compilare din surse
C sau alte limbaje de programare. De exemplu, ls, chmod, bash, etc..
fiiere de comenzi (script-uri). De exemplu, .bashrc, .bash_profile, etc..

Pentru a afla dac o comand dat este executat de interpretorul de comenzi ca intern sau
extern, se folosete comanda type.

stefan@centos ~$ type cd
cd is a shell builtin
stefan@centos ~$ type echo
echo is a shell builtin
stefan@centos ~$ type cat
cat is /bin/cat

Dup cum se vede, comanda cd este intern, iar comanda cat este extern. Comanda type
arat i dac o comand este de fapt un alias sau nu.

stefan@centos ~$ type ls
ls is aliased to `ls --color=auto'

Unele comenzi au att variant intern ct i extern. Cnd este introdus o astfel de
comand, versiunea intern are prioritate. Pentru rularea versiunii externe trebuie specificat
calea complet ctr comand.

stefan@centos ~$ type -a echo


echo is a shell builtin
echo is /bin/echo
stefan@centos ~$ /bin/echo Rularea comenzii echo externe...
Rularea comenzii echo externe...

Comanda which va cuta executabile n directoarele specificate de variabila de mediu


PATH. Urmtorul exemplu va determina c export este intern, iar cp, mkdir, pwd sunt
externe.

stefan@centos ~$ which export cp mkdir pwd


/usr/bin/which: no export in (/usr/local/bin:/bin:/usr/bin:/usr/local
/sbin:/usr/sbin:/sbin)
/bin/cp
/bin/mkdir
/bin/pwd

7.2.5. Aliasuri

Interpretorul de comenzi permite i crearea unor aliasuri. Aliasurile sunt folosite de


obicei pentru atribuirea unui nume mai uor de reinut la o comand existent sau s furnizezi
unei comenzi opiuni implicite. Comanda alias fr argumente afieaz toate aliasurile
configurate pentru utilizatorul curent.

stefan@centos ~$ ls
stefan@centos ~$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'

Pentru crearea unui alias putei folosi unul din exemplele de mai sus. nainte i dup semnul
egal nu exist spaii. n urmtorul exemplu am abreviat o comand existent i am creat un
alias pentru comanda rm, astfel nct s interogheze utilizatorul nainte de a terge efectiv un
fiier.

stefan@centos ~$ alias c='clear'


stefan@centos ~$ alias rm='rm -i'
stefan@centos ~$ touch fisier
stefan@centos ~$ rm fisier
rm: remove regular empty file `fisier'? y

Pentru a proteja utilizatorii de tergerea accidental a unor fiiere, unele distribuii


configureaz implicit aliasul rm i pentru root (ca i mv i, cp i). Cteodat, de
exemplu atunci cnd avem de ters foarte multe fiiere n acelai timp, acest lucru poate fi un
inconvenient, deoarece utilizatorul trebuie s-i dea acceptul pentru fiecare fiier n parte.
Dac se dorete dezactivarea acestui comportament, se precede aliasul rm cu caracterul de
evitare \ sau se folosete opiunea -f (force).

stefan@centos ~$ touch fisier fis fisi


stefan@centos ~$ ls
fis fisi fisier
stefan@centos ~$ rm fis*
rm: remove regular empty file `fis'? n
rm: remove regular empty file `fisi'? n
rm: remove regular empty file `fisier'? n
stefan@centos ~$ \rm fis* #echivalent cu rm -f fis*
stefan@centos ~$ ls

Un alias poate fi ters cu comanda unalias.

stefan@centos ~$ which rm
alias rm='rm -i'
/bin/rm
stefan@centos ~$ unalias rm
stefan@centos ~$ which rm
/bin/rm

Procesul de expandare a interpretorului de comanzi poate fi afiat cu set x i dezactivat cu


set +x. Acest lucru este foarte util atunci cnd dorim s cunoatem cum interpreteaz shell-
ul comanda noastr.

stefan@centos ~$ set -x
stefan@centos ~$ echo $USER
+ echo stefan
stefan
stefan@centos ~$ echo \$USER
+ echo '$USER'
$USER
stefan@centos ~$ set +x
+ set +x
stefan@centos ~$ echo $USER
stefan

7.2.6. Operatori de control

n linia de comand pot fi specificate mai multe comenzi separate prin caracterul
punct i virgul ;. Interpretorul de comenzi parseaz linia pn cnd ajunge la un caracter
punct i virgul. Toate argumentele dinainte de caracterul ; vor fi interpretate ca formnd o
comand de sine stttoare. Astfel toate comenzile dintre caracterele ; vor fi executate
secvenial, interpretorul de comenzi ateptnd finalizarea fiecrei comenzi nainte de a ncepe
s o execute pe urmtoarea.

stefan@centos ~$ echo Hello


Hello
stefan@centos ~$ echo World
World
stefan@centos ~$ echo Hello ; echo World
Hello
World

Cnd o linie se termin cu un caracter &, interpretorul de comenzi nu mai ateapt finalizarea
comenzii. Utilizatorul primete imediat acces la prompt i comanda este executat n fundal.
Cnd comanda termin execuia, utilizatorul va primi un mesaj.

stefan@centos ~$ sleep 3 &


[1] 1167
stefan@centos ~$
[1]+ Done sleep 3

Pn acum toate comenzile au fost rulate interactiv (foreground). n modul interactiv, shell-ul
ateapt finalizarea comenzii nainte de a afia alt prompt i a permite introducerea altei
comenzi. Cnd se ruleaz o comand n fundal, utilizatorul nu mai trebuie s atepte
ncheierea comenzii nainte de a introduce alt comand. Mai mult, utilizatorul poate rula mai
multe comenzi n fundal. Acest lucru este util pentru comenzile cu timp ndelungat de rulare
i care nu necesit atenia utilizatorului. Ele nu in ecranul ocupat i permit continuarea
lucrului.

stefan@centos ~$ sleep 400 & sleep 500 &


[1] 27579
[2] 27580

Interpretorul de comenzi atribuie fiecrui proces un numr i l afieaz ntre paranteze


ptrate. Dup acest numr urmeaz identificatorul de proces (PID) - un numr atribuit de
sistemul de operare. Oricare din aceste dou numere identific procesul care ruleaz n
fundal. Comanda jobs afieaz procesele care ruleaz n fundal.

stefan@centos ~$ jobs
[1]- Running sleep 400 &
[2]+ Running sleep 500 &

Pentru a termina un proces care ruleaz n fundal se folosete comanda kill, dup care se
specific PID-ul sau numrul de job precedat de semnul %.

stefan@centos ~$ kill %1
stefan@centos ~$ jobs
[1]- Terminated sleep 400
[2]+ Running sleep 500 &

Scoaterea unui proces din fundal se realizeaz cu comanda fg (foreground), urmat de


numrul de job, precedat de % sau nu. Dac exist un singur proces n fundal, nu trebuie
specificat numrul de job.

stefan@centos ~$ fg 2
sleep 500
^Z
[2]+ Stopped sleep 500

Putem suspenda un proces activ cu Ctrl-z. Interpretorul de comenzi oprete procesul i


deconecteaz intrarea standard de la tastatur. Procesul suspendat poate fi introdus n fundal
i repornit folosind comanda bg urmat de numrul de job. La fel, dac este un singur proces
oprit, nu este necesar s se specifice numrul de job.

stefan@centos ~$ bg 2
[2]+ sleep 500 &
stefan@centos ~$ jobs
[2]+ Running sleep 500 &
stefan@centos ~$ kill %2
stefan@centos ~$ jobs
[2]+ Terminated sleep 500

Codul de ieire a comenzii anterioare este stocat ntr-o variabil a interpretorului de comenzi
notat cu $?. De fapt, $? este un parametru al interpretorului de comenzi i nu o variabil,
deoarece nu se pot atribui valori lui $?.

stefan@centos ~$ echo $?
0
stefan@centos ~$ rm Desktop
rm: cannot remove `Desktop': No such file or directory
stefan@centos ~$ echo $?
1

ntregul 0 reprezint codul de succes. Orice alt valoarea reprezint apariia unei erori i arat
faptul c comanda nu s-a finalizat cu succes.

Cod Descriere
0 Comanda s-a ncheiat cu succes.
1 Eroare necunoscut.
2 Comand intern a interpretorului de comenzi folosit greit.
126 Comanda nu se poate executa.
127 Comanda nu a fost gsit.
128 Argument invalid pentru comanda intern exit.
128+x Eroare fatal cu semnalul Linux x.
130 Comanda s-a ncheiat cu Ctrl-C.
255 Depirea domeniului (exit status out of range).

Interpretorul de comenzi interpreteaz && ca I logic. Cnd se folosete && a doua


comand este executat numai dac prima s-a finalizat cu suscces (codul de ieire este zero).

stefan@centos ~$ touch fisier.txt && echo succes


succes
stefan@centos ~$ rm Desktop && echo succes
rm: cannot remove `Desktop': No such file or directory

Semnul || reprezint SAU logic. A doua comand este executat numai dac prima comand
a returnat eroare (codul de ieire este diferit de zero).

stefan@centos ~$ rm Desktop 2>/dev/null || echo eroare


eroare

Operatorii logici SAU i I pot fi combinai astfel nct s obinem o structur de tipul dac-
atunci. Urmtorul exemplu afieaz succes dac comanda rm a fost rulat cu succes i eroare
dac nu.

stefan@centos ~$ touch fisier


stefan@centos ~$ rm fisier 2>/dev/null && echo succes || echo eroare
succes
stefan@centos ~$ rm fisier 2>/dev/null && echo succes || echo eroare
eroare

Toate cuvintele scrise dup caracterul # (diez) sunt ignorate de interpretorul de comenzi.
Acest caracter este util cnd scriem un comentariu ntr-un fiier de comenzi, dar nu are
influen atunci cnd apare n linia de comand.

stefan@centos ~$ mkdir Desktop # cream un director

Caracterul \ permite interpretarea caracterelor de control, dar naintea unor caractere cheie
joac rolul de caracter de evitare. Caracterul de evitare este folosit pentru a se ignora
semnificaia special a unor caractere.

stefan@centos ~$ echo \\\\ \# \$? \&\& \|\| \& \*


\\ # $? && || & *

Liniile care se termin n caracterul \ se continu pe urmtoarea linie. Interpretorul de


comenzi nu interpreteaz caracterul de trecere la linie nou introdus de utilizator prin
apsarea tastei Enter i amn parsarea liniei pn la apariia unui caracter de trecere la linie
nou ne-precedat de caracterul de evitare \. Se poate folosi aceast facilitate atunci cnd
avem de a face cu comenzi foarte lungi pe care le putem scrie mai convenabil pe mai multe
linii.

stefan@centos ~$ echo Aceasta linie se continua \


> pe urmatoarele \
> doua.
Aceasta linie se continua pe urmatoarele doua.

Semnul mai mare > afiat pe liniile de dup caracterul de evitare nu reprezint altceva dect
valoarea variabilei de mediu de lucru PS2. PS2 controleaz formatul liniei de comand de
nivel doi.
stefan@centos ~$ echo $PS2
>

Interpretorul de comenzi folosete implicit promptul PS1 pentru tranferul iniial de date.
Dac se introduce o comand care necesit informaie adiional, interpretorul de comenzi
afieaz promptul specificat de variabila PS2.