我正在执行以下命令:chmod 000 x.txt
但作为所有者我仍然可以重命名它!为什么?
我怎样才能阻止所有人重命名该文件?
答案1
目录是包含命名条目列表的特殊文件。每个条目都引用另一个文件对象,而该文件对象又包含文件内容在磁盘上的位置。当您创建、移动或删除“文件”(请记住目录也是文件)时,您实际上是在创建、重命名或删除目录列表中的条目 - 您正在更改条目所属的目录。由于您需要对对象具有写入权限才能对其进行更改,因此您需要对目录具有写入权限才能在其中创建、移动或删除条目。
例子
假设x
目录 中有一个文件a
。要重命名,x
用户需要对 具有写权限a
。要撤销 所有者以外的任何人的写权限,请执行以下操作a
:
chmod go-w a
这将撤销 ( )类别“所有者组”( ) 和“其他”( )-
的“写”权限 ( ) 。w
g
o
答案2
正确David Foerster 回答,操作文件和目录的权限取决于包含目录。
话虽如此,有一个(肮脏的?)技巧可以避免即使你拥有包含目录的权限,目录也可能被删除:在其中放入一个(可能是隐藏的)文件,并使该文件和目录不可写。看这个例子:
[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
它成功了,因为我可以.
随意修改。但如果我尝试对非空子目录进行同样的操作:
[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 权限才能将其删除。