Příkaz `chmod` v Linuxu slouží k definování, kdo má mít přístup k souborům, možnost procházet adresáře a spouštět skripty. Ačkoliv se oprávnění souborů v Linuxu mohou zdát na první pohled složitá, po pochopení základních principů je jejich ovládání docela intuitivní.
`chmod` – Správa přístupových práv
V Linuxových systémech jsou práva pro manipulaci se soubory a adresáři regulována sadami oprávnění. Rozlišujeme tři základní skupiny oprávnění. První sada platí pro vlastníka souboru, druhá pro členy skupiny, do které soubor patří, a poslední pro všechny ostatní uživatele.
Oprávnění definují, jaké akce lze se souborem nebo adresářem provádět. Umožňují nebo zakazují čtení, úpravy souboru, případně jeho spouštění, pokud se jedná o skript nebo program. V případě adresářů oprávnění určují, kdo může adresář otevřít (`cd`) a kdo může v něm vytvářet nebo upravovat soubory.
Pro nastavení těchto oprávnění slouží příkaz `chmod`. Chcete-li zjistit aktuální nastavení oprávnění pro soubor nebo adresář, můžete použít příkaz `ls`. Pro více informací o příkazu `chmod`, navštivte manuálovou stránku chmod, a pro informace o `ls` se podívejte na manuálovou stránku ls.
Interpretace výpisu oprávnění
Příkaz `ls` s volbou `-l` (dlouhý formát) zobrazí detailní informace o souborech a adresářích, včetně jejich oprávnění.
ls -l
Na každém řádku, první znak udává typ záznamu. Pomlčka (-) značí soubor, písmeno `d` reprezentuje adresář.
Následujících devět znaků představuje nastavení tří sad oprávnění.
První tři znaky ukazují oprávnění vlastníka souboru (uživatelská oprávnění). Další tři znaky zobrazují oprávnění pro členy skupiny souboru (skupinová oprávnění). Poslední tři znaky specifikují oprávnění pro všechny ostatní uživatele, kteří nejsou v předchozích dvou kategoriích.
Každá z těchto sad oprávnění obsahuje tři znaky. Tyto znaky indikují přítomnost nebo nepřítomnost konkrétního oprávnění. Pomlčka (-) značí, že oprávnění nebylo uděleno, zatímco písmena `r`, `w` nebo `x` indikují udělené oprávnění.
Jednotlivá písmena znamenají:
- `r`: Oprávnění ke čtení. Soubor je možné otevřít a zobrazit jeho obsah.
- `w`: Oprávnění k zápisu. Soubor je možné upravovat a mazat.
- `x`: Oprávnění ke spuštění. Pokud je soubor skript nebo program, je možné ho spustit.
Například:
- `—` znamená, že nejsou udělena žádná oprávnění.
- `rwx` znamená, že jsou udělena plná oprávnění, tedy čtení, zápis a spuštění.
Na příkladu zobrazeném výše začíná první řádek písmenem `d`, což značí adresář s názvem „archiv“. Vlastníkem tohoto adresáře je uživatel „dave“ a adresář je součástí skupiny „dave“.
Následující tři znaky (`rwx`) reprezentují uživatelská oprávnění. Vlastník, uživatel „dave“, má plná oprávnění pro tento adresář, tedy čtení, zápis i spouštění.
Druhá sada znaků (`rx`) představuje oprávnění skupiny. Členové skupiny „dave“ mají právo číst obsah adresáře a spouštět v něm příkazy, ale nemohou vytvářet ani upravovat soubory (nemají právo zápisu).
Poslední sada znaků (`rx`) platí pro ostatní uživatele, kteří nejsou členy skupiny ani vlastníkem. Tito uživatelé mají stejná práva jako skupina, tedy možnost číst a spouštět.
Shrnuto, uživatel „dave“ má plná oprávnění, zatímco členové skupiny a ostatní uživatelé mají práva ke čtení a spouštění. U souborů (s výjimkou skriptu `mh.sh`) má uživatel „dave“ a členové skupiny práva pro čtení a zápis, zatímco ostatní mají jen právo čtení.
U skriptu `mh.sh` má uživatel „dave“ i členové skupiny oprávnění ke čtení, zápisu a spouštění, a ostatní uživatelé mají oprávnění číst a spouštět.
Syntaxe příkazu `chmod`
Při používání příkazu `chmod` je nutné specifikovat tři aspekty:
- **Kdo:** Pro koho se práva nastavují.
- **Co:** Jakou změnu provádíme? Přidáváme nebo odebíráme oprávnění?
- **Které:** Která konkrétní oprávnění upravujeme?
K vyjádření těchto aspektů se používají krátké „příkazy o oprávnění“, například `u+x`. V tomto případě `u` znamená „uživatel“ (kdo), `+` znamená „přidat“ (co) a `x` značí oprávnění ke spuštění (které).
Použitelné hodnoty pro **kdo** jsou:
- `u`: Uživatel (vlastník souboru).
- `g`: Skupina (členové skupiny souboru).
- `o`: Ostatní (uživatelé mimo vlastníka a skupinu).
- `a`: Všichni výše zmínění.
Pokud není zadána žádná z těchto hodnot, `chmod` se chová, jako by byla zadána hodnota `a`.
Hodnoty pro **jaké** operace jsou:
- `-`: Odebrání oprávnění.
- `+`: Přidání oprávnění. Oprávnění se přidá k stávajícím. Chcete-li nastavit pouze toto oprávnění, použijte `=`.
- `=`: Nastavení oprávnění a odstranění ostatních.
Hodnoty pro **které** oprávnění jsou:
- `r`: Oprávnění ke čtení.
- `w`: Oprávnění k zápisu.
- `x`: Oprávnění ke spuštění.
Praktické použití příkazu `chmod`
Představme si soubor s plnými oprávněními pro všechny uživatele.
ls -l new_file.txt
Chceme nastavit, aby uživatel „dave“ měl oprávnění ke čtení a zápisu, zatímco skupina a ostatní uživatelé měli jen oprávnění ke čtení. Provedeme to příkazem:
chmod u=rw,og=r new_file.txt
Operátor `=` zajistí, že dojde k vymazání všech existujících oprávnění a následně se nastaví nová.
Nyní zkontrolujeme nastavení oprávnění:
ls -l new_file.txt
Stávající oprávnění byla odstraněna a byla nastavena nová, dle našeho zadání.
Co když chceme oprávnění přidat, aniž bychom odebrali stávající nastavení? I to je možné.
Představme si dokončený skript, který je potřeba nastavit jako spustitelný pro všechny uživatele. Aktuální nastavení oprávnění je následující:
ls -l new_script.sh
Můžeme přidat oprávnění ke spuštění pro všechny uživatele příkazem:
chmod a+x new_script.sh
Kontrolou oprávnění zjistíme, že oprávnění ke spuštění byla přidána všem, aniž by byla smazána původní oprávnění.
ls -l new_script.sh
Stejného výsledku bychom dosáhli bez použití „a“ v příkazu `a+x`, následující příkaz by fungoval stejně:
chmod +x new_script.sh
Úprava oprávnění u více souborů
Příkaz `chmod` lze použít k úpravě oprávnění u více souborů současně.
Například, pokud máme soubory v aktuálním adresáři:
ls -l
Řekněme, že chceme odebrat právo zápisu pro kategorii „ostatní“ ze všech souborů s příponou „.page“. Použijeme následující příkaz:
chmod o-w *.page
Výsledek se projeví takto:
ls -l
Jak vidíte, oprávnění k zápisu pro kategorii „ostatní“ bylo odebráno u všech souborů s příponou „.page“, žádné další soubory nebyly ovlivněny.
Pro zahrnutí souborů v podadresářích lze použít volbu `-R` (rekurzivní).
chmod -R o-w *.page
Číselné nastavení oprávnění
Alternativní metodou, jak specifikovat oprávnění pomocí `chmod`, je použití třímístného čísla. První číslice reprezentuje oprávnění pro vlastníka, druhá pro členy skupiny a třetí pro ostatní uživatele.
Použitelné číslice a jejich význam jsou:
0 | (000) Žádná oprávnění. |
1 | (001) Oprávnění ke spuštění. |
2 | (010) Oprávnění k zápisu. |
3 | (011) Oprávnění k zápisu a spouštění. |
4 | (100) Oprávnění ke čtení. |
5 | (101) Oprávnění ke čtení a spouštění. |
6 | (110) Oprávnění ke čtení a zápisu. |
7 | (111) Oprávnění ke čtení, zápisu a spouštění. |
Každé ze tří oprávnění je reprezentováno bitem v binární reprezentaci daného dekadického čísla. Například 5, binárně `101`, reprezentuje oprávnění ke čtení a spouštění, zatímco 2, binárně `010`, odpovídá oprávnění k zápisu.
Při této metodě nastavujeme explicitně požadovaná oprávnění a nepřidáváme je ke stávajícím. Například, pokud soubor již má oprávnění ke čtení a zápisu a chcete přidat oprávnění ke spuštění, musíte použít 7 (`111`). Použití 1 (`001`) by naopak odebralo oprávnění ke čtení a zápisu a nastavilo pouze oprávnění ke spuštění.
Vraťme souborům „.page“ oprávnění ke čtení pro kategorii ostatních uživatelů. Současně také nastavíme oprávnění pro vlastníka a skupinu, tak jak je měli původně. Vlastník a skupina již mají práva ke čtení i zápisu, což odpovídá číslu 6 (110). Pro ostatní chceme nastavit oprávnění pouze pro čtení, tedy 4 (100).
Provedeme to příkazem:
chmod 664 *.page
Výsledkem bude nastavení požadovaných oprávnění pro vlastníka, skupinu a ostatní uživatele. Vlastník a skupina mají obnovena svá původní oprávnění a ostatní mají obnoveno oprávnění ke čtení.
ls -l
Rozšířené možnosti příkazu `chmod`
Podrobnější informace o pokročilých možnostech příkazu `chmod`, jako jsou bity SETUID, SETGID a bit „sticky“, najdete na manuálové stránce příkazu. Nicméně, v 99% případů, kdy budete potřebovat `chmod`, vám postačí výše popsané postupy.