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

Mar*_*tin 8 permissions rm

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

$ umask 777; touch testfile
$ ls -ln testfile
---------- 1 1000 1000 0 2014-03-21 16:52 testfile
$
Run Code Online (Sandbox Code Playgroud)

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

$ rm -fv testfile
removed `testfile'
$ 
Run Code Online (Sandbox Code Playgroud)

当我创建一个对我没有写权限的目录没有写权限的文件时,我无法删除这样的文件:

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

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

Kil*_*oth 16

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

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


slm*_*slm 6

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

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改权限,使用户samladir.

$ sudo chmod o+w adir/
Run Code Online (Sandbox Code Playgroud)

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

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

$ ll adir/
total 0
Run Code Online (Sandbox Code Playgroud)

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