![touch 命令无法在允许写入的目录中创建文件](https://linux22.com/image/219143/touch%20%E5%91%BD%E4%BB%A4%E6%97%A0%E6%B3%95%E5%9C%A8%E5%85%81%E8%AE%B8%E5%86%99%E5%85%A5%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6.png)
这是我的用户
$ id
uid=1000(pzk) gid=1000(pzk) groups=1000(pzk)
这是我的目录结构
$ ls -tlrh
total 12K
d-w--w--w- 2 root root 4.0K Apr 13 10:53 write-for-everyone
dr--r--r-- 2 root root 4.0K Apr 13 10:53 read-for-everyone
d--x--x--x 2 root root 4.0K Apr 13 10:53 execute-for-everyone
根据给定的 write-foreveryone 权限,我应该能够在 write-foreveryone 中创建一个文件。但我不是。
$ touch write-for-everyone/x
touch: cannot touch 'write-for-everyone/x': Permission denied
请帮我解决这个问题。
答案1
目录上的位w
控制对目录中文件名列表的更改,从而创建、重命名和删除文件。但任何这些操作都还涉及访问目录中的文件本身,为此,x
需要权限。涉及的系统调用类似于open("dir/file1", O_WRONLY | O_CREAT)
.如果没有该位,则w
不会提供任何访问x
权限。
另一方面,读取目录中的文件列表仅适用于该r
位,因为这只需要访问目录本身,而不需要访问其中的文件。涉及的系统调用类似于open("dir", O_RDONLY)
.
从某种意义上说,x
目录上的位dir
控制着像dir/somefile
.