Forståelse av UNIX-tillatelser og filtyper

Jeg har egentlig aldri fått hvordan chmod fungerte frem til i dag. Jeg fulgte en veiledning som forklarte meg mye.

For eksempel har jeg lest at du har tre forskjellige tillatelsesgrupper:

  • eier (u)
  • gruppe (g)
  • alle (o)

Basert på disse tre gruppene vet jeg nå at:

  • Hvis filen eies av brukeren, bestemmer brukertillatelsene tilgangen .
  • Hvis gruppen i filen er den samme som brukerens gruppe, bestemmer gruppetillatelsen tilgangen.
  • Hvis brukeren ikke er fileier, og ikke er i gruppen blir den andre tillatelsen brukt.

Jeg har også lært at du har følgende tillatelser:

  • lest (r)
  • skriv (w)
  • utfør ()

Jeg opprettet en katalog for å teste min nyervervede kunnskap:

mkdir test 

Så Jeg gjorde noen tester:

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

Etter å ha lurt en stund tror jeg at jeg endelig fikk taket på chmod og måten du setter tillatelse på ved hjelp av denne kommandoen.


Men …

Jeg har fortsatt noen spørsmål:

  • Hva gjør d i starten står for?
  • Hva heter navnet og bruken av den inneholder spalten og hvilke andre verdier kan den inneholde?
  • Hvordan kan jeg stille inn og fjerne det?
  • Hva er verdien for denne d? (Da du bare har 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Hvorfor bruker folk noen ganger 0777 i stedet for 777 for å angi tillatelser?

Men som jeg ikke burde stille flere spørsmål, vil jeg prøve å stille det i ett spørsmål.

I UNIX-basert system, som for eksempel alle Linux-distribusjoner, angående tillatelsene, hva står den første delen (d) for og hva er bruk for denne delen av tillatelsene?

Kommentarer

  • Prøv neste gang å stille bare ett spørsmål, flere spørsmål er vanligvis dårlige for referanser og nesten aldri adressert alle samtidig.
  • @Kiwy jeg ‘ m beklager, jeg trodde jeg ‘ jeg gjorde det slik dette fordi det gjelder samme emne. Hvis du vil, kan du foreslå en bedre tittel på spørsmålet mitt for å forbedre det ‘ referanse.
  • Forresten, verdien for » d » er 040000 – det finnes i toppfiler under navnet S_IFDIR. Du bruker ikke ‘ når du stiller inn filmodus, men stat() -funksjonen returnerer faktisk verdien 040750 for drwxr-x---.
  • @jamesqf Egentlig, nå som jeg forstår hvordan de oktale kodene kartlegges, er det ‘ enklere for meg å tenke på den måten .
  • @ Peter: det er ingen dumme spørsmål – bare dumme som ikke ‘ ikke lærer fordi de ‘ redd for å spørre.

Svar

Jeg svarer på spørsmålene dine i tre deler: filtyper, tillatelser, og bruk tilfeller for de ulike formene for chmod.

Filtyper

Det første tegnet i ls -l output representerer filtypen; d betyr at det er en katalog. Det kan ikke settes eller deaktiveres, det kommer an på hvordan filen ble opprettet. Du finner den komplette listen over filtyper i ls-dokumentasjonen ; de du sannsynligvis kommer over er

  • -: “vanlig” fil, opprettet med et hvilket som helst program som kan skrive en fil
  • b: Blokker spesiell fil, vanligvis disk- eller partisjonsenheter, kan opprettes med mknod
  • c: spesiell filfil, kan også opprettes med mknod (se /dev for eksempler)
  • d: katalog, kan opprettes med mkdir
  • l: symbolsk lenke, kan opprettes med ln -s
  • p: navngitt rør, kan opprettes med mkfifo
  • s: socket, kan opprettes med nc -U
  • D: dør , opprettet av noen serverprosesser på Solaris / openindiana.

Tillatelser

chmod 0777 brukes til å angi alle tillatelsene i en chmod -kjøring, i stedet for å kombinere endringer med u+ etc.Hver av de fire sifrene er en oktal verdi som representerer et sett med tillatelser:

  • suid, sgid og «klebrig» (se nedenfor)
  • brukertillatelser
  • gruppetillatelser
  • “andre” tillatelser

Det oktale verdien beregnes som summen av tillatelsene:

  • “read” er 4
  • “write” er 2
  • “execute” er 1

For det første sifferet:

  • suid er 4; binærfiler med dette bitsettet kjøres som eierbruker (vanligvis root)
  • sgid er 2; binærfiler med dette bitsettet kjøres som eiergruppen (dette ble brukt til spill slik at høye score kunne deles, men det er ofte en sikkerhetsrisiko når det kombineres med sårbarheter i spillene), og filer som er opprettet i kataloger med dette bitsettet tilhører katalogens eiergruppe som standard (dette er nyttig for å lage delte mapper)
  • “klebrig” (eller “begrenset sletting”) er 1; filer i kataloger med dette bitsettet kan bare slettes av eieren, katalogens eier, eller root (se /tmp for et vanlig eksempel av dette).

Se chmod manpage for detaljer. Merk at i alt dette ignorerer jeg andre sikkerhetsfunksjoner som kan endre brukernes tillatelse til filer (SELinux, ACL-filer …).

Spesielle biter håndteres forskjellig avhengig av filtype (vanlig fil eller katalog) og det underliggende systemet. (Dette er nevnt i chmod manpage.) På systemet brukte jeg til å teste dette (med coreutils 8.23 på en ext4 filsystem, som kjører Linux-kjernen 3.16.7-ckt2), oppførselen er som følger. For en fil tømmes alltid spesielle biter med mindre de er spesifikt angitt, så chmod 0777 tilsvarer chmod 777, og begge kommandoene tømmer de spesielle bitene og gi alle full tillatelse til filen. For en katalog blir de spesielle bitene aldri fullstendig ryddet med det firesifrede numeriske skjemaet, så i virkeligheten chmod 0777 tilsvarer chmod 777 men det er misvisende siden noen av de spesielle bitene vil forbli som de er. (En tidligere versjon av dette svaret fikk dette feil.) For å fjerne spesielle biter i kataloger må du bruke u-s, g-s og / eller o-t eksplisitt eller spesifiser en negativ numerisk verdi, så chmod -7000 vil tømme alle spesialbitene i en katalog.

I ls -l -utdata vises suid, sgid og «klebrig» i stedet for x oppføring: suid er s eller S i stedet for brukerens x, er sgid s eller S i stedet for gruppens x, og» klebrig «er t eller T i stedet for andres x. En liten bokstav indikerer at både den spesielle biten og den kjørbare biten er satt. en stor bokstav indikerer at bare den spesielle biten er angitt.

De forskjellige formene for chmod

På grunn av oppførselen beskrevet ovenfor, bruker du de fire sifrene i chmod kan være forvirrende (i det minste viser det seg at jeg var forvirret). Det er nyttig når du vil angi spesielle biter og tillatelsesbiter; Ellers fjernes bitene hvis du manipulerer en fil, og bevares hvis du manipulerer en katalog. Så chmod 2750 sørger for at du får minst sgid og nøyaktig u=rwx,g=rx,o=; men chmod 0750 vil ikke nødvendigvis fjerne de spesielle bitene.

Bruk av numeriske moduser i stedet for tekstkommandoer ([ugo][=+-][rwxXst]) er sannsynligvis mer et tilfelle av vane og målet med kommandoen. Når du er vant til å bruke numeriske moduser, er det ofte lettere å bare spesifisere full modus på den måten; og det er nyttig å kunne tenke på tillatelser ved hjelp av numeriske moduser, siden mange andre kommandoer kan bruke dem (install, mknod

Noen tekstvarianter kan komme til nytte: hvis du bare vil sikre at en fil kan kjøres av hvem som helst, vil chmod a+x gjøre det, uansett hva de andre tillatelsene er. På samme måte legger +X bare tillatelsen til å utføre hvis en av utføringstillatelsene allerede er angitt eller filen er en katalog; Dette kan være nyttig for å gjenopprette tillatelser globalt uten å måtte spesielle saksfiler v. kataloger. Dermed tilsvarer chmod -R ug=rX,u+w,o= chmod -R 750 på alle kataloger og kjørbare filer og chmod -R 640 til alle andre filer.

Kommentarer

  • Selv om de andre svarene var ganske bra, brukte du virkelig tid på å svare på dette spørsmålet. Takk.
  • På * BSD-kataloger oppfører seg som om deres sgid bit alltid var satt, uavhengig av den faktiske verdien. På FreeBSD kan suid bit konfigureres til å fungere analogt til sgid (dvs. filer og underkataloger som er opprettet inne, vil ha samme eier som katalogen ), forutsatt at det underliggende filsystemet støtter det, og er montert med alternativet suiddir.
  • » +X legger bare til utføringstillatelsen hvis en av utføringstillatelsene allerede er angitt eller filen er en katalog » takk du @ stephen-kitt som mangler » er allerede satt » dokumentasjonen kaster meg virkelig for en løkke!

Svar

Så, tillatelser i Linux er veldig viktige. Jeg vil prøve å gjøre en kort forklaring.

For deler av en filmodus

Hver Unix-fil har et sett med tillatelser som avgjør om du kan lese, skrive eller kjøre filen. Å kjøre ls -l viser tillatelsene. Her er et eksempel på en slik visning:

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

Jeg legger ved et bilde av deler av en filmodus:

skriv inn bildebeskrivelse her

Type kan være en annen ting. For eksempel:

  • d (katalog)
  • c (karakterenhet)
  • l (symlink)
  • p (navngitt pipe)
  • s (socket)
  • b (block device)
  • D (dør, ikke vanlig på Linux-systemer, men har blitt portert)

Hvis du vil angi noen tillatelser for alle kataloger, kan du bruke R-attributt, for eksempel:

chmod -R 777 /some/directory/ 

For chmod 777 vs 0777

chmod -kommandoen forventer vanligvis inngangen for å være et oktaltall, refererer det ledende null til verdien av den klebrige / sgid / suid bit-tripletten. I C ville det imidlertid gjøre en forskjell, siden 777 ville bli oversatt til 01411 (oktalt), og dermed sette den klissete biten (se chmod(2) man-siden), lesetillatelser for eier og kjørbar bit for gruppe og andre (som er en ganske merkelig kombinasjon).

EDIT 1

Jeg fant et annet bilde om Linux-tillatelser, og jeg vil legge ved for å forstå det lettere: UNIX-filtillatelser

Kommentarer

  • Du tar feil med 777 vs 0777. Begge er oktale (desimal gir ingen mening uansett i dette tilfellet), men i fire tegn, setter det første sifferet de spesielle bitene (klissete & setuid).
  • @orion Noen ganger er det faktisk sant, f.eks i en C-lignende kode chmod(777) ville faktisk være ekvivalent med å kjøre chmod 1411 (dvs. chmod kommando med argument 1411).
  • … som i tilfelle syscall (eller innpakningen) og binær med samme navn kan være litt forvirrende.
  • Python Master Race løste dette baklengs problemet ved å forby alle » tall » som starter med 0 , tvinger brukeren til å være eksplisitt hvis de vil ha noe annet enn desimal, f.eks hex: 0x1FF, binært: 0b111111111 eller oktalt: 0o777. PYTHON POWER
  • Bildekilde?

Svar

d betyr at det er en katalog, hvis du har en fil er den - og hvis det er en lenke, finner du en l. Det kan ikke settes / deaktiveres.

Hvis du bruker 0777 som tillatelse, gir du full kontroll (lese + skrive + utføre) til hver bruker / gruppe i systemet. Det er en lat måte å løse problemer når du har brukere / grupper som ikke kan få tilgang til kataloger / filer.

Hvis du for eksempel viser innholdet i en katalog og får dette:

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

preloadable_libintl.so er en fil som eies av brukerrot og grupperot. eieren har lese- og skrivetilgang, gruppen har bare lesetilgang og enhver annen bruker har lesetilgang. Dette kan oversettes som 644.

Hvis jeg endrer det til 777, vil det se slik ut:

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

Svar

Etter å ha fått svaret på spørsmålet mitt her og forsket på resultatet fant jeg en artikkel som forklarer det hele veldig bra. Jeg vil gjerne dele noen deler av denne artikkelen her for fremtidige referanser.

Visningstillatelser

For å bruke chmod for å endre tillatelsene til en fil eller katalog, må du først vite hva gjeldende tilgangsmodus er. Du kan se innholdet i en katalog i terminalen ved å cd til den katalogen og deretter bruke:

$ ls -l 

-l -bryteren er viktig fordi du bruker ls uten at den bare viser navnene på filer eller mapper i katalogen.

Nedenfor er et eksempel på bruk av ls -l i hjemmekatalogen min:

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 

Hva kolonnene betyr

Den første kolonnen er typen for hver fil:

  • - angir en normal fil.
  • d betegner en katalog, dvs. en mappe som inneholder andre filer eller mapper.
  • p betegner et navngitt rør (aka FIFO
  • l angir en symbolsk lenke.

Bokstavene etter det er tillatelsene, denne første kolonnen er det vi vil være mest interessert i. Den andre er hvor mange lenker det er i en fil, det kan vi ignorere det trygt. Den tredje kolonnen har to verdier / navn: Den første (i mitt eksempel «peter») er navnet på brukeren som eier filen. Den andre verdien («brukere» i eksemplet) er gruppen som eieren tilhører (Les mer om grupper).

Den neste kolonnen er størrelsen på filen eller katalogen i byte og informasjon etter det er datoene og tidspunktene filen eller katalogen sist ble endret, og selvfølgelig navnet på filen eller katalogen.

Hva tillatelsene betyr

De tre første bokstavene, etter de første - eller d, er tillatelsene eieren har. De neste tre bokstavene er tillatelser som gjelder for gruppen. De siste tre bokstavene er tillatelsene som gjelder for alle andre.

Hvert sett med tre bokstaver består av r w og x. r er alltid i første posisjon, w er alltid i andre posisjon, og x er alltid i tredje posisjon. r er lesetillatelsen, w er skrivetillatelsen, og x er utførelsen tillatelse. Hvis det er bindestrek (-) i stedet for en av disse bokstavene, betyr det at tillatelsen ikke er gitt, og hvis brevet er tilstede, blir den gitt.

Mapper

I tilfelle mapper kan modusbittene tolkes som følger:

  • r (les) står for evnen til å lese innholdsfortegnelsen i den gitte katalogen,
  • w (skriv) står for muligheten til å skrive innholdsfortegnelsen i den gitte katalogen (opprett nye filer, mapper; gi nytt navn, slett eksisterende filer, mapper) hvis og bare hvis kjør bit er satt. Ellers er denne tillatelsen meningsløs.
  • x (execute) står for muligheten til å gå inn i den gitte katalogen med kommandocd og få tilgang til filer, mapper i den katalogen.

Endring av tillatelser ved hjelp av chmod-kommandoen

chmod er en kommando i Linux og andre Unix-lignende operativsystemer. Den lar deg endre tillatelsene (eller tilgangsmodusen) til en fil eller katalog.

Du kan endre tillatelsene på to forskjellige måter: – Tekstbasert chmod – Nummerbasert chmod

Tekstmetode

For å endre tillatelses- eller tilgangsmodus til en fil, bruker vi chmod-kommandoen i en terminal. Nedenfor er kommandoen «generell struktur:

chmod who=permissions filename 

Hvor Hvem er noen fra en rekke bokstaver, og hver betyr hvem du skal gi tillatelse til Disse er som følger:

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. 

Tillatelsene er de samme som allerede diskutert (r, w, og x).

chmod-kommandoen lar oss legge til og trekke tillatelser fra et eksisterende sett ved hjelp av + eller – i stedet av =. Dette er forskjellig fra de ovennevnte kommandoene, som i hovedsak skriver om tillatelsene (dvs. for å endre en tillatelse fra r-- til rw- , må du fortsatt ta med r samt w etter = i chmod kommando. Hvis du savnet r, ville det tatt bort r tillatelse når de blir omskrevet med =. Usin g + og – unngå dette ved å legge til eller ta bort gjeldende sett med tillatelser).

Tallmetode

chmod kan også angi tillatelser ved hjelp av tall.

Å bruke tall er en annen metode som lar deg redigere tillatelsene for alle de tre eierne, gruppene og andre samtidig. Denne grunnleggende strukturen i koden er denne:

chmod xxx file/directory 

Hvor xxx er et tresifret nummer der hvert siffer kan være alt fra 1 til 7. Det første sifferet gjelder for tillatelser for eier, det andre sifferet gjelder tillatelser for gruppen, og det tredje sifferet gjelder tillatelser for alle andre.

I denne nummernotasjonen har verdiene r, w og x sitt eget nummer verdi:

r=4 w=2 x=1 

For å komme med et tresifret nummer må du vurdere hvilke tillatelser du vil at en eier, gruppe og bruker skal ha, og deretter totalt verdiene deres opp. For eksempel si at jeg ønsket å gi eieren av en katalog lese- og gjennomføringstillatelser, og jeg ønsket å gruppere og alle andre for å bare ha lest og utført tillatelser. Jeg vil komme med de numeriske verdiene slik:

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 

Dette tilsvarer å bruke følgende:

chmod u=rwx filename chmod go=rx filename 

De fleste mapper / kataloger er satt til 755 for å tillate lesing og skriving og utførelse til eieren, men nekter å skrive til alle andre, og filene er normalt 644 for å tillate lesing og skriving for eieren, men bare lesing For alle andre, se den siste merknaden om mangelen på x-tillatelser med ikke-kjørbare filer – det er den samme avtalen her.

Kommentarer

  • Bare å kopiere tekst fra en annen artikkel er – i det minste – frekk. Kanskje også et brudd på copyright. Hvis det ikke bare kopieres eller du virkelig brukte små deler (opphavsrettsvennlig takket være rettferdig bruk), kan du i det minste legge til en lenke til artikkelen du refererer til / siterer.

Svar

For d-spørsmålene

Dette forteller deg Unix-filtypen. Som standard har Unix bare 3 typer filer. De er:

  • - – Vanlig fil
  • d – Katalogfil
  • Spesiell fil (med 5 undertyper):
    • b – Blokkér fil
    • c – Tegnenhetsfil
    • p – Navngitt rørfil eller bare rørfil
    • l – Symbolsk koblingsfil
    • s – Socket-fil

Les mer her: Filtyper i Linux / Unix forklart i detalj

0777 vs 777

Sticky bit spesifisert eller ikke. Når en katalog er satt inn, behandler filsystemet filene i slike kataloger på en spesiell måte, slik at bare filens eier, katalogens eier eller rotbrukeren kan gi nytt navn eller slette filen. Uten den klissete biten angitt, kan enhver bruker med skrive- og utføre tillatelser for katalogen gi nytt navn eller slette filer som finnes, uavhengig av filens eier.

0777 angir 777 filtillatelser , og den klissete biten til 0 – ingen spesielle moduser.

777 angir 777 filtillatelser uten å endre den klissete biten.

Les mer: sticky bit og chmod

Kommentarer

  • Bedre: men det gir fortsatt ingenting som de andre svarene ikke har ‘ t allerede dekket …
  • ( 1) Det er tre grunnleggende filtyper: vanlige filer, kataloger og alt annet. Hva? Hvor får du dette? I den store ordningen med ting er vanlige filer og kataloger ganske like. Navngitte rør og symbolske lenker er mer som vanlige filer og kataloger enn de er som enhetsfiler eller stikkontakter. (2) Tror du chmod 777 ikke tømmer setuid, setgid og klebrig biter? Prøv det.
  • Unix har 7 filtyper, ikke 3.

Svar

To relaterte ting jeg alltid har funnet forvirrende, og ikke er berørt over, er:


I) hva en « 1 » gjør:

I chmod : hver «1» no ables en tillatelse, f.eks chmod 777 no kan alle, men vær oppmerksom fordi
i umask : hver «1» dis avviser tillatelse, f.eks. umask 777 dis kan alle.


II ) fil «eiere» vs.fil «brukere» :

Med andre ord er det brukere som «eier» , og brukere som «bruker» .

Hver fil er eid samtidig av to enheter:

  • en enkelt, spesifikk bruker , og
  • en enkelt, spesifikk gruppe (av en eller flere brukere).

Derfor kan hver fil være brukt av en bestemt bruker på tre måter:

1) Direkte, som brukeren som eier fil,
2) i direkte, som medlem av gruppen som eier filen, og
3 ) muligens som noen andre.


Ellers , svarene ovenfor, gjør en god jobb! Takk til alle.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *