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í:
- How do I specify folders only for chmod – askubuntu.com (lepší je ale dát složené závorky do uvozovek
'{}'
, aby se zabránilo interpretaci názvu souboru jako skriptu, zda se na konci použije+
či\;
by již mělo být jedno, - Chmod: Execute only if the file is a directory – stackoverflow.com,
- find(1) — Linux manual page + EXAMPLES (je tam příklad na Executing a command for each file:
$ find . -type f -exec file '{}' \;
a je zde vysvětleno, proč mají být závorky v uvozovkách) – man7.org, - chmod(1) — Linux manual page – man7.org,
- Linux/Mac Terminal Tutorial: How To Use The find Command (cca 11:30, 12:30 a dál) – youtube.com.