Jag har aldrig riktigt fått reda på hur chmod
fungerade fram till idag. Jag följde en handledning som förklarade en stor sak för mig.
Jag har till exempel läst att du har tre olika behörighetsgrupper:
- ägare (
u
) - grupp (
g
) - alla (
o
)
Baserat på dessa tre grupper vet jag nu att:
- Om filen ägs av användaren bestämmer användarbehörigheterna åtkomsten .
- Om gruppen i filen är densamma som användarens grupp bestämmer gruppbehörigheten åtkomsten.
- Om användaren inte är filägare och inte är i gruppen används det andra tillståndet.
Jag har också lärt mig att du har följande behörigheter:
- läs (
r
) - skriv (
w
) - kör ()
Jag skapade en katalog för att testa min nyförvärvade kunskap:
mkdir test
Sedan Jag gjorde några tester:
chmod u+rwx test/ # drwx------ chmod g+rx test/ # drwxr-x--- chmod u-x test/ # drw-r-x---
Efter att ha lurat en stund tror jag att jag äntligen fick tag på chmod
och hur du ställer in behörighet med det här kommandot.
Men …
Jag har fortfarande några frågor:
- Vad gör
d
i början står för? - Vad heter och använder den innehållande platsen och vilka andra värden kan den innehålla?
- Hur kan jag ställa in och avmarkera det?
- Vad är värdet för denna
d
? (Eftersom du bara har 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1) - Varför använder människor ibland
0777
istället för777
för att ställa in sina behörigheter?
Men eftersom jag inte borde ställa flera frågor, försöker jag ställa det i en fråga.
I UNIX-baserade system som alla Linux-distributioner angående behörigheterna, vad står den första delen (d
) för och vad är det använd för den här delen av behörigheterna?
Kommentarer
Svar
Jag svarar på dina frågor i tre delar: filtyper, behörigheter, och använda fall för de olika formerna av chmod
.
Filtyper
Det första tecknet i ls -l
output representerar filtypen; d
betyder att det är en katalog. Den kan inte ställas in eller av, det beror på hur filen skapades. Du hittar den fullständiga listan över filtyper i ls-dokumentationen ; de du sannolikt kommer att stöta på är
-
-
: ”vanlig” fil, skapad med alla program som kan skriva en fil -
b
: blockera specialfil, vanligtvis disk- eller partitionsenheter, kan skapas medmknod
-
c
: specialfil för tecken, kan också skapas medmknod
(se/dev
för exempel) -
d
: katalog, kan skapas medmkdir
-
l
: symbolisk länk, kan skapas medln -s
-
p
: namnet pipe, kan skapas medmkfifo
-
s
: uttag, kan skapas mednc -U
-
D
: dörr , skapad av vissa serverprocesser på Solaris / openindiana.
Behörigheter
chmod 0777
används för att ställa in alla behörigheter i en chmod
-körning, snarare än att kombinera ändringar med u+
etc.Var och en av de fyra siffrorna är ett oktalt värde som representerar en uppsättning behörigheter:
-
suid
,sgid
och ”klibbig” (se nedan) - användarbehörigheter
- gruppbehörigheter
- ”andra” behörigheter
Den oktala värdet beräknas som summan av behörigheterna:
- ”läs” är 4
- ”skriv” är 2
- ”exekvera” är 1
För den första siffran:
-
suid
är 4; binärer med denna bituppsättning körs som deras ägare (vanligtvisroot
) -
sgid
är 2; binärer med denna bituppsättning körs som deras ägargrupp (detta användes för spel så att höga poäng kunde delas, men det är ofta en säkerhetsrisk i kombination med sårbarheter i spelen), och filer som skapas i kataloger med denna bituppsättning tillhör katalogens ägargrupp som standard (detta är praktiskt för att skapa delade mappar) - “klibbig” (eller “begränsad radering”) är 1; filer i kataloger med denna bituppsättning kan bara raderas av deras ägare, katalogens ägare eller
root
(se/tmp
för ett vanligt exempel av detta).
Se chmod
manpage för mer information. Observera att i allt detta ignorerar jag andra säkerhetsfunktioner som kan ändra användarnas rättigheter för filer (SELinux, ACL-filer …).
Specialbitar hanteras olika beroende på filtyp (vanlig fil eller katalog) och det underliggande systemet. (Detta nämns i chmod
manpage.) På systemet testade jag detta (med coreutils
8.23 på en ext4
filsystem, kör Linux-kärnan 3.16.7-ckt2), beteendet är som följer. För en fil rensas alltid specialbitarna såvida de inte uttryckligen anges, så chmod 0777
motsvarar chmod 777
, och båda kommandona rensar specialbitar och ge alla fullständiga behörigheter för filen. För en katalog rensas specialbitarna aldrig helt med fyrsiffrigt numeriskt formulär, så i själva verket motsvarar chmod 0777
också chmod 777
men det är vilseledande eftersom några av de speciella bitarna kommer att förbli som de är. (En tidigare version av detta svar fick fel.) För att rensa specialbitar i kataloger måste du använda u-s
, g-s
och / eller o-t
eller anger ett negativt numeriskt värde så att chmod -7000
rensar alla specialbitar i en katalog.
I ls -l
-utdata visas suid
, sgid
och ”klibbig” i stället för x
post: suid
är s
eller S
istället för användarens x
är sgid
s
eller S
istället för gruppens x
, och” sticky ”är t
eller T
istället för andras x
. En liten bokstav indikerar att både specialbiten och den körbara biten är inställda; en stor bokstav indikerar att endast den speciella biten är inställd.
De olika formerna av chmod
På grund av det beteende som beskrivs ovan använder du hela fyra siffrorna i chmod
kan vara förvirrande (det visar sig åtminstone att jag var förvirrad). Det är användbart när du vill ställa in både specialbitar och behörighetsbitar. annars rensas bitarna om du manipulerar en fil, bevaras om du manipulerar en katalog. Så chmod 2750
säkerställer att du får minst sgid
och exakt u=rwx,g=rx,o=
; men chmod 0750
raderar inte nödvändigtvis specialbitarna.
Använda numeriska lägen istället för textkommandon ([ugo][=+-][rwxXst]
) är förmodligen mer ett fall av vana och syftet med kommandot. När du väl är van vid att använda numeriska lägen är det ofta lättare att bara ange hela läget på det sättet; och det är användbart att kunna tänka på behörigheter med hjälp av numeriska lägen, eftersom många andra kommandon kan använda dem (install
, mknod
… ).
Vissa textvarianter kan vara till nytta: om du bara vill se till att en fil kan köras av någon, kommer chmod a+x
att göra det, oavsett vad de andra behörigheterna är. På samma sätt lägger +X
till exekveringsbehörigheten endast om en av exekveringsbehörigheterna redan är inställda eller filen är en katalog; detta kan vara praktiskt för att återställa behörigheter globalt utan att behöva specialfiler mot kataloger. chmod -R ug=rX,u+w,o=
motsvarar alltså chmod -R 750
på alla kataloger och körbara filer och chmod -R 640
till alla andra filer.
Kommentarer
- Även om de andra svaren var ganska bra spenderade du verkligen lite tid på att svara på den här frågan. Tack.
- På * BSD-kataloger beter sig som om deras
sgid
-bit alltid var inställd, oavsett dess faktiska värde. På FreeBSD kansuid
-biten konfigureras för att fungera analogt tillsgid
(dvs. filer och underkataloger som skapas inuti kommer att ha samma ägare som katalogen ), förutsatt att det underliggande filsystemet stöder det och är monterat med alternativetsuiddir
. - ”
+X
lägger till exekveringsbehörigheten endast om en av exekveringsbehörigheterna redan är inställd eller filen är en katalog ” tack du @ stephen-kitt saknar ” är redan inställd ” Dokumentationen kastade mig verkligen för en slinga!
Svar
Så, behörigheter i Linux är mycket viktiga. Jag kommer att försöka göra en kort förklaring.
För delar av ett filläge
Varje Unix-fil har en uppsättning behörigheter som avgör om du kan läsa, skriva eller köra filen. Att köra ls -l visar behörigheterna. Här är ett exempel på en sådan skärm:
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Jag bifogar en bild av delar av ett filläge:
Typ kan vara annorlunda. Till exempel:
- d (katalog)
- c (teckenenhet)
- l (symlink)
- p (namngiven rör)
- s (uttag)
- b (blockeringsenhet)
- D (dörr, inte vanligt på Linux-system, men har portats)
Om du vill ställa in några behörigheter för alla kataloger kan du använda R-attribut, till exempel:
chmod -R 777 /some/directory/
För chmod 777 vs 0777
Kommandot chmod
förväntar sig vanligtvis ingången för att vara ett oktalt tal, hänvisar den ledande nollan till värdet på den klibbiga / sgid / suid bit-tripletten. I C skulle det dock göra skillnad, eftersom 777
skulle översättas till 01411
(oktal) och därmed ställa in den klibbiga biten (se chmod(2)
man-sidan), läsbehörigheter för ägare och körbar bit för grupp och andra (vilket är en ganska konstig kombination).
EDIT 1
Jag hittade en annan bild om Linux-behörigheter och jag kommer att bifoga för att förstå lättare:
Kommentarer
- Du har fel när det gäller 777 vs 0777. Båda är oktala (decimal ger ingen mening i alla fall detta fall), men i fyrsiffrig form anger den första siffran specialbitarna (klibbig & setuid).
- @orion Ibland är det faktiskt sant, t.ex i en C-liknande kod
chmod(777)
skulle faktiskt motsvara att körachmod 1411
(dvs.chmod
kommando med argument1411
). - … vilket i fallet med syscall (eller dess omslag) och binär med samma namn kan vara lite förvirrande.
- Python Master Race löste detta bakåtproblem genom att förbjuda alla ” siffror ” som börjar med 0 , tvingar användaren att vara explicit om de vill ha något annat än decimal, t.ex. hex:
0x1FF
, binärt:0b111111111
eller oktalt:0o777
. PYTHON POWER - Bildkälla?
Svar
d
betyder att det är en katalog, om du har en fil är det -
och om det är en länk hittar du en l
. Det kan inte ställas in / av.
Om du använder 0777 som behörighet ger du fullständig kontroll (läs + skriv + kör) till alla användare / grupper i systemet. Det är ett lat sätt att lösa problem när du har användare / grupper som inte kan komma åt kataloger / filer.
Till exempel om du listar innehållet i en katalog och får det här:
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
preloadable_libintl.so är en fil som ägs av användarrot och grupprot. ägaren har läs- och skrivåtkomst, gruppen har endast läsbehörighet och alla andra användare har läsbehörigheter. Detta kan översättas som 644.
Om jag ändrar det till 777 kommer det att se ut så här:
-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so
Svar
Efter att ha fått min fråga besvarad här och undersökt resultatet hittade jag en artikel som förklarar allt mycket bra. Jag skulle vilja dela några delar av den här artikeln här för framtida referenser.
Visningsbehörigheter
För att använda chmod
för att ändra behörigheter för en fil eller katalog, måste du först veta vad den aktuella åtkomstläget är. Du kan visa innehållet i en katalog i terminalen genom att cd
till den katalogen och sedan använda:
$ ls -l
-l
-omkopplaren är viktig eftersom du använder ls
utan att det bara visar namnen på filer eller mappar i katalogen.
Nedan följer ett exempel på att använda ls -l
i min hemkatalog:
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
Vad kolumnerna betyder
Den första kolumnen är typen av varje fil:
-
-
betecknar en normal fil. -
d
betecknar en katalog, dvs. en mapp som innehåller andra filer eller mappar. -
p
betecknar ett namngivet rör (aka FIFO ). -
l
betecknar en symbolisk länk.
Bokstäverna därefter är behörigheterna, den här första kolumnen är vad vi kommer att vara mest intresserade av. Den andra är hur många länkar det finns i en fil, det kan vi ignorera det säkert. Den tredje kolumnen har två värden / namn: Den första (i mitt exempel ”peter”) är namnet på användaren som äger filen. Det andra värdet (”användare” i exemplet) är den grupp som ägaren tillhör (Läs mer om grupper).
Nästa kolumn är storleken på filen eller katalogen i byte och information därefter är datum och tider som filen eller katalogen senast ändrades och naturligtvis namnet på filen eller katalogen.
Vad behörigheterna betyder
De första tre bokstäverna, efter de första -
eller d
, är behörigheter som ägaren har. De följande tre bokstäverna är behörigheter som gäller för gruppen. De sista tre bokstäverna är behörigheter som gäller för alla andra.
Varje uppsättning med tre bokstäver består av r
w
och x
. r
är alltid i första position, w
är alltid i andra position, och x
är alltid i tredje position. r
är läsbehörigheten, w
är skrivbehörigheten och x
är körningen lov. Om det finns ett bindestreck (-
) i stället för en av dessa bokstäver betyder det att tillståndet inte beviljas, och om brevet är närvarande beviljas det.
Mappar
Vid mappar kan lägesbitarna tolkas enligt följande:
-
r
(läs) står för förmågan att läsa innehållsförteckningen för den angivna katalogen, -
w
(skriv) står för förmågan att skriva innehållsförteckningen för den angivna katalogen (skapa nya filer, mappar, byta namn på, ta bort befintliga filer, mappar) om och bara om exekveringsbit är inställt. Annars är detta tillstånd meningslöst. -
x
(exekvera) står för möjligheten att komma in i den angivna katalogen med kommandocd och komma åt filer, mappar i den katalogen.
Ändra behörigheter med kommandot chmod
chmod
är ett kommando i Linux och andra Unix-liknande operativsystem. Det låter dig ändra behörigheterna (eller åtkomstläget) för en fil eller katalog.
Du kan ändra behörigheter på två olika sätt: – Textbaserad chmod
– Nummerbaserat chmod
Textmetod
För att ändra behörighets- eller åtkomstläge för en fil använder vi kommandot chmod i en terminal. Nedan är kommandot ”allmänna struktur:
chmod who=permissions filename
Var Vem är någon från en rad bokstäver, och var och en anger vem du ska ge tillstånd till De är som följer:
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.
Behörigheterna är desamma som redan diskuterats (r
, w
och x
).
Med kommandot chmod kan vi lägga till och subtrahera behörigheter från en befintlig uppsättning med + eller – istället Detta skiljer sig från ovanstående kommandon, som i huvudsak skriver om behörigheterna (dvs. att ändra en behörighet från r--
till rw-
, du måste fortfarande inkludera r
samt w
efter =
i chmod
-kommando. Om du missar r
skulle det ta bort r
som de skrivs om med =. Usin g + och – undvik detta genom att lägga till eller ta bort den aktuella uppsättningen behörigheter).
Nummermetod
chmod
kan också ställa in behörigheter med hjälp av siffror.
Att använda siffror är en annan metod som låter dig redigera behörigheterna för alla tre ägare, grupp och andra samtidigt. Denna grundläggande struktur för koden är den här:
chmod xxx file/directory
Där xxx är ett tresiffrigt nummer där varje siffra kan vara allt från 1 till 7. Den första siffran gäller till behörigheter för ägare, den andra siffran gäller behörigheter för gruppen och den tredje siffran gäller behörigheter för alla andra.
I denna siffernotation har värdena r, w och x sitt eget nummer värde:
r=4 w=2 x=1
För att komma med ett tresiffrigt nummer måste du överväga vilka behörigheter du vill att en ägare, grupp och användare ska ha och sedan totalt deras värden uppåt. Till exempel, säg att jag ville ge ägaren till en katalog läs- och körbehörigheter, och jag ville gruppera och alla andra för att bara ha läst och utför behörigheter. Jag skulle komma med de numeriska värdena så:
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
Detta motsvarar att använda följande:
chmod u=rwx filename chmod go=rx filename
De flesta mappar / kataloger är inställda på 755 för att tillåta läsning och skrivning och exekvering för ägaren, men nekar att skriva till alla andra, och filer är normalt 644 för att tillåta läsning och skrivning för ägaren men bara läsning För alla andra, se den sista anteckningen om bristen på x-behörigheter med icke körbara filer – det är samma sak här.
Kommentarer
- Att bara kopiera text från en annan artikel är – åtminstone – oförskämd. Kanske också upphovsrättsintrång. Om det inte bara kopieras eller om du verkligen använde små delar (upphovsrättsvänligt tack vare rättvis användning), lägg till åtminstone en länk till den artikel du refererar till / citerar.
Svara
För d-frågorna
Detta berättar Unix-filtypen. Som standard har Unix bara 3 typer av filer. De är:
-
-
– Vanlig fil -
d
– Katalogfil - Specialfil (med 5 undertyper):
-
b
– Blockera fil -
c
– Teckenenhetsfil -
p
– Namngiven rörfil eller bara rörfil -
l
– Symbolisk länkfil -
s
– Socketfil
-
Läs mer här: Filtyper i Linux / Unix förklaras i detalj
0777
vs 777
Sticky bit specificerad eller inte. När en katalogs klibbiga bit är inställd behandlar filsystemet filerna i sådana kataloger på ett speciellt sätt så att endast filens ägare, katalogens ägare eller rotanvändaren kan byta namn på eller ta bort filen. Utan den klibbiga biten ställa in, kan alla användare med skriv- och körbehörigheter för katalogen byta namn på eller ta bort innehållna filer, oavsett filens ägare.
0777
anger 777 filbehörigheter och den klibbiga biten till 0 – inga speciella lägen.
777
ställer in 777 filbehörigheter utan att ändra den klibbiga biten.
Läs mer: sticky bit och chmod
Kommentarer
- Bättre: men det erbjuder ändå ingenting som de andra svaren inte har ’ t redan täckt …
- ( 1) Det finns tre grundläggande filtyper: vanliga filer, kataloger och allt annat. Vad? Var får du det här? I det stora schemat av saker är vanliga filer och kataloger ganska lika. Namngivna rör och symboliska länkar liknar mer vanliga filer och kataloger än de är som enhetsfiler eller uttag. (2) Tror du att
chmod 777
inte tar bort setuid, setgid och klibbiga bitar? Prova. - Unix har 7 filtyper, inte 3.
Svar
Två relaterade saker som jag alltid har hittat förvirrande och inte berört ovan är:
I) vilken ” 1 ” gör:
I chmod
: varje ”1” sv gör det möjligt för en behörighet, t.ex. chmod 777 sv kan alla, men var uppmärksam eftersom
i umask
: varje ”1” dis gör det möjligt för en behörighet, t.ex. umask 777 dis kan alla.
II ) -fil ”ägare” vs.fil ”användare” :
Med andra ord finns det användare som ”äger” och användare som ”använder” .
Varje fil är ägd samtidigt av två enheter:
- en enda specifik användare , och
- en enda, specifik grupp (av en eller flera användare).
Därför kan varje fil vara använde av en specifik användare på tre sätt:
1) Direkt, som användaren som äger fil,
2) i direkt, som medlem i gruppen som äger filen, och
3 ) eventuellt som någon annan.
Annars , svar ovan, gör ett bra jobb! Tack till alla.
S_IFDIR
. Du använder inte ’ när du ställer in filläget, men funktionenstat()
returnerar faktiskt värdet 040750 fördrwxr-x---
.