Lucrarea 1
Sistemul de fişiere Unix.

Cuprins
Scopul lucrării
Consideraţii teoretice
Structura standard a sistemului de fişiere
Tipuri de fişiere
Implementarea sistemului de fişiere
Drepturi de acces
Comenzile ls şi chmod
Aplicaţii
Probleme propuse

1. Scopul lucrării

Lucrarea de faţă prezintă structura şi organizarea fişierelor sub sistemul de operare UNIX.
 
 

2. Consideraţii teoretice

Sistemul de fişiere este o caracteristică importantă a unui sistem de operare. Sistemul de fişiere este locul unde se memorează pe suport fizic fişierele sistem şi cele utilizator. Sistemul de fişiere este caracterizat prin trei aspecte: structura ierarhică, independenţa ridicată faţă de hardware şi o mare flexibilitate. Structura ierarhică este organizată sub forma unui arbore cu un director rădăcină (root). Directorul rădăcină poate conţine fişiere, legături sau alte directoare, numite subdirectoare. Subdirectoarele sunt noduri în arbore, iar fişierele sunt frunze. independenţa faţă de hardware rezultă din faptul că fişierele sunt privite ca o succesiune de octeţi. Flexibilitatea se bazează pe posibilitatea de a monta sau demonta la orice nivel în ierarhia de fişiere noi structuri arborescente de directoare şi fişiere.
 
 

2.1 Structura standard a sistemului de fişiere

Nivelul de sub rădăcina este tipic, fiind comun tuturor sistemelor de operare compatibile UNIX. Caracteristic pentru toate este faptul că pe măsură ce ne depărtam de rădăcină diferenţele între sisteme cresc. Administratorul de sistem stabileşte de regulă structura sistemului de fişiere şi ţine cont de resursele hard de care dispune şi de cerinţele utilizatorilor. Structura standard conţine directoarele:
 


Root File System



Structura arborescentă a sistemului de fişiere dă posibilitatea unui număr mare de utilizatori să creeze şi să gestioneze un număr mare de fişiere. Nu există limitare a numărului de noduri eventualele restricţii sunt impuse de hardware. Particularităţi:

• în directoare diferite pot exista fişiere diferite cu acelaşi nume;
• un fişier frunză poate fi legat la mai multe directoare chiar dacă acesta nu se află la acelaşi nivel în arbore;
• fiecare director conţine cel puţin două intrări:
. referă directorul însuşi, iar
.. referă directorul superior (părinte);
• orice director este legat la nivelul superior printr-o singură legătura (..).
Accesul la un fişier se face prin indicarea poziţiei lui în arbore. Pentru aceasta se indică modul de obţinere al fişierului coborând pe nivelurile arborelui fie de la directorul curent (cale relativă) fie de la rădăcina (cale completă). Prin directorul curent se înţelege directorul în care se găseşte utilizatorul la momentul curent. Numele complet al fişierului cu indicarea poziţiei sale în arbore poartă denumirea de nume de cale. Numele de cale poate fi de orice lungime, fiecare nume de director fiind separat de vecinul său prin caracterul '/'. Caracterul '/' pe lângă rolul de separator de directoare şi fişiere identifică şi directorul rădăcină. Pentru utilizatorii familiarizaţi cu sistemul de operare DOS sunt utile observaţiile:

• caracterul '\' este înlocuit în Unix cu '/'.

• în Unix se face distincţie între litere mici şi litere mari;

• numele unui fişier Unix poate fi oricât de lung în funcţie de implementare (minim 14 octeţi);

• extensia nu este o caracteristică a sistemului Unix;

• un fişier Unix poate avea mai multe nume, fiecare fiind asociat unei legături;

• un fişier executabil în Unix este un fişier ce are setat dreptul de execuţie (indiferent de numele său);

• un fişier de comenzi Unix se numeşte script.

• se acceptă caracterele * şi ? în Unix, dar semnificaţia diferă;

• drepturile de acces asupra unui fişier în Unix sunt diferite. De exemplu, un fişier ascuns în Unix înseamnă lipsa dreptului de citire pentru directorul care conţine fişierul.

• un fişier text Unix are marcat sfârşitul de linie printr-un singur caracter ('\n');

• pipe-ul în Unix nu impune crearea de fişiere temporare;
 

2.2 Tipuri de fişiere

În Unix se deosebesc patru tipuri de fişiere: ordinare (obişnuite), pipe, speciale şi directoare. Unele documentaţii consideră fişierele pipe în categoria fişierelor speciale.

Din punct de vedere al sistemului de operare un fişier este un şir de octeţi de lungime nedefinită terminat cu un caracter special de sfârşit de fişier (EOF). Orice octet sau secvenţă de octet poate fi citită sau scrisă. Citirea sau scrierea începe de la o locaţie de octet specificată prin pointerul de fişier (sau marker), care poate fi poziţionat oriunde în fişier. Fişierele obişnuite sunt păstrate pe disc.

Un fişier obişnuit este creat de un proces. El poate conţine o sursă (text) sau un fişier executabil (binar). Două sau mai multe procese pot să citească şi să scrie concurent în acelaşi fişier. Rezultatul depinde de ordinea în care cererile individuale de I/E apar şi sunt în general imprevizibile. Până nu demult Unix-ul nu avea mecanisme eficiente pentru controlul accesului concurent. Versiunile mai noi de Unix deţin un control al concurenţei prin semafoare.

Fişierele obişnuite nu au nume, ele au ataşate nişte numere, care sunt interpretate ca index intr-o lista de i-node-uri, păstrata la începutul fiecărui disc care conţine un sistem de fişiere Unix. Fiecare i-node conţine informaţii importante despre fişier, care nu includ însă numele fişierului sau octeţii de date. Asupra informaţiilor din i-node se va reveni pe parcurs.

Un fişier pipe este un fişier care este citit de un proces o singură dată şi este de natura temporară. Dacă data a fost citită din pipe o citire ulterioară este posibilă doar dacă procesul care a creat fişierul pipe recreează datele într-un nou fişier pipe. Fişierele pipe sunt cunoscute ca fişiere FIFO. Asupra acestor fişiere se va reveni în lucrările următoare.

Fişiere speciale sunt fişiere ataşate dispozitivelor de I/E (driverele bloc sau driverele caracter). în directorul /dev se găsesc toate referinţele la dispozitivele de I/E: discuri, benzi magnetice, terminale, imprimante, mouse etc. Acestea sunt considerate fişiere speciale. De exemplu, pentru fiecare partiţie a unui hard disc se găseşte câte un fişier special. Un fişier special deţine un i-node, care însă nu referă un bloc de date pe disc. În schimb acest i-node conţine un număr de dispozitiv, care este folosit ca index într-o tabela kernel de proceduri pentru dispozitive periferice. Pentru identificarea fiecărui dispozitiv se folosesc două numere: minor (identifică numărul dispozitivului de tipul dat) şi major (identifică tipul dispozitivului).

Folosirea dispozitivelor în această manieră conferă avantajul tratării uniforme. Din punct de vedere utilizator nu există nici o diferenţa între lucrul cu fişiere ordinare şi cele speciale. De exemplu:

$cp prg.c /usr/acct/k/prg1.c # copiere simplă

$cp prg.c /dev/lp0 # listare la imprimantă

Fişierele speciale de tip bloc respectă cerinţa: pe de o parte dispozitivul conţine un şir de blocuri de dimensiune fixă (în mod uzual de 512 octeţi fiecare), iar pe de cealaltă parte tampoanele kernel-ului sunt utilizate ca tampoane cache pentru rapidizarea operaţiei de I/E. Fişierele speciale de tip caracter nu respectă nici o cerinţă. În acest caz, operaţiile de I/E se fac fie la nivel de octet fie la nivel de piste.

Un director face legătura între numele fişierelor şi locul unde acestea sunt memorate pe disc. El nu conţine efectiv fişierele care îi aparţin ci doar referinţele la acestea, sub forma unei succesiuni neordonate de intrări de 16 biţi (sistemele noi de Unix nu mai au aceasta limitare). Orice intrare director este formată din numele fişierului (14 octeţi) şi un număr de identificare (2 octeţi). Acesta din urma refera un i-node sau nod de identificare, în care se păstrează informaţiile referitoare la fişierul în cauză. Fişierul director conţine o tabelă de nume de fişiere împreună cu inode-urile asociate.

Fiecare fişier are un singur i-node care conţine:

1) Proprietarul fişierului indicând şi drepturile de acces ale celorlalţi utilizatori. Superuser-ul ignoră drepturile indicate în acest câmp.

2) Tipul fişierului (obişnuit, director, pipe sau special)

3) Drepturile de acces la nivel de utilizator, grup şi alţii.

4) Timpul ultimului acces şi ultimei modificări, data şi ora ultimei modificări efectuate asupra i-node-ului.

5) Numărul de legături (a se vedea comanda unlink).

6) Adresele disc ale sectoarelor ce conţin datele fişierului.

7) Lungimea fişierului în octeţi.

Dacă i-node-ul este 0 intrarea respectivă este vidă, adică nu există fişiere în acel director.

Un fişier director poate fi citit ca orice fişier, dar nu poate fi scris în mod direct, ci numai prin intermediul anumitor programe.

Conversia numelui de cale specificată în programe (procese) în i-node-ul fişierului este sarcina kernel-ului Unix.

O caracteristică importantă a sistemului este noţiunea de legare ( linking). în acest caz vom avea două nume de fişiere în două directoare diferite care refera acelaşi i-node. Pentru legarea la orice director a unui fişier care este legat deja la un director sistemul pune la dispoziţie comanda ln (link).

Sintaxa:

ln nume_cale_veche nume_cale_noua

Acelaşi lucru se poate realiza prin apelul sistem link. Ştergerea unei legături se poate realiza prin comanda sau apelul sistem unlink. La ştergerea unei legături dintr-un director i-node-ul şi blocul de date asociat nu este disponibilizat căci ar putea să mai existe un alt fişier care să refere acelaşi i-node. Din acest motiv i-node-ul conţine în structura sa un câmp contor de legături. Ştergerea unei legături implică decrementarea contorului de legături. Când acesta ajunge la zero kernel-ul eliberează i-node-ul şi blocul de date. Se recomandă însă atenţie mare la folosirea acestor comenzi sau apeluri sistem.

Legarea directoarelor este posibilă, dar numai de superuser.

O altă caracteristică importantă a sistemului Unix este posibilitatea de a monta un întreg arbore de fişiere undeva în ierarhia altui sistem de fişiere. Nucleul sistemului de operare Unix recunoaşte un singur director rădăcina. Dar este posibil ca fişierele să se găsească pe mai multe suporturi fizice sau logice, fiecare volum având un sistem de fişiere propriu arborescent. Este posibilă suprapunerea rădăcinii unui astfel de sistem de fişiere pe un director al sistemului de fişiere recunoscut de nucleu. Aceasta operaţie se numeşte montare (mount) şi poate fi realizată de superuser. Înaintea acestei operaţii este necesar un punct de montare, care poate fi orice director gol din sistem.

După montare, calea la punctul de montare prefixează orice acces la un fişier sau director de pe sistem de fişiere montat. De exemplu:

$mount /dev/dsk /usr/k/m1 [-r]

montează cu posibilitatea de citire (-r) la directorul gol m1 volumul /dev/dsk.

Pentru a accesa o dischetă aflată în unitatea 0, comanda de montare la directorul d1 din rădăcina este:

$mount /dev/fd0 /d1

De exemplu, pentru a accesa sub Linux o dischetă formatată DOS este necesară montarea prin comanda:

$mount -t msdos /dev/fd0 /d1

Dacă montarea nu mai este necesară şi se doreşte, eventual, o altă montare de pe alt dispozitiv, se impune demontarea şi eliberarea punctului de montare prin:

$umount /dev/fd0
 
 

2.3. Implementarea sistemului de fişiere

Kernelul lucrează la accesul fişierelor cu i-node-ul ataşat.

Fiecare utilizator are asociată o tabela a fişierelor deschise pe baza căreia se actualizează tabela fişierelor deschise din întregul sistem. Aceasta din urmă permite gestionarea unei tabele de i-node-uri active cu ajutorul căreia se identifică fişierele pe disc. Orice disc care conţine un sistem de fişiere Unix are următoarea structura:

                                                 blocul 0                blocul 1                        2+isize   fsize
 
  Blocul de boot Superbloc  Lista de inode-uri  Blocuri de date  Zona de swapping     
Fig.1. Dispunerea informaţiilor pe un disc Unix.

Sistemul de operare priveşte discul ca o succesiune de blocuri de 512 octeţi, numerotate de la 0 la o valoare maximă dată la iniţializare. Blocul 0 este rezervat unui încărcător. Blocul 1 conţine superblocul care gestionează alocarea blocurilor. El conţine următoarele informaţii:

• dimensiunea sistemului de fişiere;

• numărul blocurilor libere din sistemul de fişiere;

• lista blocurilor disponibile din sistemul de fişiere;

• indexul următorului bloc liber din lista blocurilor libere;

• dimensiunea listei de i-node-uri;

• numărul total de i-node-uri libere din sistemul de fişiere;

• lista i-node-urilor libere din sistemul de fişiere;

• indexul următorului nod liber din lista i-node-urilor libere;

• alte informaţii;

• fanion de modificare.

Superblocul este copiat în memoria internă. Nucleul actualizează periodic Superblocul pentru a asigura corespondenţa reală cu sistemul de fişiere. Ca atare, se recomandă terminarea normală a unei sesiuni de lucru. Distrugerea superblocului cauzează imposibilitatea accesului la sistemul de fişiere.

Blocurile 2,3, ...1+isize sunt alocate pentru lista de i-node-uri. Fiecare i-node este de 64 octeţi şi descrie un fişier. I-node-ul 2 este folosit de directorul rădăcina (1 este rezervat pentru gestionarea blocurilor defecte).

Blocurile 2+isize până la fsize-1 sunt utilizate pentru înregistrarea datelor. Toate fişierele şi directoarele sunt păstrate aici. Dacă un fişier sau director constă din mai multe blocuri acestea nu trebuie să fie contigue pe disc.

Zona de swapping serveşte pentru salvarea temporară a unor segmente de procese, care aşteaptă în memoria internă a calculatorului.

Pentru a deschide un fişier în directorul curent, sistemul citeşte fiecare intrare din director şi compară numele fişierului cu numele de fişier memorat în fiecare intrare până când fişierul este găsit sau se conchide că acesta nu există. Dacă fişierul este prezent, sistemul extrage din intrare numărul de i-node, şi îl foloseşte ca index în lista (tabela) i-node-urilor de pe disc, pentru a localiza I-node-ul şi a-l aduce în memorie. I-node-ul este depus în tabela i-node-urilor din memorie, care conţine toate i-node-urile fişierelor deschise. Tabela este gestionată de kernel.

Localizarea unui fişier precizat printr-o cale completă este un lucru puţin mai dificil. De exemplu, pentru calea /usr/act/fis sistemul localizează iniţial directorul rădăcina (I-node-ul 2). După aceasta caută printre intrările sale intrarea usr şi găseşte i-node-ul asociat ei. I-node-ul este adus în memorie şi se determină blocul de pe disc care conţine directorul /usr. Intrările acestui director sunt citite şi comparate cu şirul act. O dată găsită intrarea, se extrage i-node-ul pentru directorul /usr/act şi se citeşte blocul de pe disc referit de el. În final, se caută şirul fis printre intrările sale şi se determină i-node-ul care ne conduce la blocul de date al fişierului. Se poate observa că utilizarea căilor relative este mult mai convenabilă nu numai pentru utilizator cât şi pentru sistem, care astfel şi reduce operaţiile de căutare.
 
 

2.4. Drepturi de acces

Protecţia accesului la fişiere într-un sistem cu mai mulţi utilizatori este un aspect important. În Unix fiecare fişier conţine în i-node-ul asociat un identificator utilizator (IDU) şi un identificator de grup (GUID) al proprietarului (vezi procese). Fiecare utilizator primeşte un număr specific, numit număr de identificare (ID). în momentul în care este creat un fişier el primeşte ca semn de recunoaştere ID-ul celui care la creat. Fiecare fişier conţine în i-node-ul asociat trei seturi de câte trei biţi. Seturile corespund proprietarului, grupului din care face parte proprietarul (grupul) şi celorlalţi utilizatori din sistem (alţii). Pentru fiecare dintre aceştia există dreptul de citire (Read), de scriere (Write) şi de execuţie (eXecute). Dreptul precizează unui proces operaţiile (citire, scriere, execuţie) pe care acesta le poate efectua asupra unui fişier. Pentru fişiere obişnuite semnificaţia drepturilor este evidentă. Pentru directoare dreptul de citire înseamnă drept de consultare (de afişare) a directorului (permisa comanda ls). Dreptul de scriere înseamnă că în acest director se pot crea noi fişiere, stere fişiere, se poate monta un sistem de fişiere se pot adaugă sau şterge legături. Un director care are drept de execuţie poate fi vizitat în timpul catarii unui fişier. Pentru fişiere speciale şi pipe dreptul de citire scriere semnifică capacitatea de a executa apelurile sistem read sau write. Dreptul de execuţie nu este important în acest caz.

Drepturile de acces ale unui fişier sunt păstrate într-un cuvânt de 16 biţi cu următoarea semnificaţie:
 
Bit(i) Semnificaţie
0-3 Tipul fişierului
4 Setează ID-ul utilizator în timpul execuţiei (suid).
5 Setează ID-ul grupului în timpul execuţiei (sgid).
6 Setare swapping (stiky bit). Fişierele care au acest bit poziţionat pe 1 rămân în zona de swapping. Un astfel de fişier este citit ulterior în întregime printr-o singură operatei (nu pe blocuri) în memorie. 
7-9 Drept de citire, scriere, execuţie pentru proprietar. 
10-12 Drept de citire, scriere, execuţie pentru grup. 
13-15 Drept de citire, scriere, execuţie pentru alţii. 

 

2.4.1. Bitul sticky

Dacă un fişier executabil are bitul sticky poziţionat, atunci la prima sa execuţie o copie a zonei sale text este salvată în zona de swap (la terminarea procesului). Acest lucru permite programului să se încarce în memorie mult mai repede, deoarece zona swap este gestionată ca o zona contigua. Acest bit era folosit pentru programe de aplicaţie obişnuite, precum editoarele de text. Cu toate că zona de swap era limitată tehnica a fost des utilizată. Actualmente sistemele Unix având un sistem de memorie virtuala şi un sistem de fişiere rapid nu mai folosesc aceasta tehnica.

Versiunile noi de Unix permit poziţionarea bitului sticky pentru directoare. Daca acest bit este poziţionat pentru director, un fişier din director poate fi şters sau redenumit dacă utilizatorul are drept de scriere în director şi este proprietarul fişierului şi directorului, sau este superuser.

2.4.2. Biţii suid şi sgid. Identificatorul utilizator (IDU) şi identificatorul grupului de utilizatori (GIDU)

Fiecare utilizator primeşte un număr specific, numit identificator utilizator (IDU). Acesta este un număr pozitiv asociat cu un nume utilizator de intrare în sesiune (login), aflat în fişierul de parole /etc/passwd. La intrarea în sesiune a unui utilizator, comanda login face acest identificator IDU al primului proces creat, interpretorul shell. Procesele descendente din shell moştenesc acest IDU.

Utilizatorii sunt organizaţi în grupuri (a nu se confunda cu grup de procese), care au ID propriu numit identificator de grup (GIDU). Pentru un utilizator, acesta este preluat din fişierul de parole şi făcut GIDU shell-ului propriu.

Grupurile sunt definite în fişierul de grup /etc/group. La intrarea în sesiune un utilizator poate să creeze un alt grup. Acesta schimbă GIDU procesului ce gestionează cererea (normal shell-ul, prin comanda newgrp), care apoi este moştenit de toţi descendenţii procesului.

Cei doi identificatori descrişi se numesc IDU real şi GIDU real, deoarece aceştia sunt reprezentativi pentru utilizatorul real (persoana care a deschis sesiunea). Fiecărui proces îi sunt asociaţi alţi doi identificatori numiţi IDU şi GIDU efectiv. Aceştia sunt, de regulă, identici cu cei reali corespunzători, dar pot fi şi diferiţi după cum vom vedea în continuare. ID efectivi se referă la drepturile de acces.

Fiecare fişier conţine în i-node-ul sau un IDU şi un GIDU al proprietarului. I-node-ul conţine printre altele doi biţii suid şi sgid.

Când un proces este în execuţie, sistemul de operare îi atribuie doi identificatori: IDU real, egal cu cel al utilizatorului procesului (cel care la iniţializat) şi IDU efectiv. Analog sistemul de operare creează doi identificatori relativ la grup.

În general, ID efectivi sunt identici cu ID reali, în afara cazului în care procesul execută un cod conţinut într-un fişier asupra căruia nu are drepturi de execuţie obişnuite, dar are bitul suid sau sgid poziţionat. În acest caz, procesul poate totuşi să execute codul conţinut în fişier, cu ID efectiv egal cu cel al proprietarului fişierului şi diferit de cel real, cel al proprietarului de fişier, care a rămas nemodificat. Procesul posedă dreptul, cât timp execută codul în cauză, corespunzător proprietarului fişierului programului în curs. Dacă, de exemplu, acest proprietar este superuserul, procesul posedă temporar toate drepturile asupra sistemului. Dar singura acţiune care o poate realiza este cea definită în programul executat şi probabil determinată de proprietarul fişierului, în acest caz superuserul. Îndată ce procesul execută codul unui program conţinut într-un fişier neprotejat, IDU efectiv (GIDU efectiv), redevine egal cu cel real. Procesul continuă să se execute cu drepturile iniţiale.

Uneori se doreşte ca un utilizator comun să aibă, pentru un timp, privilegiile altui utilizator. Având o configuraţie ca în figura 2, pentru ca procesul P (care are alt proprietar) să poată modifica datele din F, bitul suid al lui P trebuie poziţionat şi utilizatorul U să poată lansa în execuţie pe P. în aceasta situaţie în timpul execuţiei lui P, acesta având bitul suid poziţionat, U are IDU efectiv acelaşi cu al lui P şi astfel el poate modifica datele din F (accesul direct U la F nu e permis). 


utilizator 
comun
======
 

 

P+suid comanda 
passwd
======

fişierul 
/etc/passwd
Fig.2. Accesul la fişierul de parole.

Deci utilizatorul poate avea acces la fişierul de parole numai prin intermediul unui program care are bitul suid poziţionat, iar acest program este astfel conceput încât un alt utilizator să nu vadă sau să modifice alte parole.

Bitul sgid este folosit în aceeaşi manieră pentru grup.

Un fişier care are aceşti biţi poziţionaţi afişează ca rezultat al comenzii ls pe poziţia lui 'x' litera 's'. Pentru a-i poziţiona se foloseşte comanda chmod. Proprietarul fişierului executabil şi superuserul pot modifica aceşti biţi. Se poate spune că 's' este o extensie a permisiunii 'x' în contextul discutat.

Algoritmul folosit de sistem pentru a determina dacă un proces are sau nu dreptul de a efectua o operaţie ( citire, scriere sau execuţie) asupra unui fişier dat este următorul:

1) Daca IDU efectiv este 0 permisiunea este acceptată (utilizatorul efectiv este superuserul);

2) Daca IDU efectiv al procesului şi IDU al fişierului se potrivesc se decide permisiunea din biţii proprietarului;

3) Daca GIDU efectiv al procesului şi GIDU al fişierului se potrivesc se decide permisiunea din biţii grupului;

4) Daca nici IDU şi nici GIDU nu se potrivesc atunci, se decide din ultimul set de trei biţi.

Sistemul pune la dispoziţia utilizatorilor următoarele apelurile sistem pentru aflarea unui identificator real sau efectiv:

int getuid() Returnează IDU real.

    int getgid() Returnează GIDU real.

    int geteuid() Returnează IDU efectiv.

    int getegid() Returnează GIDU efectiv.

Apelurile sistem pentru actualizarea IDU şi GIDU sunt:

    int setuid ( uid)

    int uid;

    int setgid( gid)

    int gid;

Dacă apelantul este superuserul, aceste două apeluri sistem actualizează IDU real şi efectiv sau GIDU la valoarea argumentului. Aceasta permite superuserului să devină orice proces. Apelurile întorc 0 în caz de succes şi -1 în caz de eroare.

Cea mai importantă comandă Unix care foloseşte acest apel este login. După afişarea numelui de login şi a parolei, programul login verifică acestea prin inspectarea fişierului /etc/passwd şi dacă sunt valide execută setuid şi setgid pentru a actualiza IDU şi GIDU real şi efectiv la valoarea din intrarea /etc/passwd. Login actualizează directorul de login ca director curent şi foloseşte apelul exec pentru lansarea shell-ului.

Utilizatorul simplu poate executa setuid şi setgid, dar numai pentru a schimba IDU efectiv sau GIDU înapoi la ID real corespunzător. în acest caz, argumentul trebuie să fie IDU sau GIDU real. Această caracteristică este folosită când un program trebuie lansat cu un ID efectiv particular, să facă o prelucrare privilegiata şi să revină la ID real pentru restul vieţii procesului.
 
 

2.5. Comenzile ls şi chmod

ls Listează continuul directoarelor.

Sintaxa: ls [opţiuni] director

Opţiuni:

-d Afişează numai directoarele din directorul curent.
-l Afişează în format lung, indicând drepturile de acces, numărul de legături, dimensiunea fişierului, data ultimei actualizări, numele fişierului.
-i Afişează şi numărul i-node-ului fiecărui fişier.
-s Afişează numărul de blocuri pentru fiecare fişier.
-t Fişierele sunt sortate după data ultimei actualizări
-u La afişare se consideră data ultimului acces în loc de data ultimei actualizări pentru opţiunile -t sau -l.
-r Inversează ordinea de sortare.
Exemplu: ls -lsi /usr

chmod Schimba drepturile de acces la un fişier ordinar sau director.

Sintaxa: chmod atr fişier(e)

atr Se exprimă ca un număr octal din patru cifre sau printr-o combinaţie de forma:

[u | g | o] [+ | - | =] [r | w | x | s | t]

+ adaugă permisiune
- şterge permisiune
= atribuie permisiune
Categorie utilizator Permisiune
u - proprietarul r - Read
g - grupul w - Write
o - restul utilizatorilor x - eXecute
a - u+g+o t - setare bit swapping
Drepturile de acces la un fişier se păstrează într-un cuvânt, plasat în i-node-ul fişierului. Se poate specifica direct valoarea acestui cuvânt, biţii având semnificaţia: 
Drept
Proprietar
Grup
Alţii
Citire
0400
040
04
Scriere
0200
020
02
Execuţie
0100
010
01
Exemplu:

chmod o-x f1 Şterge dreptul la execuţie pentru restul utilizatorilor fata de fişierul f1.

chmod 0774 f1 F1 va avea permisiunile de acces rwxrwxr--.
 
 

3. Aplicaţii:

3.1. Să se găsească comenzile Unix corespondente următoarelor comenzi DOS de lucru cu fişiere:
 
attrib chmod, ls -l
cd, chdir cd, pwd
comp cmp
copy cp, cat
del, erase rm
dir ls
fc cmp, diff
md, mkdir mkdir
ren mv
rd, rmdir rmdir 
type cat

3.2. Un fişier cu numele sistem.c este identificat în sistemul de operare DOS de expresiile 'sis*z.c*' şi 'sistem.c??'. Care dintre aceste expresii identifică în Unix fişierul ?

Caracterul * identifică orice secvenţă arbitrară de caractere, iar caracterul ? identifică orice caracter singular. Diferenţele apar la modul în care se face potrivirea. În Dos orice potrivire a unui nume de fişier cu o expresie ce conţine caracterele * şi ? este extinsă cu bancuri la opt caractere pentru nume şi trei caractere pentru extensie.

În Unix, nici o expresie nu identifică fişierul. În prima există caracterul 'z' în plus, iar în a două extensia ar trebui să fie formată din trei caractere.

3.3. Se consideră că se doreşte actualizarea unui fişier cu date furnizate de un alt utilizator care nu are permisiunea de acces direct la acel fişier. Situaţia aceasta este reprezentată schematic prin desenul de mai jos:

Programul lui------Program ? --------Datele lui X Y

Care este calea prin care X va avea acces la datele lui Y ?

Calea prin care procesul X reuşeşte să facă actualizarea este printr-un program scris de Y ce rezidă într-un fişier, cu bitul suid poziţionat, inaccesibil utilizatorului dacă acesta nu este în execuţie.
 
 

4. Probleme propuse

4.1. Comanda Unix man permite obţinerea de informaţii despre comenzile Unix, diferite apeluri de sistem, utilitare importante. Comanda se apelează având ca argument numele comenzii despre care se solicită informaţii. Utilizând comanda obţineţi informaţii suplimentare despre comenzile ls, echo, cat şi chmod.

4.2. Ce realizează comenzile ?
 
ls -l ? 

ls a*b 

ls -li 
 

ls [a-z]*[!0-9] 

ls *[!o] 

ln unu doi 
 

Să se explice rezultatele obţinute.

4.3. Să se parcurgă arborele sistemului de fişiere şi să se identifice directoarele cu comenzile, cu dispozitivele periferice, cu fişiere temporare, etc.

4.4. Să se vizualizeze conţinutul unui director folosind comanda ls -l. Să se identifice informaţiile din i-node. Utilizând comanda chmod să se modifice drepturile de acces ale unui fişier executabil şi ale unui director arbitrar din structura sistemului de fişiere. Să se explice rezultatul comenzilor.

4.5. Să se tragă concluziile despre modul în care pot fi utilizate drepturile de acces pentru a permite utilizarea fişierelor în cadrul grupurilor de utilizatori.

4.6. Care este deosebirea între un director DOS şi unul UNIX ?

4.7. Ce se poate spune despre interpretarea caracterelor * şi ? în Unix. Explicaţi diferenţele.

4.8. Directorul /tmp este un exemplu în care bitul sticky poate fi utilizat. În acest director toată lumea are drepturi depline. În ce mod este util acest bit ?

4.9. Parola într-un sistem cu mai mulţi utilizatori se schimbă des pentru siguranţa datelor. Fiecare dintre utilizatori poate să-şi schimbe singur parola folosind comanda passwd. Parola este păstrata într-un fişier comun tuturor utilizatorilor, care practic este modificat de fiecare utilizator care îşi schimba propria parola. Cu toate că toţi utilizatorii au acces la acest fişier ei pot să-şi modifice doar parola proprie. Să se explice cum este realizat acest lucru.

4.10. Din cele discutate în lucrare, s-ar părea că dacă se copiază fişierul sh în directorul propriu, devenim proprietarul copiei. Dacă se foloseşte comanda chmod se poziţionează bitul suid, iar prin comanda chown se modifică proprietarul la root. Executând acum copia vom deţine privilegiul de a fi root. Acest lucru nu se produce, deci care este greşeala în raţionament ?