Intereting Posts

Почему rm удаляет файлы только для чтения?

Если я создам файл, а затем изменим его разрешения на 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 удалит файл, даже не спросив, даже если он rm -f test.txt только для чтения.

Может ли кто-нибудь уточнить? Я использую Ubuntu 12.04 / bash.

Все потребности rm – это разрешение на запись + выполнение в родительском каталоге. Разрешения самого файла не имеют значения.

Вот ссылка, которая объясняет модель разрешений более четко, чем я когда-либо мог:

Любая попытка получить доступ к данным файла требует разрешения на чтение. Любая попытка изменить данные файла требует разрешения на запись. Любая попытка выполнить файл (программа или сценарий) требует разрешения на выполнение …

Поскольку каталоги не используются так же, как обычные файлы, разрешения работают немного (но только слегка) по-разному. Попытка перечислить файлы в каталоге требует разрешения на чтение для каталога, но не для файлов внутри. Попытка добавить файл в каталог, удалить файл из каталога или переименовать файл, все требуют разрешения на запись для каталога, но (возможно, удивительно) не для файлов внутри. Разрешение на выполнение не распространяется на каталоги (каталог также не может быть программой). Но этот бит разрешения используется для каталогов для других целей.

Выполнить разрешение необходимо в каталоге, чтобы иметь возможность записывать в него (т. Е. Сделать какой-то каталог текущей рабочей директорией).

Выполнение необходимо в каталоге для доступа к информации «inode» файлов внутри. Вам нужно это для поиска в каталоге, чтобы прочитать inodes файлов внутри. По этой причине разрешение на выполнение в каталоге часто называется поисковым разрешением.

Хорошо, согласно вашему комментарию к 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 вообще не поддерживает атрибуты)

Один ответ на этот вопрос утверждает, что вы можете удалить файл из каталога только в том случае, если он имеет только разрешение на write это совершенно неправильно! просто попробуйте! Дайте директорию только разрешение на write и попробуйте удалить, вы не сможете!
Чтобы удалить файл внутри каталога, вам нужно как разрешение на write и execute в каталоге

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