it-swarm-eu.dev

Proč rm může odstranit soubory jen pro čtení?

Pokud vytvořím soubor a změním jeho oprávnění na 444 (jen pro čtení), jak to, že rm ho může odstranit?

Pokud to udělám:

echo test > test.txt
chmod 444 test.txt
rm test.txt

...rm se zeptá, jestli chci odstranit soubor chráněný proti zápisu test.txt. Očekával bych, že rm nemůže takový soubor odstranit a že bych musel udělat chmod +w test.txt za prvé. Pokud ano rm -f test.txt potom rm odstraní soubor, aniž by se ptal, i když je to jen pro čtení.

Může někdo objasnit? Používám Ubuntu 12.04/bash.

96
Magnus

Vše, co rm potřebuje, je zápis + spuštění oprávnění v nadřazeném adresáři. Oprávnění samotného souboru jsou irelevantní.

Zde je odkaz , který vysvětluje model oprávnění jasněji, než jsem kdy mohl:

Jakýkoli pokus o přístup k datům souboru vyžaduje oprávnění ke čtení. Jakýkoli pokus o úpravu dat souboru vyžaduje písemné povolení. Jakýkoli pokus o spuštění souboru (programu nebo skriptu) vyžaduje oprávnění ke spuštění ...

Protože adresáře nejsou používány stejným způsobem jako běžné soubory, oprávnění fungují trochu (ale jen nepatrně) odlišně. Pokus o výpis souborů v adresáři vyžaduje oprávnění ke čtení pro adresář, ale nikoli pro soubory uvnitř. Pokus o přidání souboru do adresáře, odstranění souboru z adresáře nebo přejmenování souboru vyžaduje všichni oprávnění k zápisu do adresáře, ale (možná překvapivě) ne pro soubory uvnitř. Oprávnění ke spuštění se nevztahuje na adresáře (adresář nemůže být také programem). Tento bit oprávnění je však znovu použit pro adresáře pro jiné účely.

Aby bylo možné do tohoto adresáře zapisovat, je nutné provést oprávnění v adresáři (tj. Vytvořit z některého adresáře aktuální pracovní adresář).

Provedení je nutné v adresáři pro přístup k "inode" informacím o souborech uvnitř. Musíte to hledat v adresáři, abyste mohli číst inody souborů uvnitř. Z tohoto důvodu se vykonávací oprávnění v adresáři často nazývá vyhledávací oprávnění.

110
ire_and_curses

Ok, podle vašeho komentáře k ire_and_curses, to, co opravdu chcete udělat, je udělat některé soubory neměnné. Můžete to udělat pomocí příkazu chattr. Například:

např.

$ cd /tmp
$ touch immutable-file
$ Sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

S neměnným souborem nemůžete udělat nic - nemůžete jej odstranit, upravit, přepsat, přejmenovat, chmod nebo chown, ani nic jiného. Jediné, co s ním můžete udělat, je přečíst si jej (pokud to umožňují unixová oprávnění) a (jako root) chattr -i k odstranění neměnného bitu.

Ne všechny souborové systémy podporují všechny atributy. AFAIK, immeable je podporován všemi běžnými linuxovými souborovými systémy (včetně ext2/3/4 a xfs. Zfsonlinux v současné době nepodporuje atributy)

53
cas

Jedna odpověď na tuto otázku tvrdí, že můžete smazat soubor z adresáře pouze v případě, že má pouze oprávnění write. jen to zkus! Dejte adresáři pouze oprávnění write a zkuste jej smazat, nemůžete!
Chcete-li smazat soubor v adresáři, potřebujete k adresáři oprávnění write a execute

Nyní zpět k otázce: Chcete-li odstranit soubor pomocí rm, právě odstraňujete jeho informace o inodu z adresáře, tj. Nejste shredding z disku. Pokud informace o inodu souboru nejsou v adresáři, nemůžete přistupovat (také proto, že jej nevidíte, protože není uveden v jeho nadřazeném adresáři), tj. Je odstraněn pro tebe.
Chcete-li tedy odstranit soubor z adresáře, máte k adresáři pouze oprávnění; oprávnění k tomuto souboru jsou irelevantní

0
Edward Torvalds