Sari la conținut

chmod

De la Wikipedia, enciclopedia liberă
Chmod
Image
Autor inițialLaboratoarele Bell
DezvoltatorDiverși dezvoltatori open-source și comercial
Versiune inițială3 noiembrie 1971; acum 54 ani, 7 luni și 21 zile (1971-11-03)
Scris înPlan 9: C
Sistem de operareUnix, Unix-like, Plan 9, Inferno, IBM i
PlatformăCross-platform
TipCommand
Licențăcoreutils: GPLv3
Plan 9: MIT License
Prezență online

chmod este o comandă shell pentru modificarea permisiunilor de acces și a indicatorilor de mod special pentru fișiere, inclusiv fișiere speciale, cum ar fi directoarele. Numele este o prescurtare de la „change mod”, unde „mod” se referă la permisiuni și indicatori în sens colectiv.[1]

Comanda își are originea în AT&T Unix versiunea 1 și a fost folosită inițial doar pe sistemele de operare Unix și de tip Unix, până când a fost portată pe alte sisteme, precum Windows (prin UnxUtils)[2] și IBM i.[3]

În sistemele de operare Unix și de tip Unix, o comandă de sistem cu același nume oferă acces la datele de control al accesului. Comanda expune capacitățile apelului de sistem către utilizatorul shell.

Pe măsură ce a crescut nevoia de permisiuni mai avansate pentru sistemele de fișiere, listele de control al accesului[4] au fost adăugate la multe sisteme de fișiere pentru a extinde modurile controlate prin chmod.

Implementarea chmod inclusă în GNU coreutils a fost scrisă de David MacKenzie și Jim Meyering.[5]

Deși sintaxa comenzii variază oarecum în funcție de implementare, aceasta acceptă în general fie o singură valoare octală, care specifică toți biții de mod ai fiecărui fișier, fie o listă de specificatori simbolici separați prin virgulă, care descriu cum se modifică biții de mod existenți. Argumentele rămase sunt o listă de căi către fișierele care urmează să fie modificate.[6]

Modificarea permisiunilor este permisă doar superutilizatorului și proprietarului unui fișier.

Dacă este specificată o legătură simbolică, biții de mod ai țintei sunt ajustați. Permisiunile asociate direct cu intrarea din sistemul de fișiere reprezentată de legătura simbolică nu sunt, de obicei, utilizate.

Opțiunile din linia de comandă pot include:

  • -R: recursiv; include fișierele și subdirectoarele conținute în directoarele specificate
  • -v: mod detaliat; afișează numele fișierelor modificate

Notație octală

[modificare | modificare sursă]

Atunci când primește un argument numeric pentru permisiuni, comanda chmod îl tratează ca pe un număr octal[7] și înlocuiește toți biții de mod pentru fiecare fișier. Deși sunt specificate patru cifre, cifra 0 din față poate fi omisă.

Există doisprezece biți standard de mod: trei biți speciali (setuid, setgid și sticky) și trei grupuri de permisiuni pentru utilizator, grup și alții, fiecare cu câte 3 biți: citire, scriere și execuție. Fiecare bit acordă acces dacă este setat și îl refuză dacă este șters.

Deoarece o cifră octală reprezintă 3 biți, cei doisprezece biți de mod pot fi reprezentați prin patru cifre octale. chmod acceptă până la patru cifre și folosește 0 pentru cifrele din stânga nespecificate. În practică, de obicei se folosesc trei cifre, deoarece modurile speciale sunt rareori utilizate, iar clasa utilizatorului este de obicei specificată.

În contextul unei cifre octale, valorile sunt: citire = 4, scriere = 2, execuție = 1. Tabelul următor leagă valorile octale de permisiunile corespunzătoare.

Permisiune cifră octală
# biți rwx operațiuni acordate
7 4 + 2 + 1 rwx citire, scriere și execuție
6 4 + 2 rw- citire și scriere
5 4 + 1 r-x citire și execuție
4 4 r-- doar citire
3 2 + 1 -wx scriere și execuție
2 2 -w- doar scriere
1 1 --x doar execuție
0 --- niciuna

Comanda stat poate raporta permisiunile unui fișier în notație octală. De exemplu:

$ stat -c %a findPhoneNumbers.sh
754

Valoarea 754 indică următoarele permisiuni:

  • clasa utilizator: citire, scriere și execuție; 7 = 4 + 2 + 1
  • clasa grup: citire și execuție; 5 = 4 + 1
  • alte clase: doar citire; 4

Un cod permite execuția dacă și numai dacă este impar (1, 3, 5 sau 7). Un cod permite citirea dacă și numai dacă este mai mare sau egal cu 4 (4, 5, 6 sau 7). Un cod permite scrierea dacă și numai dacă este 2, 3, 6 sau 7.

Notație simbolică

[modificare | modificare sursă]

Comanda chmod acceptă notație simbolică pentru modificarea permisiunilor existente.[8] Comanda acceptă o listă de specificatori separați prin virgulă, de forma:

[clase]+|-|= operații

Clasele mapate către permisiuni sunt următoarele. Un specificator de modificare poate selecta o clasă prin simbolul acesteia, mai multe clase prin concatenarea simbolurilor fără delimitator sau toate clasele fără a specifica un simbol. Când se folosește ultima metodă, biții măștii umask rămân neschimbați.[9]

Specificatori de clasă
simbol descriere
u utilizator: proprietarul fișierului
g grup: membrii grupului fișierului
o alții: utilizatori care nu sunt nici proprietarul fișierului, nici membri ai grupului fișierului
a toate cele trei clase; echivalent cu ugo

Întrucât proprietatea este esențială pentru controlul accesului și, fiindcă notația simbolică folosește abrevierea „o”, unii cred în mod eronat că aceasta înseamnă „owner”, când, de fapt, înseamnă „others”.

Operatorii de modificare sunt:

Operatori
simbol descriere
+ adaugă operațiuni
- elimină operațiuni
= setează câmpul complet de operațiuni; acordă operațiunile specificate și le elimină pe celelalte

Operațiunile pot fi specificate astfel:

Specificatori de operațiuni
simbol descriere
r citește un fișier obișnuit sau afișează conținutul unui director
w scrie într-un fișier
x execută un fișier obișnuit sau parcurge un arbore de directoare
X execuție specială: aplică execuția directoarelor și fișierelor care au deja cel puțin o permisiune de execuție acordată; util mai ales cu + și, de obicei, împreună cu -R
s mod setuid sau setgid
t sticky mode

Majoritatea implementărilor chmod suportă specificarea modurilor speciale în octal, dar unele nu o fac, ceea ce necesită notația simbolică.

Comanda ls poate raporta permisiunile fișierelor într-o notație simbolică similară cu cea folosită de chmod. ls -l afișează permisiunile prin 10 caractere. Primul indică tipul intrării din sistemul de fișiere, cum ar fi cratimă pentru fișier obișnuit și „d” pentru director. Urmează trei grupuri de câte trei litere care indică permisiunile de citire, scriere și execuție pentru utilizator, grup și alții. Fiecare poziție este fie o cratimă, dacă permisiunea lipsește, fie litera corespunzătoare, dacă este acordată.

De exemplu:

$ ls -l findPhoneNumbers.sh
-rwxr-xr--  1 dgerman  staff  823 Dec 16 15:03 findPhoneNumbers.sh

Specificatorul -rwxr-xr-- începe cu o cratimă, ceea ce indică faptul că findPhoneNumbers.sh este un fișier obișnuit, nu un director. Următoarele trei litere rwx arată că fișierul poate fi citit, scris și executat de utilizatorul proprietar dgerman. Următoarele trei litere r-x arată că fișierul poate fi citit și executat de membrii grupului staff. Ultimele trei litere r-- arată că fișierul este doar pentru citire pentru ceilalți utilizatori.

Adăugați permisiunea de scriere pentru clasa de grup a unui director, permițând utilizatorilor din același grup să adauge fișiere:

$ ls -ld dir # înainte
drwxr-xr-x   2 jsmitt  northregion 96 Apr 8 12:53 shared_dir
$ chmod g+w dir
$ ls -ld dir  # după
drwxrwxr-x   2 jsmitt  northregion 96 Apr 8 12:53 shared_dir

Eliminați permisiunea de scriere pentru toate clasele, împiedicând pe oricine să scrie în fișier:

$ ls -l ourBestReferenceFile
-rw-rw-r--   2 tmiller  northregion 96 Apr 8 12:53 ourBestReferenceFile
$ chmod a-w ourBestReferenceFile
$ ls -l ourBestReferenceFile
-r--r--r--   2 tmiller  northregion 96 Apr 8 12:53 ourBestReferenceFile

Setați permisiunile pentru clasele utilizator și grup doar pentru citire și execuție, fără permisiune de scriere:

$ ls -ld referenceLib
drwxr-----   2 ebowman  northregion 96 Apr 8 12:53 referenceLib
$ chmod ug=rx referenceLib
$ ls -ld referenceLib
dr-xr-x---   2 ebowman  northregion 96 Apr 8 12:53 referenceLib

Activați citirea și scrierea pentru clasa de utilizator, făcând-o în același timp doar pentru citire pentru grup și alții:

$ chmod u=rw,go=r sample
$ ls -ld sample
drw-r--r--   2 oschultz  warehousing       96 Dec  8 12:53 sample

Pentru a seta recursiv accesul pentru directorul docs/ și fișierele conținute în acesta:

chmod -R u+w docs/

Pentru a seta utilizatorul și grupul doar pentru citire și scriere, iar alte persoane doar pentru citire:

chmod 664 file

Pentru a seta utilizatorul doar pentru citire, scriere și execuție, iar grupul și alții doar pentru citire:

chmod 744 file

Pentru a seta sticky bit pe lângă permisiunile utilizatorului, grupului și altora:

chmod 1755 file

Pentru a seta UID-ul pe lângă permisiunile de utilizator, grup și alte permisiuni:

chmod 4755 file

Pentru a seta GID pe lângă permisiunile de utilizator, grup și alte permisiuni:

chmod 2755 file

  1. „Tutorial for chmod”. catcode.com. Arhivat din original la . Accesat în .
  2. „Native Win32 ports of some GNU utilities”. unxutils.sourceforge.net. Arhivat din original la . Accesat în .
  3. IBM. „IBM System i Version 7.2 Programming Qshell” (PDF). IBM (în engleză). Arhivat din original (PDF) la . Accesat în .
  4. „AIX 5.3 System management”. IBM knowledge Center. IBM. Arhivat din original la . Accesat în .
  5. „chmod(1): change file mode bits - Linux man page”. linux.die.net. Arhivat din original la . Accesat în .
  6. „chmod Man Page with examples and calculator - Linux - SS64.com”. ss64.com. Arhivat din original la . Accesat în .
  7. notează că „space delimited” este o caracteristică a shell-ului, nu a comenzii chmod în sine.
  8. „AIX 5.5 Commands Reference”. IBM Knowledge Center. IBM. Arhivat din original la . Accesat în .
  9. „Permissions masking with umask, chmod, 777 octal permissions”. teaching.idallen.com. Arhivat din original la . Accesat în .
  • chgrp — modifică grupul unui fișier
  • chown — schimbă proprietarul unui fișier

Legături externe

[modificare | modificare sursă]