Înțelegerea permisiunilor UNIX și a tipurilor de fișiere

Niciodată nu am reușit cum a funcționat chmod până astăzi. Am urmat un tutorial care mi-a explicat foarte mult.

De exemplu, am „citit că ai” trei grupuri diferite de permisiuni:

  • proprietar (u)
  • grup (g)
  • toată lumea (o)

Pe baza acestor trei grupuri, știu acum că:

  • Dacă fișierul este deținut de utilizator, permisiunile utilizatorului determină accesul .
  • Dacă grupul fișierului este același cu grupul utilizatorului, permisiunea de grup determină accesul.
  • Dacă utilizatorul nu este proprietarul fișierului și nu este în grup, apoi se folosește cealaltă permisiune.

De asemenea, am aflat că aveți următoarele permisiuni:

  • citit (r)
  • scrie (w)
  • executa ()

Am creat un director pentru a testa cunoștințele pe care le-am dobândit recent:

mkdir test 

Apoi Am făcut câteva teste:

chmod u+rwx test/ # drwx------ chmod g+rx test/ # drwxr-x--- chmod u-x test/ # drw-r-x--- 

După ce am păcălit ceva timp, cred că am primit în cele din urmă blocajul chmod și modul în care setați permisiunea folosind această comandă.


Dar …

Am încă câteva întrebări:

  • Ce înseamnă d de la start reprezintă?
  • Care este numele și utilizarea slotului care conține și ce alte valori poate deține?
  • Cum îl pot seta și anula?
  • Care este valoarea pentru acest d? (Deoarece aveți doar 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • De ce utilizează uneori oamenii 0777 în loc de 777 pentru a-și seta permisiunile?

Dar, deoarece nu ar trebui să pun mai multe întrebări, voi încerca să le pun în o întrebare.

În sistemul bazat pe UNIX, cum ar fi toate distribuțiile Linux, cu privire la permisiuni, ce înseamnă prima parte (d) și ce înseamnă folosiți pentru această parte a permisiunilor?

Comentarii

  • Vă rugăm să vă rugăm data viitoare să puneți o singură întrebare, mai multe întrebări sunt de obicei rele pentru referință și aproape nu mi-am adresat-o niciodată în același timp.
  • @Kiwy Îmi pare rău, ‘ îmi pare rău, am crezut că ‘ așa, deoarece se referă la același subiect. Dacă doriți, puteți sugera un titlu mai bun pentru întrebarea mea pentru a-l îmbunătăți ‘ referința.
  • De altfel, valoarea pentru ” d ” este 040000 – poate fi găsit în fișierele antet sub numele S_IFDIR. Nu ‘ nu îl utilizați atunci când setați modul fișier, dar funcția stat() returnează de fapt valoarea 040750 pentru drwxr-x---.
  • @jamesqf De fapt, acum, când înțeleg cum se mapează codurile octale, este ‘ mai simplu pentru mine să mă gândesc la acest mod .
  • @Peter: nu există întrebări stupide – doar proștii care nu ‘ nu învață pentru că ‘ re frică să întreb.

Răspuns

Voi răspunde la întrebări în trei părți: tipuri de fișiere, permisiuni, și cazuri de utilizare pentru diferitele forme de chmod.

Tipuri de fișiere

Primul caracter din ls -l output reprezintă tipul de fișier; d înseamnă că este un director. Nu poate fi setat sau dezactivat, depinde de modul în care a fost creat fișierul. Puteți găsi lista completă a tipurilor de fișiere în ls documentație ; cele pe care probabil le veți întâlni sunt

  • -: fișier „obișnuit”, creat cu orice program care poate scrie un fișier
  • b: blocarea fișierului special, de obicei dispozitive de disc sau partiție, poate fi creată cu mknod
  • c: fișier special pentru caractere, poate fi creat și cu mknod (pentru exemple, consultați /dev)
  • d: director, poate fi creat cu mkdir
  • l: link simbolic, poate fi creat cu ln -s
  • p: denumit pipe, poate fi creat cu mkfifo
  • s: socket, poate fi creat cu nc -U
  • D: ușă , creat de unele procese de server pe Solaris / openindiana.

Permisiuni

chmod 0777 este folosit pentru a seta toate permisiunile într-o singură execuție chmod, mai degrabă decât combinarea modificărilor cu u+ etc.Fiecare dintre cele patru cifre este o valoare octală care reprezintă un set de permisiuni:

  • suid, sgid și „lipicios” (vezi mai jos)
  • permisiuni de utilizator
  • permisiuni de grup
  • „alte” permisiuni

Octal valoarea este calculată ca suma permisiunilor:

  • „citire” este 4
  • „scriere” este 2
  • „executare” este 1

Pentru prima cifră:

  • suid este 4; binarele cu acest set de biți rulează ca utilizator proprietar (de obicei root)
  • sgid este 2; binare cu acest set de biți rulează ca grup de proprietar (acesta a fost folosit pentru jocuri, astfel încât scorurile mari ar putea fi partajate, dar este adesea un risc de securitate atunci când este combinat cu vulnerabilități în jocuri), iar fișierele create în directoarele cu acest set de biți aparțin grupul de proprietari al directorului în mod implicit (acest lucru este util pentru crearea de foldere partajate)
  • „lipicios” (sau „ștergere restricționată”) este 1; fișierele din directoarele cu acest set de biți pot fi șterse doar de proprietarul lor, de proprietarul directorului sau de root (consultați /tmp pentru un exemplu comun din aceasta).

Consultați pagina de manual chmod pentru detalii. Rețineți că, în toate acestea, ignor alte caracteristici de securitate care pot modifica permisiunile utilizatorilor pentru fișiere (SELinux, fișiere ACL …).

Biții speciali sunt tratați diferit în funcție de tipul de fișier (regulat fișier sau director) și sistemul de bază. (Acest lucru este menționat în chmod pagina de manual.) Pe sistemul pe care l-am testat (cu coreutils 8.23 pe un ext4 sistem de fișiere, care rulează nucleul Linux 3.16.7-ckt2), comportamentul este după cum urmează. Pentru un fișier, biții speciali sunt întotdeauna șterse, cu excepția cazului în care este setat în mod explicit, astfel încât chmod 0777 este echivalent cu chmod 777 și ambele comenzi șterg biții speciali și acordați tuturor permisiunile complete asupra fișierului. Pentru un director, biții speciali nu sunt niciodată complet șterse utilizând forma numerică din patru cifre, deci, de fapt, chmod 0777 este, de asemenea, echivalent cu chmod 777 dar este înșelător, deoarece unele dintre biții speciali vor rămâne așa cum este. (O versiune anterioară a acestui răspuns a greșit acest lucru.) Pentru a șterge biți speciali din directoare, trebuie să utilizați u-s, g-s și / sau o-t în mod explicit sau specificați o valoare numerică negativă, astfel încât chmod -7000 va șterge toți biții speciali dintr-un director.

În ieșirea ls -l, suid, sgid și „lipicios” apar în locul x intrare: suid este s sau S în loc de x al utilizatorului, sgid este s sau S în loc de x al grupului, iar„ lipicios ”este t sau T în locul celorlalți x. O literă minusculă indică faptul că atât bitul special cât și bitul executabil sunt setate; o literă majusculă indică faptul că este setat doar bitul special.

Diferitele forme de chmod

Datorită comportamentului descris mai sus, folosind cele patru cifre complete din poate fi confuz (cel puțin se pare că am fost confuz). Este util atunci când doriți să setați biți speciali, precum și biți de permisiune; în caz contrar, biții sunt șterși dacă manipulați un fișier, păstrați dacă manipulați un director. Deci, chmod 2750 vă asigură că veți obține cel puțin sgid și exact u=rwx,g=rx,o=; dar chmod 0750 nu va șterge neapărat biții speciali.

Utilizarea modurilor numerice în loc de comenzi text ([ugo][=+-][rwxXst]) este probabil mai mult un caz de obișnuință și scopul comenzii. Odată ce sunteți obișnuiți să utilizați modurile numerice, este adesea mai ușor să specificați doar modul complet în acest fel; și este util să vă puteți gândi la permisiuni folosind moduri numerice, deoarece multe alte comenzi le pot folosi (install, mknod … ).

Unele variante de text pot fi utile: dacă doriți pur și simplu să vă asigurați că un fișier poate fi executat de oricine, chmod a+x va face acest lucru, indiferent de ce celelalte permisiuni sunt. La fel, +X adaugă permisiunea de executare numai dacă una dintre permisiunile de executare este deja setată sau fișierul este un director; acest lucru poate fi la îndemână pentru restabilirea permisiunilor la nivel global, fără a fi nevoie să folosiți fișiere cu majuscule v. Astfel, chmod -R ug=rX,u+w,o= este echivalent cu aplicarea chmod -R 750 tuturor directoarelor și fișierelor executabile și chmod -R 640 toate celelalte fișiere.

Comentarii

  • Deși celelalte răspunsuri au fost destul de bune, chiar ați petrecut ceva timp răspunzând la această întrebare. Vă mulțumim.
  • În directoare * BSD se comportă ca și cum bitul lor sgid ar fi fost întotdeauna setat, indiferent de valoarea sa reală. Pe FreeBSD, bitul suid poate fi configurat pentru a acționa în mod analog cu sgid (adică fișierele și subdirectoarele create în interior vor avea același proprietar ca directorul ), cu condiția ca sistemul de fișiere suport să suporte acest lucru și să fie montat cu opțiunea suiddir.
  • +X adaugă permisiunea de executare numai dacă una dintre permisiunile de executare este deja setată sau fișierul este un director ” mulțumesc @ stephen-kitt care lipsește ” este deja setat ” documentația mă arunca într-adevăr pentru o buclă!

Răspuns

Deci, permisiunile în Linux sunt foarte importante. Voi încerca să fac o scurtă explicație.

Pentru bucăți dintr-un mod de fișier

Fiecare fișier Unix are un set de permisiuni care determină dacă puteți citi, scrie sau rula fișierul. Rularea ls -l afișează permisiunile. Iată un exemplu de astfel de afișare:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile 

Atasez o imagine a pieselor unui mod de fișier:

introduceți descrierea imaginii aici

Tipul poate fi altceva. De exemplu:

  • d (director)
  • c (dispozitiv cu caractere)
  • l (link simbolic)
  • p (numit pipe)
  • s (soclu)
  • b (blocare dispozitiv)
  • D (ușă, neobișnuită pe sistemele Linux, dar a fost portată) >

Dacă doriți să setați câteva permisiuni pentru tot directorul, puteți utiliza atributul R, de exemplu:

chmod -R 777 /some/directory/ 

Pentru chmod 777 vs 0777

Comanda chmod de obicei așteaptă intrarea pentru a fi un număr octal, zero-ul principal se referă la valoarea tripletului de biți lipicios / sgid / suid. Cu toate acestea, în C ar face diferența, deoarece 777 ar fi tradus în 01411 (octal), setând astfel bitul lipicios (vezi pagina de manual chmod(2)), citiți permisiunile pentru proprietar și bitul executabil pentru grup și altele (care este o combinație destul de ciudată).

EDITARE 1

Am găsit altă imagine despre permisiunile Linux și voi atașa pentru a înțelege mai ușor: Permisiuni de fișiere UNIX

Comentarii

  • Te înșeli cu privire la 777 față de 0777. Ambele sunt octale (zecimalul nu are sens oricum în în acest caz), dar în formă de patru caractere, prima cifră setează biții speciali (lipicios & setuid).
  • @orion Ocazional, de fapt este adevărat, de exemplu într-un cod de tip C chmod(777) ar fi de fapt echivalentul executării chmod 1411 (adică chmod comandă cu argument 1411).
  • … care în cazul syscall (sau învelișului său) și al binarului care poartă același nume pot fi un pic confuz.
  • Python Master Race a rezolvat această problemă inversă interzicând toate ” numerele ” care încep cu 0 , forțând utilizatorul să fie explicit dacă dorește altceva decât zecimal, de ex hex: 0x1FF, binar: 0b111111111 sau octal: 0o777. PUTEREA PITONULUI
  • Sursă imagine?

Răspuns

d înseamnă că este un director, dacă aveți un fișier este - și dacă este un link veți găsi un l. Nu poate fi setat / dezactivat.

Dacă utilizați 0777 ca permisiuni, acordați control complet (citire + scriere + executare) fiecărui utilizator / grup al sistemului. Este un mod leneș de a rezolva probleme când aveți utilizatori / grupuri care nu pot accesa directoare / fișiere.

De exemplu, dacă listați conținutul unui director și obțineți acest lucru:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so este un fișier deținut de rădăcina utilizatorului și rădăcina grupului. Proprietarul are acces la citire și scriere, grupul are acces la citire și orice alt utilizator are acces la citire. Acest lucru poate fi tradus ca 644.

Dacă îl schimb în 777, va arăta astfel:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

Răspuns

După ce am primit răspunsul la întrebarea mea aici și am făcut câteva cercetări despre rezultat, am găsit un articol care explică totul foarte bine. Aș dori să împărtășesc aici câteva părți ale acestui articol pentru referințe viitoare.

Permisiunile de vizualizare

Pentru a utiliza chmod pentru a modifica permisiunile unui fișier sau director, va trebui mai întâi să știți care este actualitatea modul de acces este. Puteți vizualiza conținutul unui director din terminal prin cd la acel director și apoi utilizați:

$ ls -l 

Comutatorul -l este important deoarece utilizarea ls fără acesta va afișa doar numele fișierelor sau folderelor din director.

Mai jos este un exemplu de utilizare a ls -l în directorul meu de acasă:

total 128 drwxr-xr-x 2 peter users 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 peter users 4096 Jul 5 17:37 Documents drwxr-xr-x 2 peter users 4096 Jul 5 13:45 Downloads drwxr-xr-x 2 peter users 4096 Jun 24 03:36 Movies drwxr-xr-x 2 peter users 4096 Jun 24 03:38 Music drwxr-xr-x 2 peter users 4096 Jun 26 00:09 Pictures -rw-r--r-- 1 peter users 354 Jul 6 17:15 chmodtest 

Ce înseamnă coloanele

Prima coloană este tipul fiecărui fișier:

  • - denotă un fișier normal.
  • d denotă un director, adică un folder care conține alte fișiere sau foldere.
  • p denotă o țeavă numită (aka FIFO ).
  • l denotă o legătură simbolică.

Literele de după aceasta sunt permisiunile, această primă coloană este ceea ce cel de-al doilea este cât de multe link-uri există într-un fișier, putem ignorați-l în siguranță. A treia coloană are două valori / nume: Prima (în exemplul meu „peter”) este numele utilizatorului care deține fișierul. A doua valoare („utilizatori” din exemplu) este grupul căruia îi aparține proprietarul (Citiți mai multe despre grupuri).

Următoarea coloană este dimensiunea fișierului sau directorului în octeți și informații după aceea sunt datele și orele pentru care fișierul sau directorul a fost modificat ultima dată și, desigur, numele fișierului sau directorului.

Ce înseamnă permisiunile

Primele trei litere, după prima - sau d, sunt permisiunile proprietarului. Următoarele trei litere sunt permisiuni care se aplică grupului. Ultimele trei litere sunt permisiunile care se aplică tuturor celorlalți.

Fiecare set de trei litere este format din r w și x. r este întotdeauna în prima poziție, w este întotdeauna în a doua poziție și x este întotdeauna în a treia poziție. r este permisiunea de citire, w este permisiunea de scriere și x este executarea permisiune. Dacă există o cratimă (-) în locul uneia dintre aceste scrisori, înseamnă că permisiunea nu este acordată și, dacă scrisoarea este prezentă, aceasta este acordată.

Foldere

În cazul folderelor, biții de mod pot fi interpretați după cum urmează:

  • r (citit) pentru capacitatea de a citi cuprinsul directorului dat,
  • w (write) reprezintă capacitatea de a scrie cuprinsul directorului dat (creați fișiere, foldere noi; redenumiți, ștergeți fișierele, folderele existente) dacă și numai dacă bitul de executare este setat. În caz contrar, această permisiune nu are sens.
  • x (executare) reprezintă capacitatea de a introduce directorul dat cu comanda cd și de a accesa fișiere, foldere din acel director.

Modificarea permisiunilor folosind comanda chmod

chmod este o comandă în Linux și alte sisteme de operare similare Unix. Vă permite să modificați permisiunile (sau modul de acces) ale unui fișier sau director.

Puteți modifica permisiunile în două moduri diferite: – Bazat pe text chmodchmod

Metodă text

Pentru a modifica permisiunile sau modul de acces al unui fișier, folosim comanda chmod în un terminal. Mai jos este structura generală a comenzii:

chmod who=permissions filename 

Unde cine este dintr-o serie de litere și fiecare înseamnă cine îi veți da permisiunea să . Acestea sunt după cum urmează:

u - The user that owns the file. g - The group the file belongs to. o - The other users i.e. everyone else. a - all of the above - use this instead of having to type ugo. 

Permisiunile sunt aceleași ca deja discutate (r, w și x).

Comanda chmod ne permite să adăugăm și să scădem permisiuni dintr-un set existent folosind + sau – of =. Acest lucru este diferit de comenzile de mai sus, care în esență rescriu permisiunile (adică pentru a schimba o permisiune de la r-- la rw- , trebuie totuși să includeți r, precum și w după = în chmod. Dacă ați pierdut r, aceasta va elimina permisiunea r sunt rescrise cu =. Usin g + și – evitați acest lucru adăugând sau eliminând setul curent de permisiuni).

Metoda numerică

chmod poate seta și permisiuni folosind numere.

Utilizarea numerelor este o altă metodă care vă permite să editați în același timp permisiunile pentru toți cei trei proprietari, grup și alte persoane. Această structură de bază a codului este următoarea:

chmod xxx file/directory 

Unde xxx este un număr de 3 cifre în care fiecare cifră poate fi de la 1 la 7. Se aplică prima cifră pentru permisiunile pentru proprietar, a doua cifră se aplică permisiunilor pentru grup, iar a treia cifră se aplică permisiunilor pentru toate celelalte.

În această notație numerică, valorile r, w și x au propriul număr value:

r=4 w=2 x=1 

Pentru a veni cu un număr din trei cifre, trebuie să luați în considerare ce permisiuni doriți să aibă un proprietar, un grup și un utilizator, apoi total valorile lor cresc. De exemplu, să spunem că am vrut să acord proprietarului unui permis de citire-scriere și executare și am vrut să grupez și toți ceilalți să citească și să execute permisiunile. Aș veni cu valorile numerice așa:

Owner: rwx = 4+2+1=7 Group: r-x = 4+0+1=5 (or just 4+1=5) Other: r-x = 4+0+1=5 (or just 4+1=5) Final number = 755 $ chmod 755 filename 

Acesta este echivalentul utilizării următoarelor:

chmod u=rwx filename chmod go=rx filename 

Majoritatea folderelor / directoarelor sunt setate la 755 pentru a permite citirea și scrierea și executarea către proprietar, dar refuză scrierea tuturor celorlalți, iar fișierele sunt în mod normal 644 pentru a permite citirea și scrierea proprietarului, dar doar citirea pentru toți ceilalți, consultați ultima notă despre lipsa permisiunilor x cu fișiere neexecutabile – este aceeași afacere aici.

Comentarii

  • Doar copierea textului dintr-un alt articol este – cel puțin – nepoliticos. Poate și o încălcare a drepturilor de autor. Dacă nu este doar copiat sau ați folosit cu adevărat piese mici (protejate prin drepturi de autor datorită utilizării corecte), vă rugăm să adăugați cel puțin un link la articolul la care faceți referire / citați.

Răspuns

Pentru întrebările d

Acest lucru vă indică tipul de fișier Unix. În mod implicit, Unix are doar 3 tipuri de fișiere. Acestea sunt:

  • - – Fișier obișnuit
  • d – Fișier director
  • Fișier special (cu 5 subtipuri):
    • b – Blocați fișierul
    • c – Fișier dispozitiv de caractere
    • p – Fișier pipă denumit sau doar fișier pipă
    • l – Fișier de legătură simbolică
    • s – Fișier socket

Citiți mai multe aici: Tipurile de fișiere din Linux / Unix explicate în detaliu

0777 vs 777

Bit lipicios specificat sau nu. Când este setat un bit lipicios al unui director, sistemul de fișiere tratează fișierele din astfel de directoare într-un mod special, astfel încât numai proprietarul fișierului, proprietarul directorului sau utilizatorul root poate redenumi sau șterge fișierul. Fără bitul lipicios set, orice utilizator cu permisiuni de scriere și executare pentru director poate redenumi sau șterge fișierele conținute, indiferent de proprietarul fișierului.

0777 setează 777 permisiuni de fișiere , iar bitul lipicios la 0 – fără moduri speciale.

777 setează permisiunile de fișiere 777, fără a modifica bitul lipicios.

Citiți mai multe: bit sticky și chmod

Comentarii

  • Mai bine: dar încă nu oferă nimic din ceea ce celelalte răspunsuri nu au ‘ acoperit deja …
  • ( 1) Există trei tipuri de fișiere de bază: fișiere simple, directoare și orice altceva. Ce? De unde ai asta? În marea schemă de lucruri, fișierele simple și directoarele sunt destul de similare. Țevile denumite și linkurile simbolice seamănă mai mult cu fișierele simple și directoare decât cu fișierele sau soclurile dispozitivului. (2) Credeți că chmod 777 nu șterge setuid, setgid și biți lipicioși? Încercați-l.
  • Unix are 7 tipuri de fișiere, nu 3.

Răspuns

Două lucruri conexe pe care le-am găsit întotdeauna confuze și nu le-am atins mai sus sunt:


I) ce „ 1 ” face:

În chmod : fiecare „1” en permite o permisiune, de ex. chmod 777 ro este capabil de toate, dar acordați atenție deoarece
în umask : fiecare „1” dis permite o permisiune, de exemplu, umask 777 dis este capabil de toate.


II ) fișier „proprietari” vs.fișier „utilizatori” :

Cu alte cuvinte, există utilizatorii care „dețin” și utilizatorii care „folosesc” .

Fiecare fișier este deținut , în același timp, de două entități:

  • un singur utilizator unic și
  • un singur, specific grup (a unuia sau mai multor utilizatori).

Prin urmare, fiecare fișier poate fi utilizat de către un anumit utilizator în trei moduri:

1) Direct, ca utilizator care deține fișier,
2) în direct, ca membru al grupului care deține fișierul și
3 ) eventual, ca altcineva.


În caz contrar , răspunsuri de mai sus, faceți o treabă grozavă! Mulțumesc tuturor.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *