Как я могу предотвратить переименование файла всеми людьми?
Я выполняю следующую команду: chmod 000 x.txt
но как владелец я все еще могу переименовать его! Зачем?
и как я могу запретить всем людям переименовывать этот файл?
2 ответа
Как правильно ответил Дэвид Фёрстер, права на управление файлами и каталогами зависят от разрешения на содержащий каталог.
Сказал, что есть (грязный?) Трюк, чтобы избежать возможности удаления каталога, даже если у вас есть права на содержащий его: вставьте в него (возможно, скрытый) файл и сделайте его и каталог недоступным для записи. Посмотрите на этот пример:
[romano:~] mkdir tmp/test; cd tmp/test
[romano:~/tmp/test] % mkdir subdir_e subdir_f
[romano:~/tmp/test] % touch subdir_f/.hiddenfile
Я создал два подкаталога, один пустой, а другой со скрытым файлом.
[romano:~/tmp/test] % chmod 555 subdir_f/.hiddenfile subdir_f subdir_e
[romano:~/tmp/test] % sudo chown root subdir_f/.hiddenfile subdir_f subdir_e
Я делаю этот каталог и скрытый файл недоступными для записи, изменяя разрешение и предоставляя право собственности на root
(иначе я могу просто поменять разрешение обратно). Давайте посмотрим на статус:
[romano:~/tmp/test] % ls -la
total 16
drwxrwxr-x 4 romano romano 4096 oct 23 16:37 .
drwxr-xr-x 6 romano romano 4096 oct 23 16:31 ..
dr-xr-xr-x 2 root romano 4096 oct 23 16:37 subdir_e
dr-xr-xr-x 2 root romano 4096 oct 23 16:37 subdir_f
Обратите внимание, что я владею и имею права на запись .
, который является моим текущим каталогом, так что если я сделаю:
[romano:~/tmp/test] % rmdir subdir_e
это удается, потому что я могу изменить .
как мне нравится. Но если я попробую то же самое с непустым subdir:
[romano:~/tmp/test] % rmdir subdir_f
rmdir: failed to remove ‘subdir_f’: Directory not empty
[romano:~/tmp/test] 1 % rm -rf subdir_f
rm: cannot remove ‘subdir_f/.hiddenfile’: Permission denied
[romano:~/tmp/test] 1 % chown romano subdir_f
chown: changing ownership of ‘subdir_f’: Operation not permitted
... Мне нужна привилегия root, чтобы удалить его сейчас.
Каталоги - это специальные файлы, содержащие список именованных записей. Каждая запись ссылается на другой объект файла, который, в свою очередь, содержит расположение содержимого файла на диске. Когда вы создаете, перемещаете или удаляете "файл" (и помните, что каталоги - это тоже файлы), вы фактически создаете, переименовываете или удаляете записи в списке каталогов - вы меняете каталог, частью которого является запись. Поскольку вам необходимы разрешения на запись для объекта, чтобы изменить его, вам нужны разрешения на запись в каталог, чтобы создавать, перемещать или удалять записи в нем.
пример
Давайте предположим, что у вас есть файл x
в каталоге a
, Переименовать x
пользователю нужен доступ для записи a
, Чтобы отозвать доступ на запись от любого, кто не является владельцем a
делать:
chmod go-w a
Это отзывает (-
) разрешение на "запись" (w
) для классов "группа владельцев" (g
) и другие" (o
).