Zrušení práva execute u souborů v Linuxu

Datum vydání: 26. 8. 2021

Problém: po nakopírování souborů z externího disku NTFS bylo nastaveno právo execute v Linuxu u všech souborů. Potřebovala jsem toto právo odebrat a zároveň právo execute ponechat pro adresáře.

Konkrétně například máte externí disk, který jste používali ve Windows a který používá souborový systém NTFS. Při připojení tohoto externího disku do Linuxu soubory NTFS načtete i v Linuxu. Nicméně při překopírování souborů z externího disku do Linuxu se souborovým systémem Ext4, může dojít k tomu, že soubory budou mít nastavena práva execute. Je to pochopitelné, Windows práva moc neřeší a externí disk taky ne. Takže je následně třeba práva souborů v Linuxu nastavit, aby nebyla příliš široká.

Standardně např. v Ubuntu vaše soubory právo execute v Linuxu nemají, jedině, že jim ho explicitně nastavíte. Nastavení práv execute u všech souborů je z hlediska bezpečnosti celkem problém, protože pak lze například textový soubor, který by ve svém obsahu obsahoval příkazy shellu, nechtíc spustit a vykonat jako skript.

Pozor na chmod -R! Nefunguje zrovna tak, jak právě potřebujeme!

Změna práv není zas tak jednoduchá, jak by se na první pohled zdálo. Při aplikování standardního příkazu chmod v jeho rekurzivní podobě např. chmod -R 644 directory či chmod -R a-x directory dojde k tomu, že se odstraní právo execute i u adresářů a podadresářů a adresáře následně nelze spustit, což v jejich případě znamená, že je nemůžeme procházet. Pro vyřešení problému je třeba, aby se odstranila práva execute pouze u souborů, ale u adresářů je zapotřebí právo execute ponechat.

Řešení – příkaz find s parametrem -exec

Řešením je zkombinování příkazu shellu find s parametrem -exec, který spustí na každém nalezeném souboru či adresáři patřičnou změnu práv chmod. Než se ale pustíme přímo do změny práv, je dobré si nechat vypsat soubory či adresáře, kterých se změna bude týkat.

pwd
find . -type f
find . -type d

Přesuneme se do adresáře, ve kterém chceme docílit změny. Změnu adresáře provádíme příkazem cd. Pro kontrolu si můžeme adresář ve kterém se nacházíme vypsat příkazem pwd. Následně dáme příkaz find, který pokud je volán find . -type f nám vypíše všechny soubory (f jako file) z aktuálního adresáře symbolizovaného tečkou. Výpis probíhá rekurzivně. Takže pozor, už samotný find prochází rekurzivně i podadresáře do hloubky.

Podobně příkazem find . -type d si můžeme nechat zobrazit všechny podadresáře (d jako directory) aktuálního adresáře. Pokud jsme spokojeni s výpisem a daný příkaz nám zobrazuje adresáře a soubory, na které chceme opravdu aplikovat patřičnou změnu práv, můžeme přistoupit k následujícímu kroku.

pwd
find . -type f -exec chmod 0644 '{}' \;
find . -type d -exec chmod 0755 '{}' \;

Opět si raději příkazem pwd zkontroluji aktuální adresář ve kterým jsem a který pak bude reprezentovat tečka v příkazu find a na který chci aplikovat změnu práv. Následně pustíme změnu práv samostatně na soubory díky parametru -type f a nastavíme práva např. na 644 či 664. Samostatným příkazem spustíme změnu práv na adresáře díky parametru -type d a nastavením práva např. na 755 či 775.

Pokud bychom chtěli využít absolutních cest místo tečky tak příkazy mohou vypadat např. takto

find /home/uzivatel/Documents -type f -exec chmod 0644 '{}' \;
find /home/uzivatel/Documents -type d -exec chmod 0755 '{}' \;

Více informací:

Další články