Nikdy jsem pořádně nepochopil, jak chmod
pracoval až do dneška. Sledoval jsem tutoriál, který mi vysvětlil velkou věc.
Například jsem četl, že máte tři různé skupiny oprávnění:
- vlastník (
u
) - skupina (
g
) - všichni (
o
)
Na základě těchto tří skupin nyní vím, že:
- Pokud je soubor ve vlastnictví uživatele, o přístupu rozhodují uživatelská oprávnění.
- Pokud je skupina souboru stejná jako skupina uživatele, určuje přístup skupinové oprávnění.
- Pokud uživatel není vlastníkem souboru a není ve skupině, použije se jiné oprávnění.
Také jsem se dozvěděl, že máte následující oprávnění:
- číst (
r
) - zapsat (
w
) - spustit (
x
)
Vytvořil jsem adresář, abych otestoval své nově nabyté znalosti:
mkdir test
Pak jsem provedl nějaké testy:
chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---
Po nějaké době blbnutí si myslím, že jsem konečně pochopil chmod
a způsob, jakým nastavíte oprávnění pomocí tohoto příkazu.
Ale…
Ještě mám pár otázek:
- Co znamená
d
na startu stojí? - Jaký je název a použití obsahujícího bloku a jaké další hodnoty může obsahovat?
- Jak jej mohu nastavit a zrušit?
- Jaká je hodnota tohoto
d
? (Protože máte pouze 7=4+2+1 7=4+2+1 7=4+2+1) - Proč lidé někdy používají
0777
místo777
nastavit jejich oprávnění?
Ale protože bych neměl klást více otázek, pokusím se to položit jedinou otázkou.
V systému založeném na UNIXu, jako jsou všechny distribuce Linuxu, co se týká oprávnění, co dělá první část (d
) znamená a k čemu tato část oprávnění slouží?
Přijatá odpověď:
Na vaše otázky odpovím ve třech částech:typy souborů, oprávnění a případy použití pro různé formy chmod
.
Typy souborů
První znak v ls -l
výstup představuje typ souboru; d
znamená, že je to adresář. Nelze jej nastavit ani zrušit, záleží na tom, jak byl soubor vytvořen. Úplný seznam typů souborů naleznete v dokumentaci ls; ti, na které pravděpodobně narazíte, jsou
-
:„běžný“ soubor, vytvořený pomocí libovolného programu, který umí zapisovat souborb
:speciální blokový soubor, obvykle disková zařízení nebo zařízení s oddíly, lze vytvořit pomocímknod
c
:znakový speciální soubor, lze také vytvořit pomocímknod
(viz/dev
pro příklady)d
:adresář, lze vytvořit pomocímkdir
l
:symbolický odkaz, lze vytvořit pomocíln -s
p
:pojmenované potrubí, lze vytvořit pomocímkfifo
s
:socket, lze vytvořit pomocínc -U
D
:door, vytvořený některými serverovými procesy na Solaris/openindiana.
Oprávnění
chmod 0777
se používá k nastavení všech oprávnění v jednom chmod
provádění, spíše než kombinování změn pomocí u+
atd. Každá ze čtyř číslic je osmičková hodnota představující sadu oprávnění:
suid
,sgid
a „lepkavý“ (viz níže)- uživatelská oprávnění
- skupinová oprávnění
- „jiná“ oprávnění
Osmičková hodnota se vypočítá jako součet oprávnění:
- „přečíst“ je 4
- „write“ je 2
- „provést“ je 1
Pro první číslici:
suid
je 4; binární soubory s touto bitovou sadou běží jako uživatel vlastníka (obvykleroot
)sgid
je 2; binární soubory s touto bitovou sadou běží jako jejich skupina vlastníků (toto bylo používáno pro hry, takže bylo možné sdílet vysoké skóre, ale v kombinaci se zranitelností ve hrách je to často bezpečnostní riziko) a soubory vytvořené v adresářích s touto bitovou sadou patří do skupina vlastníků adresáře ve výchozím nastavení (toto je užitečné pro vytváření sdílených složek)- „sticky“ (nebo „omezené mazání“) je 1; soubory v adresářích s touto bitovou sadou může smazat pouze jejich vlastník, vlastník adresáře nebo
root
(viz/tmp
pro běžný příklad tohoto).
Viz chmod
manuálová stránka pro podrobnosti. Všimněte si, že v tom všem ignoruji další bezpečnostní funkce, které mohou změnit uživatelská oprávnění k souborům (SELinux, souborové ACL…).
Se speciálními bity se zachází odlišně v závislosti na typu souboru (běžný soubor nebo adresář) a základním systému. (To je zmíněno v chmod
manpage.) Na systému, který jsem použil k testování (pomocí coreutils
8.23 na ext4
souborový systém s linuxovým jádrem 3.16.7-ckt2), chování je následující. U souboru jsou speciální bity vždy vymazány, pokud nejsou explicitně nastaveny, takže chmod 0777
je ekvivalentní chmod 777
a oba příkazy vymažou speciální bity a dají všem plná oprávnění k souboru. U adresáře nejsou speciální bity nikdy zcela vymazány pomocí čtyřmístné číselné formy, takže ve skutečnosti chmod 0777
je také ekvivalentní chmod 777
ale je to zavádějící, protože některé speciální bity zůstanou tak, jak jsou. (Předchozí verze této odpovědi to měla špatně.) Chcete-li vymazat speciální bity v adresářích, musíte použít u-s
, g-s
a/nebo o-t
explicitně nebo zadejte zápornou číselnou hodnotu, takže chmod -7000
vymaže všechny speciální bity v adresáři.
V ls -l
výstup, suid
, sgid
a „sticky“ se objeví místo x
záznam:suid
je s
nebo S
namísto x
uživatele , sgid
je s
nebo S
místo x
skupiny a „sticky“ je t
nebo T
místo x
ostatních . Malé písmeno označuje, že jsou nastaveny speciální bit i spustitelný bit; velké písmeno znamená, že je nastaven pouze speciální bit.
Různé formy chmod
Kvůli výše popsanému chování, použití celých čtyř číslic v chmod
může být matoucí (alespoň se ukázalo, že jsem byl zmatený). Je to užitečné, když chcete nastavit speciální bity i bity oprávnění; jinak jsou bity vymazány, pokud manipulujete se souborem, zachovány, pokud manipulujete s adresářem. Takže chmod 2750
zajišťuje, že získáte alespoň sgid
a přesně u=rwx,g=rx,o=
; ale chmod 0750
nemusí nutně vymazat speciální bity.
Použití numerických režimů místo textových příkazů ([ugo][=+-][rwxXst]
) jde pravděpodobně spíše o zvyk a cíl příkazu. Jakmile jste si zvykli na používání numerických režimů, je často snazší určit celý režim tímto způsobem; a je užitečné mít možnost myslet na oprávnění pomocí číselných režimů, protože je může používat mnoho dalších příkazů (install
, mknod
…).
Některé textové varianty se mohou hodit:pokud chcete jednoduše zajistit, aby soubor mohl spustit kdokoli, chmod a+x
to udělá bez ohledu na to, jaká jsou ostatní oprávnění. Podobně +X
přidá oprávnění ke spuštění pouze v případě, že jedno z oprávnění ke spuštění je již nastaveno nebo je soubor adresář; to může být užitečné pro globální obnovu oprávnění, aniž byste museli používat speciální případy souborů v. adresáře. Tedy chmod -R ug=rX,u+w,o=
je ekvivalentní použití chmod -R 750
do všech adresářů a spustitelných souborů a chmod -R 640
do všech ostatních souborů.