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ý jakýmkoli programem, který umí zapisovat souborb
:speciální blokový soubor, obvykle disková nebo oddílová zařízení, 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
provedení, spíše než kombinování změn s 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
- „zapsat“ 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 ve výchozím nastavení skupina vlastníků adresáře (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í (s 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
namísto skupiny x
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í se používají celé čtyři číslice 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 je jedno z oprávnění ke spuštění již nastaveno nebo je soubor adresář; to může být užitečné pro globální obnovení 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ů.
Oprávnění v Linuxu jsou tedy velmi důležitá. Pokusím se o krátké vysvětlení.
Pro části režimu souboru
Každý soubor Unix má sadu oprávnění, která určují, zda můžete soubor číst, zapisovat nebo spouštět. Runningls -l zobrazí oprávnění. Zde je příklad takového zobrazení:
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Přikládám obrázek částí režimu souboru:
Typ může být jiný. Například:
- d (adresář)
- c (znakové zařízení)
- l (symlink)
- p (pojmenovaný kanál)
- s (zásuvka)
- b (zablokovat zařízení)
- D (dveře, nejsou běžné v systémech Linux, ale byly přeneseny)
Pokud chcete nastavit některá oprávnění pro všechny adresáře, můžete použít atribut R, například:
chmod -R 777 /some/directory/
Pro chmod 777 vs 0777
chmod
příkaz obvykle očekává, že vstup bude osmičkové číslo, úvodní nula odkazuje na hodnotu trojice bitů sticky/sgid/suid. V C by to však znamenalo rozdíl, protože 777
by bylo přeloženo do 01411
(osmičková), čímž se nastaví lepivý bit (viz chmod(2)
manuálová stránka), oprávnění ke čtení pro vlastníka a spustitelný bit pro skupinu a další (což je poněkud zvláštní kombinace).
UPRAVIT 1
Našel jsem další obrázek o oprávněních Linuxu a přiložím jej, abych to snadněji pochopil:
d
znamená, že je to adresář, pokud máte soubor, je to -
a pokud se jedná o odkaz, najdete l
. Nelze jej nastavit/zrušit.
Pokud jako oprávnění použijete 0777, dáváte plnou kontrolu (čtení+zápis+spouštění) každému uživateli/skupině systému. Je to líný způsob, jak řešit problémy, když máte uživatele/skupiny, které nemají přístup k adresářům/souborům.
Pokud například vypíšete obsah adresáře a dostanete toto:
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
preloadable_libintl.so je soubor vlastněný uživatelem root a root skupiny. Vlastník má přístup pro čtení a zápis, skupinu má přístup pouze pro čtení a jakýkoli jiný uživatel má přístup pro čtení. To lze přeložit jako 644.
Pokud to změním na 777, bude to vypadat takto:
-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so