Documente Academic
Documente Profesional
Documente Cultură
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
1. INTRODUCERE N LINUX
1
Linux nu este Unix, dar o prezentare a sistemelor Linux nu poate ncepe fr a vorbi
de Unix.
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.
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
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.
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:~$
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.
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:
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.
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
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.
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
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
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
stefan@centos ~$ dirs
~
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).
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.
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.
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.
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
user@host:~$ rm fisier.txt
user@host:~$ rm prog*
terge toate fiierele care ncep cu prog. ndeprtarea tuturor fiierelor din directorul curent
se face cu
user@host:~$ rm *
user@host:~$ rm -rf *
Coninutul unui director este afiat cu ls. Fr specificarea unui director ls afieaz
coninutul directorului curent.
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.
Opiunea r permite copierea unor directoare (-r foreaz copierea recursiv a tuturor
fiierelor din toate subdirectoarele).
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
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.
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.
n mod similar, comanda tail afieaz ultimele zece sau un numr specificat de linii dintr-
un fiier.
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
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
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.
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.
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.
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:
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.
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:
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:
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.
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.
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 <<<.
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 | wc -w
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.
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.
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.
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.
Dac se dorete numrul liniei care conine irul specificat se folosete parametrul -n
(line-number).
Dac trebuie s tim numai numrul de linii care conine irul specificat se folosete
-c (count).
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.
Urmtorul exemplu afieaz intervalul de caractere 2-7 din fiecare linie din /etc/passwd.
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.
Filtrul tr s (squeeze) poate combina apariia consecutiv a mai multor instane de caracter
n una singur.
Filtrul sort sorteaz liniile unui fiier text. Implicit, sorteaz alfabetic.
Dar sort permite multe tipuri de sortare (man sort), numeric, aleatoare, dup lunile anului,
n funcie de coloan, etc.. Mai jos sunt cteva exemple.
Dac fiierul conine linii identice, putem elimina duplicatele cu opiunea u (unique).
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
Rezultatul lui comm poate fi citit mai uor cnd se generaz o singur coloan. Numerele
indic coloanele care nu trebuie afiate.
Comanda paste permite concatenarea liniilor corespondente din dou fiiere diferite.
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
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.
Pot fi specificate mai multe locaii n acelai timp, folosind chiar i variabile de mediu.
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).
Gsete fiierele din directorul curent mai noi dect fiierul file.txt.
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.
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
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.
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:
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.
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:
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):
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
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:
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.
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
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:
afiarea pachetului care conine un anumit fiier. n acest caz tim fiierul, dar nu tim
din care pachet provine.
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:
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.
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:
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.
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:
Informaiile mai pot fi afiate i cu sudo apt-cache show emacs. Afiarea arhivelor
din care face parte un pachet, versiunea disponibil, etc.:
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.
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).
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.
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.
Modul de acces poate fi exprimat numeric sau simbolic. Iat cteva exemple.
Comanda
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
Pentru a modifica grupul care are drepturi asupra unui fiier sau director se folosete comanda
chgrp:
De asemenea, comanda chown poate modifica att posesorul ct i grupul n acelai timp:
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).
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:~$ 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
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.
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.
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.
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.
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.
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 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.
Legturi simbolice
tergerea legturilor
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)
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.
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:
Comanda sudo v cere parola personal dup care o parol pentru root. Pentru dezactivarea
parolei pentru contul de root, se folosete comanda:
Dup creearea utilizatorului trebuie s i fie setat o parol iniial. Fr parol utilizatorul nu
poate s intre n sistem.
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
Comanda usermod este foarte util i poate modifica un numr mare de opiuni. De
exemplu adugarea utilizatorului la un alt grup se realizeaz cu:
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.
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.
10
mkpasswd m sha-512 parola
Urmtoarea comand va fora utilizatorul s i nlocuiasc parola la prima intrare n
cont:
Un utilizator poate face parte din mai multe grupuri. Apartenena la grupuri este
definit n fiierul /etc/group.
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.
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.
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.
stefan@centos:~$ su
Password:
root@centos:~# exit
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.
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:
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:
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,
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:
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.
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.
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.
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]$
stefan@centos ~$
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:.
stefan@centos:~$ oras=Bucuresti
stefan@centos:~$ echo $oras
Bucuresti
stefan@centos:~$ numar=45
stefan@centos:~$ echo $numar
45
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:~$
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.
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
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
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 ~$
stefan@centos ~$ set -u
stefan@centos ~$ echo $oras
-bash: oras: unbound variable
stefan@centos ~$ set +u
stefan@centos ~$ echo $oras
stefan@centos ~$
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 ~$
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
stefan@centos ~$ !!
history 5
382 echo $(var1=5; echo $var1)
383 echo $var1
384 echo $(ls)
385 echo `ls`
386 history 5
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`
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.
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 ~$ 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
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
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
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
Dar nu uitai de influena variabilei LANG. Unele limbi conin caracterele cu litere mici n
domenii de majuscule (i invers).
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:
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.
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.
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.
Acelai lucru se obine dac textul se afl ntre ghilimele obinuite. Diferena dintre aceste
dou metode o vom vedea cnd vom discutat despre variabile.
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).
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.
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.
7.2.5. Aliasuri
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 ~$ which rm
alias rm='rm -i'
/bin/rm
stefan@centos ~$ unalias rm
stefan@centos ~$ which rm
/bin/rm
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
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.
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.
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 ~$ 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 &
stefan@centos ~$ fg 2
sleep 500
^Z
[2]+ Stopped sleep 500
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).
Semnul || reprezint SAU logic. A doua comand este executat numai dac prima comand
a returnat eroare (codul de ieire este diferit de zero).
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.
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.
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.
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.