You are on page 1of 13

1.

Shell-uri UNIX

6
6.1 6.1

SHELL-uri UNIX

Definiie i funciuni

Parte integrant a sistemului de operare UNIX, shell-ul este un program special utilizat ca o interfa ntre utilizator i inima sistemului de operare UNIX, un program denumit kernel[23]. n timp ce kernelul este ncrcat n memoria calculatorului din momentul iniializrii sale i pn la oprirea sistemului, toate celelalte programe, inclusiv programele de tip shell sunt stocate pe disc. Kernelul este, n fapt, administratorul ntregului sistem de operare UNIX; el iniiaz i controleaz procesele, administreaz memoria, sistemul de fiiere, comunicaiile i tot ce ine de resursele calculatorului. Shell-ul este un program utilitar ce este pornit n momentul conectrii utilizatorului la sistem, oferind posibilitatea utilizatorilor s interacioneze cu kernelul prin interpretarea comenzilor introduse fie direct de la tastatur, fie prin intermediul unui fiier de comenzi shell, numit fiier shell-script, sau, pe scurt, script. n momentul conectrii la sistemul UNIX shell-ul i ia atribuiile n primire, ndeplinindu-i rolul de interpretor al comenzilor introduse de ctre utilizator i care trebuie nelese de ctre kernel (este echivalentul interpretorului DOS command.com). n momentul introducerii unei comenzi, interpretorul de comenzi shell execut urmtorii pai: (1) interpreteaz sintactic linia de comand introdus; (2) interpreteaz metacaracterele, redirectrile, mecanismele pipe i controlul job-urilor i (3) verific existena comenzii/comenzilor introduse i dac acestea exist, sunt executate. Exist posibilitatea utilizrii shell-ului n dou moduri: interactiv sau prin intermediul unui fiier script. La nceput, utilizatorii care nva comenzi i cum s foloseasc sistemul UNIX folosesc modul interactiv al shell-ului. Mai trziu, odat cu utilizarea unor comenzi n mod frecvent, se impune crearea unor fiiere de comenzi acele fiiere shell-script. Execuia comenzilor prin intermediul unui shell-script nseamn utilizarea shell-ului drept limbaj de programare. Prin analogie cu DOS/Windows, fiierele

UNIX

shell-script sunt fiiere de tip batch de comenzi, care n sistemul de operare DOS au extensia .bat. Fiierele shell-script permit, pe lng utilizarea mai multor comenzi ce se execut (de regul) secvenial i faciliti de programare avansat, structuri de decizie, ciclare, testare de fiiere, .a. Pentru a putea scrie shell-script-uri trebuie cunoscute nu numai structurile de programare existente (condiionale, repetitive, etc.) dar i comenzile, utilitarele i modalitatea de funcionare a acestora n sistemul de operare UNIX. Printre programele utilitare existente n UNIX se afl i grep, sed sau awk ce reprezint instrumente deosebit de puternice pentru manipularea fiierelor i a rezultatelor comenzilor. 6.2 Variante de shell

n UNIX exist mai multe implementri ale interpretoarelor de comenzi, printre care: Bourne Shell (sh) AT&T shell C Shell (csh) - Berkeley shell Korn Shell (ksh) - include shell-ul Bourne Bourne Again Shell (bash - n Linux)

Toate aceste tipuri de shell se comport aproximativ asemntor atunci cnd se lucreaz n modul interactiv. Odat cu folosirea acestora ca limbaje de scripting (programare) apar o serie de deosebiri legate de sintax, eficien etc. Dintre aceste tipuri de shell, shell-ul Bourne este shell-ul standard UNIX, de aceea vom prezenta pentru nceput caracteristicile shell-ului Bourne. De asemenea, majoritatea script-urilor scrise deja pentru administrarea sistemului (precum rc start i stop, shutdown) sunt shell-script-uri Bourne, iar cnd se lucreaz n modul single-user (mod excepional de lucru utilizat, de regul, pentru refacerea sistemului) acesta este shell-ul utilizat de administratorul sistemului conectat ca root. Shell-ul Bourne a fost conceput de firma AT&T i el este rapid, concis i compact. Valoarea implicit a prompter-ului este semnul dolar ($) pentru utilizatorii obinuii i semnul diez (#) pentru root (utilizatorul privilegiat). Shell-ul C (csh) a fost dezvoltat la Universitatea Berkeley California i a adugat o serie de noi funcionaliti, precum: istoricul comenzilor date anterior, utilizarea de alias-uri, aritmetic integrat sau auto-completarea numelor de fiiere i comenzi. Shell-ul C este preferat atunci cnd se utilizeaz interactiv, dar administratorii prefer s utilizeze shell-ul Bourne la scrierea shell-script-urilor, deoarece acesta din urm este mai rapid i mai

Shell-uri UNIX

simplu dect script-urile asemntoare scrise n C shell. Prompter-ul implicit n C shell este semnul procent (%) pentru utilizatorul obinuit. Shell-ul Korn (ksh) reprezint o extensie a shell-ului Bourne i a fost scris de David Korn de la AT&T. Au fost adugate o serie de noi funcionaliti fa de shell-ul Bourne i cel C. Printre acestea se numr: istoric editabil al comenzilor, alias-uri, funcii, aritmetic integrat, controlul job-urilor, coprocesare i faciliti de depanare. Shell-ul Bourne este aproape 100% compatibil cu shell-ul Korn; de aceea, vechile shell-script-uri scrise n Bourne shell vor rula i n Korn shell. Ca i n Bourne shell, valoarea implicit a prompter-ului pentru utilizatorul obinuit este simbolul dolar ($) i semnul diez (#) pentru root. 6.3 Scurt istoric

Primul shell cu adevrat important a fost introdus n versiunea V7 (versiunea 7 a variantei AT&T) UNIX n anul 1979 i a fost denumit dup programatorul Stephen Bourne, creatorul su. Ca limbaj de programare, shell-ul Bourne se bazeaz pe limbajul de programare Algol i a fost folosit iniial pentru a automatiza anumite sarcini administrative. Cu toate c acest shell este foarte popular pentru simplitate i vitez, are totui cteva minusuri la utilizarea interactiv (lipsa istoricului comenzilor, a alias-urilor i a controlului job-urilor). Pe de alt parte, shell-ul bash (Bourne Again Shell), dezvoltat de ctre Brian Fox de la FSF (Free Software Foundation) sub licen public GNU este shell-ul implicit pentru Linux i instalat automat ncepnd cu Solaris 8 (pe servere Sun). Bash ofer o serie de noi faciliti ce lipsesc n shell-ul standard Bourne (se pstreaz ns compatibilitatea cu acesta), nglobnd i cele mai bune faciliti din C shell i Korn shell. Facilitile shell-ului bash sunt: istoric al comenzilor introduse la linia de comand, editarea liniei de comand, controlul job-urilor, funcii, alias-uri, vectori, aritmetic integrat (n orice baz ntre 2 i 64), structuri de ciclare cu selecie pentru creare de meniuri, comanda let etc. Shell-ul C a fost creat la Universitatea Berkeley, California la sfritul anilor 70, fcnd parte din varianta 2BSD UNIX. Iniial, shell-ul C a fost scris de Bill Joy, oferind o serie de faciliti care nu erau cuprinse n shell-ul standard, shell-ul Bourne. Shell-ul C este bazat pe limbajul de programare C, iar atunci cnd este utilizat drept limbaj de programare folosete o sintax asemntoare cu cea din C. Ofer facilitile de istoric al liniei de comand, alias-uri, controlul job-urilor. Proiectat pe un calculator puternic, shell-ul C are tendina de a fi mai lent pe calculatoare mai puin puternice n comparaie cu shell-ul Bourne.

UNIX

Shell-ul TC reprezint o versiune mbuntit a shell-ului C, avnd o serie de noi faciliti, precum: editarea liniei de comand, posibilitatea rsfoirii istoricului, variabile, auto-completarea comenzii, corectare automat, planificarea job-urilor, etc. David Korn de la AT&T a inventat shell-ul Korn n 1986 i a devenit n mod oficial parte a distribuiei UNIX SVR4 n 1988. Shell-ul Korn, compatibil cu shell-ul Bourne, ruleaz nu numai pe sisteme UNIX, dar i pe OS/2, VMS i DOS. Ofer compatibilitate cu shell-ul Bourne, adugnd multe faciliti ale shell-ului C, fiind ns mai rapid i mai eficient dect acesta. Shell-ul Korn a avut o serie ntreag de versiuni; cea mai folosit versiunea a shell-ului Korn o reprezint versiunea aprut n 1988, cu toate c i cea din 1993 este deosebit de popular. Utilizatorii de Linux pot folosi o versiune free a shell-ului Korn, intitulat The Public Domain Korn Shell (pdksh), o clon a shell-ului Korn din 1988. Aceast versiune este free, portabil, compatibil POSIX. O alt versiune de shell, intitulat Z shell (zsh) este tot o clon Korn cu faciliti din TC shell, scris de Paul Falsted i disponibil free pe web. Datorit popularitii shell-ului bash i a importanei shell-ului Bourne ca shell clasic, n aceast carte vor fi prezentate aceste dou tipuri de shell. 6.4 Shell-uri pentru Linux

Cele mai importante variante de interpretoare pentru Linux sunt Bourne Again Shell (bash) i TC shell. Aceste shell-uri sunt instalate implicit pe sistemele Linux, iar ncepnd cu Solaris 8 i pe sistemele Sun. odat cu instalarea sistemului de operare Linux se obine acces la shell-urile i programele GNU, nu la shell-urile i programele standard UNIX. n Linux, cele mai populare shell-uri sunt bash i TC shell. Pentru a vedea ce versiuni de shell-uri sunt disponibile, trebuie cercetat fiierul /etc/shell, iar pentru a schimba shell-ul implicit n alt shell vom folosi comanda chsh (change shell), urmat de numele shell-ului dorit. De exemplu, pentru a modifica shell-ul n shell-ul Korn, vom introduce comanda:
$ chsh /bin/ksh

Shell-uri UNIX

6.5 6.5.1

Iniializarea sistemului i programul de login Iniializarea sistemului

n momentul pornirii sistemului, primul proces apelat este procesul ce se numete init. Fiecare proces are asociat un numr de identificare, denumit PID (Process Identification). Deoarece init reprezint primul proces apelat, acesta are PID=1. Rolul procesului init este acela de a iniializa sistemul i a porni alt proces (getty) ce deschide liniile pentru terminal, setnd standard input (stdin), standard output (stdout) i fiierul standard de eroare (standard error - stderr). Dup aceasta apare un prompter (de login) pe ecran. Fiierul standard de intrare este n mod normal tastatura, fiierul standard de ieire i cel de eroare sunt reprezentate de ecranul monitorului. Dup ce se introduce un nume de utilizator la prompterul de login, se cere o parol pentru autentificare. n acest moment, programul /bin/login verific identitatea utilizatorului prin analiza primului cmp din fiierul /etc/passwd (unde sunt stocate parolele). Dac numele de utilizator se regsete aici, urmtorul pas este acela de a verifica dac parola introdus este corect. Dup verificarea parolei, programul login definete un mediu iniial de lucru ce const din anumite variabile de sistem i acest mediu de lucru este transmis shell-ului. Variabilelor de sistem HOME, SHELL, USER i LOGNAME le sunt atribuite valori din fiierul passwd. Variabila HOME reprezint directorul home al utilizatorului; variabila SHELL reprezint numele shell-ului de login (ultimul cmp din fiierul passwd). Variabila USER i variabila LOGNAME reprezint numele utilizatorului. Printre alte variabile setate acum este i variabila PATH, ce reprezint o colecie de ci de cutare pentru comenzile introduse. n momentul terminrii execuiei programului login, acesta va lansa n execuie programul gsit n ultimul cmp al fiierului passwd, corespunztor liniei utilizatorului respectiv. Dac acest cmp este /bin/ksh, va fi executat shell-ul Korn; dac valoarea gsit este /bin/sh, se va porni shell-ul Bourne. Acest shell poart denumirea de login shell. Dup pornirea programului shell, se caut diverse fiiere generale de configurare iar apoi, n directorul home, se caut fiiere de configurare specifice utilizatorului respectiv. Dac acestea sunt gsite, se execut. Fiierele de iniializare sunt utilizate pentru a adapta mediul uilizatorului la propriile cerine. Dup ce s-au executat i aceste fiiere de configurare, apare un prompter pe ecran. Din acest moment, programul shell ateapt introducerea comenzilor.

UNIX

6.5.2

Interpretarea liniei de comand

n momentul introducerii unei comenzi la prompter, shell-ul citete o linie i interpreteaz linia de comand prin mprirea acesteia linia n cuvinte, denumite token-uri. Token-urile sunt separate de spaii i caractere tab, iar linia de comand se termin cu un caracter special denumit newline. Acest proces de interpretare al liniei de comand poart denumirea de analiz lexical. n urmtorul pas, shell-ul verific dac primul cuvnt introdus este o comand intern sau un program executabil pe disc. Dac este vorba despre o comand intern, aceasta va fi executat. n caz contrar, shell-ul va cuta n lista de directoare din variabila PATH pentru a gsi programul pe disc. Dac se gsete programul, shell-ul va incepe un nou proces (prin apelul fork) i apoi va executa programul. Dup aceasta, shell-ul va atepta pn cnd programul i ncheie execuia i apoi, dac este cazul, va afia starea programului care s-a ncheiat. n acest moment va aprea prompter-ul i ntreg procedeul descris mai sus se va relua la introducerea unei noi comenzi. 6.5.3 Tipuri de comenzi

n momentul execuiei unei comenzi, aceasta poate fi un alias, o funcie, o comand intern sau un program executabil pe hard disc. Un alias reprezint o prescurtare a unei comenzi existente i se aplic pentru shellurile C, TC, Korn i bash. Funciile sunt valabile n shell-urile Bourne (ncepnd cu versiunea AT&T System V, Release 2.0), bash i Korn, reprezentnd grupri de comenzi organizate sub forma unor proceduri separate. Funciile i alias-urile sunt definite n memoria shell-ului. Comenzile interne reprezint rutine interne ale shell-ului iar programele executabile sunt localizate pe hard disc. Shell-ul folosete variabila PATH pentru a cuta programele executabile pe hard disc i genereaz un apel fork de iniierea a unui proces copil nainte de execuia comenzii. n momentul n care shell-ul este gata s execute o comand, evalueaz tipul comenzii n urmtoarea ordine: 1) Alias-uri 2) Cuvinte cheie pentru shell 3) Funcii (n bash) 4) Comenzi interne 5) Programe executabile Dac, spre exemplu, comanda introdus este abc, shell-ul verific mai nti dac abc este un alias, apoi dac nu este cuvnt cheie (pentru

Shell-uri UNIX

shell). Dac nu, este o funcie sau comand intern? Dac nici acest lucru nu este valabil, atunci se verific (cutnd n directoarele specificate n variabila de sistem PATH) dac exist un program executabil pe hard disc cu acest nume. 6.5.4 Procese UNIX

Un proces reprezint o instan a unui program aflat n execuie i poate identificat prin numrul su de identificare PID. Cine administreaz procesele n UNIX? Nucleul sistemului de operare (kernel-ul), administreaz i controleaz aceste procese. Un proces este identificat de un program executabil, date i stiv, pointer de program i de stiv, regitri, precum i toate informaiile necesare pentru ca programul s ruleze. n momentul pornirii shell-ului, se iniieaz un proces. Shell-ul aparine unui grup de procese identificat prin identificatorul PID. Doar un singur grup de procese are controlul terminalului la un moment dat i se spune c ruleaz n foreground (la suprafa). n momentul procesului de login, shell-ul controleaz terminalul i ateapt introducerea unei comenzi la prompter.

Figura 6.1 Exemplu de listing al comenzii ps

Shell-ul poate iniia i alte procese. De fapt, n momentul introducerii unei comenzi la prompter sau atunci cnd aceasta este apelat dintr-un shell-script, shell-ul are sarcina s gseasc acea comand intern (dac este o comand intern) sau pe hard disc i apoi s execute acea comand. Acest lucru se face prin intermediul unui apel ctre kernel, denumit apel de sistem. Un apel de sistem reprezint de fapt o cerere adresat serviciilor kernel-ului i reprezint unica modalitate prin care un proces poate accesa hardware-ul sistemului. Exist o serie de apeluri de sistem ce permit proceselor s fie create, s se execute i s se termine. Procesele care ruleaz la un moment dat pe un sistem UNIX pot fi vizualizate cu ajutorul comenzii ps (process status). Comanda ps listeaz procesele aflate n execuie. n figura 6.1 avem un exempu de listing al comenzii ps. Pentru a vizualiza toate procesele ce ruleaz pe un sistem, se poate folosi comanda ps -ef (pentru SVR4) sau ps aux (pentru BSD sau Linux).

UNIX

Crearea proceselor se face n UNIX prin intermediul apelului de sistem fork. Cele mai importante apeluri de sistem sunt: fork, wait, exec i exit. Prezentm n continuare cteva caracteristici ale acestor apeluri de sistem. Apelul de sistem fork Un proces este creat n UNIX cu ajutorul apelului de sistem fork. Apelul fork creaz un duplicat al procesului apelant. Noul proces se numete copil iar procesul care l-a generat se numete printe. Procesul copil pornete imediat dup apelul fork i ambele procese partajeaz la nceput UCP (Unitatea Central de Procesare). Procesul copil menine o copie pentru: mediul procesului printe, fiierele deschise, identificatorii utilizatorului, valoarea umask, directorul curent de lucru i semnale. n momentul introducerii unei comenzi, shell-ul interpreteaz lexical linia de comand i determin dac primul cuvnt introdus este o comand intern sau o comand extern regsit ntr-un fiier pe hard disc. n primul caz, shell-ul execut comanda intern, dar n cel de-al doilea caz shell-ul apeleaz un apel fork pentru a face o copie a sa. Procesul copil va cuta comanda n directoarele specificate n variabila PATH; n acest timp procesul printe se afl n starea sleep. Apelul de sistem wait Procesul printe este programat s intre n starea sleep (de ateptare) n timp ce procesul copil execut redirectarea, mecanismele pipe i procesarea n background. Apelul de sistem wait face ca procesul printe s-i suspende execuia pn cnd unul dintre copiii si i ncheie activitatea. Dac procesul wait se desfoar normal, va returna PID-ul i exit-status-ul procesului copil care s-a ncheiat. Dac procesul printe nu este n stare de ateptare iar copilul termin activitatea, atunci procesul copil intr n starea zombie, rmnnd n aceast stare pn cnd fie apelul printe intr n starea wait, fie procesul printe se termin (pentru a nltura procesele zombie, sistemul trebuie repornit). Dac printele moare naintea copilului (care devine orfan), procesul init va prelua (adopta) un proces zombie orfan. Apelul de sistem wait asigur n acest caz i faptul c procesul se va termina n mod corespunztor. Apelul de sistem exec Dup introducerea unei noi comenzi la linia de comand, shell-ul genereaz n mod normal un apel fork, ce produce procesul copil. Dup cum am spus mai nainte, procesul copil este responsabil cu execuia comenzii introduse, prin intermediul apelului de sistem exec. n momentul n care programul executabil asociat comenzii este gsit, shell-ul cheam apelul

Shell-uri UNIX

exec cu numele comenzii drept argument. Kernelul ncarc noul program n memorie n locul shell-ului apelant, apoi procesul copil se suprapune peste noul program. Noul program devine proces copil i i ncepe execuia. Dei noul proces are propriile variabile locale, toate variabilele de mediu, fiierele deschise, semnalele, directorul curent de lucru sunt transmise noului proces. n momentul n care procesul se termin, shell-ul printe se trezete (iese din starea wait). Apelul de sistem exit Orice program i poate ncheia execuia prin apelul de sistem exit. n momentul n care un proces copil i ncheie execuia, el trimite un semnal (sigchild) i ateapt acceptul de terminare (exit) de la procesul printe. Orice program care se termin returneaz, de asemenea, o valoare corespunztoare ncheierii (cu succes sau nu) programului, denumit exit-status. Exit-status-ul reprezint un numr ntre 0 i 255. n general, un exit-status egal cu valoarea 0 (zero) indic faptul c programul s-a ncheiat cu succes i o valoare diferit de 0 n caz contrar. De exemplu, dac comanda cp a fost introdus la linia de comand, procesul shell printe va iniia prin fork un proces copil i va intra n starea sleep. Procesul copil va executa comanda cp n locul procesului printe, motenind toate variabilele de mediu, fiierele deschise, informaiile legate de utilizator,etc. n momentul terminrii execuiei comenzii cp, se va genera un exit iar procesul printe va iei din starea de ateptare, aprnd prompter-ul pe ecran. Fiecare shell are o variabil (intern) special prin care putem determina valoarea exit-status-ului ultimei comenzi ncheiate (variabila este $? pentru shell-ul Bourne). 6.5.5 Mediul de lucru i drepturi de acces

n momentul conectrii la sistem (login), shell-ul i pornete execuia, motenind o serie de variabile de sistem, fluxuri de I/O (Input/Output), precum i caracteristicile procesului rezultat din execuia programului /bin/login. n continuare, dac alt proces copil este iniiat de procesul printe, acest proces copil va moteni la rndul su caracteristicile procesului printe. Caracteristicile mediului constau n permisiunile procesului (cine deine procesul), directorul curent de lucru, masca de creare a fiierului (file mask), o serie de variabile speciale, fiiere deschise, semnale. n momentul login-ului, shell-ul primete o identitate; are un identificator al utilizatorului real (UID - User Identification), unul sau mai muli identificatori de grup (GID - Group Identification), un identificator al utilizatorului efectiv (EUID - Effective User Identification) i un

UNIX

identificator al grupului efectiv (EGID - Effective Group Identification). Iniial, EUID i EGID sunt identici cu UID i, respectiv, GID. Aceti identificatori se gsesc n fiierul passwd, fiind utilizai de ctre sistem pentru a identifica utilizatorii i grupurile de utilizatori. Identificatorii EUID i EGID determin drepturile pe care le are un proces, referitoare la operaiile de citire, scriere sau execuie a unui fiier. n cazul n care EUID i UID ale unui proces coincid, procesul are drepturile de acces ale proprietarului asupra fiierului. Dac EGID i GID ale unui proces coincid, acest proces deine privilegiile grupului proprietar. Identificatorul UID (ce se regsete n fiierul /etc/passwd, al treilea cmp) este un numr pozitiv ce este n mod unic asociat cu numele de login (numele utilizatorului). n momentul operaiei de login, shell-ul primete identificatorul UID i toate procesele ce vor fi iniiate de acesta vor moteni drepturile sale de acces. Orice proces care ruleaz cu un UID=0 aparine super-utilizatorului root i are, astfel, drepturi de root. Identificatorul GID realizeaz asocierea numelui de utilizator cu un nume de grup, regsindu-se n acelai fiier /etc/passwd pe coloana a 4-a. Identificatorii efectivi EUID i EGID pot fi modificai; prin modificarea lui EUID (sau EGID) ctre alt utilizator, putem deveni proprietarii unui proces ce aparine altui utilizator. Programele ce modific identificatorii EUID i EGID sunt setuid i setgid. De aceea, programele setuid sunt deseori surse de bree n securitatea sistemului. Programul /bin/passwd este un exemplu de program setuid ce ofer drepturi de root. Comanda umask n momentul crerii unui nou fiier, acesta are o serie de drepturi de acces implicite. Aceste drepturi de acces sunt determinate de programul ce a creat fiierul, avnd n vedere c procesele copil motenesc o aa numit masc implicit (default mask) de la procesele printe. Utilizatorul poate modifica aceast masc prin utilizarea comenzii umask. Comanda umask se utilizeaz atunci cnd dorim s modificm masca implicit. Iniial, umask este 000, ceea ce ofer unui director drepturile 777 (rwxrwxrwx) i unui fiier drepturile 666 (rw-rw-rw-). Pe majoritatea sistemelor, umask este setat iniial la valoarea 022 de ctre programul /bin/login sau de ctre fiierul de configurare iniial /etc/profile. Dar cum se calculeaz drepturile de acces n funcie de valoarea lui umask? Pentru directoare, se scade valoarea lui umask din valoarea 777, iar pentru fiiere se scade valoarea lui umask din valoarea 666. Astfel, pentru un umask egal cu valoarea 022, un director va avea drepturile 755 (rwxr-xr-x), iar un fiier va avea drepturile de acces 644 (rw-r--r--). Imediat dup setarea

Shell-uri UNIX

valorii lui umask, toate fiierele i directoarele nou create vor avea noile drepturi de acces specificate, conform exemplului de mai nainte. Comanda chmod Pentru a modifica drepturile de acces la anumite fiiere i/sau directoare, se poate utiliza comanda chmod (change mode). Pentru fiecare fiier de pe un sistem UNIX, exist un unic proprietar al acestuia. Doar proprietarul i utilizatorul root au dreptul de a modifica drepturile de acces la un anumit fiier sau director. Cele opt posibiliti de stabilire a drepturilor de acces la fiiere
Tabelul 6.2
Valoare octal 000 001 010 011 100 101 110 111 Valoare zecimal 0 1 2 3 4 5 6 7 Drepturi de acces ----x -w-wx r-r-x rwrwx

Fiecare fiier UNIX are o serie de drepturi de acces (citire, scriere, execuie) pentru proprietar, grupul din care face parte i restul utilizatorilor. Aceste drepturi de acces sunt stocate n cmpul mode al inode-ului fiierului. Comanda chmod este deci folosit pentru a modifica drepturile de acces la un fiier sau director. Utilizatorul trebuie s fie proprietarul fiierului pentru a putea modifica aceste drepturi (identificatorul EUID al apelantului trebuie s fie acelai cu UID, sau root). n tabelul 6.2 avem ilustrate cele opt posibiliti de drepturi de acces la fiiere. De asemenea, n figura 6.3 sunt prezentate cteva exemple de utilizare a comenzii chmod. n primul caz, argumentul comenzii chmod este 754, aceasta nsemnnd rwx pentru proprietar, r-x pentru grup i r-- pentru ceilali utilizatori. n cazul al doilea, este adugat (opiunea +) permisiunea de scriere (w) pentru grup. n a treia comand, se iau (opiunea -) drepturile de citire (r) i execuie (x) pentru grup i ceilali utilizatori, iar n ultimul exemplu, toi (a-all) utilizatorii primesc (doar) dreptul de citire. Operatorul egal (=) face ca toate drepturile anterioare s fie resetate la noua valoare.

UNIX

Figura 6.3 Exemple de utilizare a comenzii chmod

Comanda chown Comanda chown (change owner) modific proprietarul i grupul pentru fiiere i directoare. Ca i n cazul comenzii chmod, doar proprietarul i root au dreptul de a face acest lucru (pe anumite versiuni de UNIX, precum BSD, doar utilizatorul root poate face acest lucru). n figura 6.4 avem un exemplu de utilizare a acestei comenzi (se modific proprietarul fiierului test din root n daemon).

Figura 6.4 Exemplu de utilizare a comenzii chown

Directorul de lucru n momentul procesului de login, fiecare utilizator este poziionat ntr-un director anume, care se numete directorul home. Directorul home este motenit de toate procesele iniiate din cadrul acestui shell. Orice proces copil poate modifica propriul director de lucru, dar aceste modificri nu vor afecta procesul shell printe. Comanda cd (change directory) este o comand intern a sistemului UNIX. Fiecare shell deine propria copie a comenzii cd. O comand intern este executat de shell direct ca parte a propriului cod; shell-ul nu face apeluri fork i exec atunci cnd execut comenzi interne. Dac un alt shell-script este iniiat prin fork de ctre procesul printe, comanda cd va fi executat n shell-ul copil i directorul va fi modificat aici. Atunci cnd procesul copil se termin, procesul printe va fi n acelai director ca i nainte de a fi pornit procesul copil. n figura 6.5 este ilustrat acest fapt.

Shell-uri UNIX

Figura 6.5 Directorul de lucru

Semnale n momentul n care un semnal trimite un mesaj unui proces, acesta din urm se termin. Putem trimite semnale unui proces prin apsarea tastelor BREAK, DELETE, QUIT i STOP, iar toate procesele acelui terminal vor fi afectate de semnalul trimis. Putem opri un proces aflat n execuie prin comanda kill. Shell-ul permite manipularea semnalelor trimise programelor, fie prin ignorarea lor, fie prin specificarea unei aciuni n momentul apariiei unui anumit semnal. Mai multe detalii legate de semnalele UNIX sunt prezentate n seciunea 7.6.7. 6.6 Scrierea unui shell-script

n momentul n care utilizm facilitile de limbaj de programare ale shell-ului, vom construi programe (shell-script-uri) care cuprind comenzi UNIX i constructori de control shell. Cum realizm acest lucru? Utiliznd un editor de texte, vom scrie comenzile i construciile shell i vom salva fiierul cu un nume oarecare (script.sh, spre exemplu). Liniile din cadrul shell-script-ului vor fi interpretate una cte una de ctre shell (avem de-a face cu programe interpretate, nu compilate). De regul, prima linie dintr-un fiier shell-script indic tipul de shell utilizat. Spre exemplu, dac folosim shell-ul Bourne, prima linie va arta astfel:
#!/bin/sh

iar dac utilizm shell-ul bash, prima linie va arta:


#!/bin/bash

Dup ce salvm fiierul, trebuie s i dm drepturi de execuie (vom folosi comanda chmod) i n acest moment suntem gata s l rulm. Putem lansa n execuie programul intitulat script.sh astfel (./ semnific faptul c acesta se afl n directorul de lucru curent):
$ ./script.sh

You might also like