Если я создаю файл, а затем изменяю его права доступа 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.
permissions
files
rm
readonly
Магнус
источник
источник
Ответы:
Все, что
rm
нужно - это разрешение на запись + выполнение в родительском каталоге. Права доступа к самому файлу не имеют значения.Вот ссылка, которая объясняет модель разрешений более четко, чем я когда-либо мог:
источник
+t
чтобы люди больше не могли изменять или удалять файлы в этом каталоге, которые им не принадлежат, даже если у них есть доступ для записи в каталог?chattr
чтобы добавить неизменяемый флаг к файлам. Если нет, то ire_and_curses вполне корректен.Хорошо, согласно вашему комментарию к ire_and_curses, вы действительно хотите сделать некоторые файлы неизменяемыми. Вы можете сделать это с помощью
chattr
команды. Например:например
Вы не можете ничего сделать с неизменяемым файлом - вы не можете удалить его, отредактировать, перезаписать, переименовать, chmod или chown, или что-то еще. Единственное, что вы можете сделать с ним - это прочитать его (если позволяют разрешения unix) и (как root)
chattr -i
удалить неизменный бит.Не все файловые системы поддерживают все атрибуты. AFAIK, immutable поддерживается всеми распространенными файловыми системами linux (в том числе ext2 / 3/4 и xfs. Zfsonlinux на данный момент вообще не поддерживает атрибуты)
источник
lsattr
для перечисления атрибутов.rm
том, что мне это даже не приходило в голову ...В одном ответе на этот вопрос утверждается, что вы можете удалить файл из каталога только в том случае, если у него есть только
write
разрешение, что совершенно неправильно! просто попробуйте! Дайте каталогу толькоwrite
разрешение и попробуйте удалить, вы не можете!Чтобы удалить файл внутри директории, вам нужны
write
иexecute
разрешение на директорию.Теперь вернемся к вопросу: чтобы удалить файл с помощью,
rm
вы просто удаляете его инодную информацию из каталога, то есть вы не являетесьshredding
его с диска. Если информация об узле файла не находится в каталоге, вы не можете получить к нему доступ (также потому, что вы не можете видеть ее, поскольку она не указана в родительском каталоге), то есть она удалена для вас.Таким образом, чтобы удалить файл из каталога, все, что вам нужно, это разрешение на каталог; разрешения на этот файл не имеют значения
источник