删除用户无权写入的文件背后的逻辑

删除用户无权写入的文件背后的逻辑

当我在主目录中创建一个没有写权限的文件时:

$ umask 777; touch testfile
$ ls -ln testfile
---------- 1 1000 1000 0 2014-03-21 16:52 testfile
$

..然后我仍然可以轻松删除该文件:

$ rm -fv testfile
removed `testfile'
$ 

当我在没有写权限的目录中创建一个没有写权限的文件时,我无法删除此类文件:

$ ls -lnd /var/
drwxr-xr-x 14 0 0 4096 2014-03-21 17:04 /var/
$ ls -ln /var/testfile
---------- 1 1000 1000 0 2014-03-21 17:04 /var/testfile
$ rm -vf /var/testfile 
rm: cannot remove `/var/testfile': Permission denied
$ 

我是否正确地认为写权限是从父目录继承的?读取和执行权限也是如此吗?

答案1

不,权限不是以这种方式继承的。原因略有不同:删除文件不算写入文件 - 它算作写入目录!这就是为什么即使您对文件没有权限也可以删除该文件内容

删除整个文件被认为与编辑它根本不同。对于没有目录写入权限的文件,您可以做的最多的事情就是清空其内容,但您无法删除目录条目,

答案2

删除文件的能力与文件的实际权限无关。这是包含管理此文件的目录的权限。

例子

$ whoami
saml

$ ll -d adir/
drwxrwxr-x. 2 samtest samtest 60 Mar 21 14:35 adir/

$ rm adir/afile 
rm: remove write-protected regular empty file ‘adir/afile’? y
rm: cannot remove ‘adir/afile’: Permission denied

但是,如果我更改权限,使用户saml具有对adir.

$ sudo chmod o+w adir/

现在,如果该用户尝试删除afile

$ rm adir/afile 
rm: remove write-protected regular empty file ‘adir/afile’? y

$ ll adir/
total 0

因此,请记住,读/写/执行文件的能力通过其属性属于文​​件本身。但是,从目录中删除文件的能力是由包含该文件的目录的权限控制的。

答案3

权限不会被继承。一旦进入目录,文件就可以拥有任何权限或所有权。例如,您可以对两个文件夹深度的文件拥有完全权限,但您可能没有进入该目录的权限。对目录的写权限意味着您可以修改文件列表(移动/删除/创建文件),但修改文件内容则不同。目录的读取权限允许您读取文件列表(运行ls)。目录的执行权限意味着您可以cd进入该目录。

例如,如果您对目录的权限是“wx”,您可以创建或删除文件、在其中输入目录,但无法列出其内容(这意味着 bash 中的制表符补全不起作用)。但是,如果子文件夹的权限允许,则可以列出子文件夹的内容。

粘性位是一个例外,它设置后会限制您可以对设置了该位的目录中的文件执行的操作。如果设置了(chmod 1???,其中???是常规权限,例如755),则非授权人员无法删除文件所有者文件或包含目录的权限,即使他有写权限。这对于某些用途很有用(例如/tmp/目录通常以这种方式标记 - 每个人都可以在其中写入,但不能触摸不属于他的东西)。

答案4

目录被称为“目录”是有原因的:因为它们可以工作确切地就像现实生活中的目录一样。如果您想从电话通讯录中删除某人,那么您只需要访问电话通讯录,而不是该人。 (这与“文件夹”不同,如果您想从文件夹中删除文档,则需要访问该文件夹和该文档。)

相关内容