![删除用户无权写入的文件背后的逻辑](https://linux22.com/image/51796/%E5%88%A0%E9%99%A4%E7%94%A8%E6%88%B7%E6%97%A0%E6%9D%83%E5%86%99%E5%85%A5%E7%9A%84%E6%96%87%E4%BB%B6%E8%83%8C%E5%90%8E%E7%9A%84%E9%80%BB%E8%BE%91.png)
当我在主目录中创建一个没有写权限的文件时:
$ 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
目录被称为“目录”是有原因的:因为它们可以工作确切地就像现实生活中的目录一样。如果您想从电话通讯录中删除某人,那么您只需要访问电话通讯录,而不是该人。 (这与“文件夹”不同,如果您想从文件夹中删除文档,则需要访问该文件夹和该文档。)