Чому rm може видаляти файли лише для читання?


91

Якщо я створити файл, а потім змінити його дозволи на 444(лише для читання), як rmйого видалити?

Якщо я це роблю:

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

... rmзапитає, чи хочу я видалити файл, захищений від запису test.txt. Я б очікував, що rmне вдасться видалити такий файл і що мені доведеться зробити chmod +w test.txtперший. Якщо я rm -f test.txtпотім rmвидалить файл, навіть НЕ запитавши, навіть якщо це тільки для читання.

Хтось може уточнити? Я використовую Ubuntu 12.04 / bash.


Пояснення: я виконую ці команди як мій звичайний користувач, а не як root.
Магнус

Відповіді:


104

Все, що rmпотрібно, це записати + виконати дозвіл на батьківський каталог. Дозволи до самого файлу не мають значення.

Ось посилання, яке пояснює модель дозволів чіткіше, ніж я коли-небудь міг:

Будь-яка спроба отримати доступ до даних файлу вимагає дозволу читання. Будь-яка спроба змінити дані файлу вимагає дозволу на запис. Будь-яка спроба виконання файлу (програми чи сценарію) вимагає дозволу на виконання ...

Оскільки каталоги не використовуються так само, як звичайні файли, дозволи працюють незначно (але лише трохи) по-різному. Для спроби перерахування файлів у каталозі потрібен дозвіл на читання для каталогу, але не для файлів всередині. Спроба додати файл до каталогу, видалити файл з каталогу або перейменувати файл, усі вимагають дозволу на запис для каталогу, але (можливо, на диво) не для файлів всередині. Дозвіл на виконання не поширюється на каталоги (каталог також не може бути програмою). Але цей біт дозволу повторно використовується для каталогів для інших цілей.

Дозвіл на виконання потрібен для каталогу, щоб мати змогу входити в нього (тобто зробити деякий каталог вашою поточною робочою каталогом).

Виконати потрібно в каталозі для доступу до інформації "inode" для файлів всередині. Це потрібно для пошуку в каталозі, щоб прочитати вставки файлів всередині. З цієї причини дозвіл на виконання в каталозі часто називається дозволом пошуку.


2
Отже, якби я хотів створити каталог, де деякі файли не можна було б видалити / змінити, не роблячи спочатку chmod, але інші можуть бути вільно записаними, це було б неможливо? Мені доведеться chmod каталог 555, що означає, що жодні файли в каталозі не можуть бути створені або змінені.
Магнус

3
@Magnus - Звичайно, ніщо не заважає вам створити довідковий каталог, що записується, всередині каталогу, доступного лише для читання, і зберігати файли, що записуються, у ньому. Сам дочірній каталог неможливо видалити, але його вміст може.
ire_and_curses

7
Чи не можете ви зробити каталог липким, +tщоб люди більше не могли змінювати чи видаляти файли в цьому каталозі, якими вони не володіють, навіть якщо вони мають доступ до запису до каталогу?
Шадур

3
@Magnus Якщо у вас є кореневий доступ (включаючи sudo), ви можете використовувати chattrдля додавання незмінного прапора у файли. Якщо ні, то ire_and_curses цілком коректно.
Джеймс О'Горман

6
Не використовувати rm -f працює лише до тих пір, поки я тверезий ... плюс, я не маю уявлення про те, які відсталі баш сценарії, які я пишу, можуть чи не робити
Magnus

53

Гаразд, згідно з вашим коментарем до ire_and_curses, ви дійсно хочете зробити, це зробити деякі файли незмінними. Це можна зробити за допомогою chattrкоманди. Наприклад:

напр

$ 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

Ви не можете нічого зробити з непорушним файлом - ви не можете його видалити, відредагувати, перезаписати, перейменувати, chmod або chown, або щось інше. Єдине, що ви можете зробити з цим, це прочитати його (якщо дозволяють дозволи Unix) і (як root) chattr -iвидалити незмінний біт.

Не всі файлові системи підтримують усі атрибути. AFAIK, незмінний підтримується всіма поширеними файловими системами Linux (включаючи ext2 / 3/4 та xfs. Zfsonlinux наразі не підтримує атрибути)


3
це час від часу корисно. btw, навіть root не може змінити або видалити незмінний файл (не попередньо видаливши незмінний атрибут). також btw, використовувати lsattrдля списку атрибутів.
cas

2
+1 - Я забув про атрибути і був настільки зайнятий відповіддю на буквальне запитання про rmте, що мені це навіть не прийшло в
голову

2
Ця файлова система специфічна, і це може принести вам більше проблем, які вона вирішує.
Стефан Гіменез

4
@Magnus: можливі проблеми включають резервне копіювання (не всі утиліти резервного копіювання будуть створювати резервні копії атрибутів - насправді більшість не буде) та відновити (якщо ви відновите до каталогу, який вже містить непорушний файл, деякі програми будуть розглядати неможливість перезаписати цей файл як фатальна помилка і переривання). Також ви можете викликати плутанину, якщо забудете, що ви зробили файл незмінним і не можете зрозуміти, чому ви не можете його видалити .... повідомлення про помилку "Операція не дозволена" - це те саме повідомлення про помилку, яке ви бачите з деякими видами файлової системи корупція, що може призвести до потенційно небезпечної надмірної реакції.
cas

1
Ви можете скопіювати (cp) незмінний файл.
Восьминіг

0

Одна відповідь на це запитання стверджує, що ви можете видалити файл із каталогу, лише якщо на нього є лише writeдозвіл, абсолютно неправильно! просто спробуйте! Дайте директорії лише writeдозвіл і спробуйте видалити, ви не можете!
Для видалення файлу всередині каталогу потрібні writeі executeдозвіл, і каталог

Тепер повернемося до питання: для видалення файлу за допомогою rmви просто видаляєте його інформацію про inode з каталогу, тобто ви не є shreddingз диска. Якщо інформація про файл у файлі відсутня в каталозі, ви не можете отримати доступ (також тому, що ви не можете бачити його, оскільки він не вказаний у його батьківському каталозі), тобто він видалений для вас.
Таким чином, для видалення файлу з каталогу все, що ви маєте дозвіл у каталозі; дозволи цього файлу не мають значення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.