我对权限的理解今天已被破坏。
evaben@evaben /t/test> ll
total 16K
drwxr-xr-x 4 evaben evaben 4.0K Mar 13 12:44 ./
drwxrwxrwt 19 root root 4.0K Mar 13 12:43 ../
drwxr-xr-x 2 evaben evaben 4.0K Mar 13 12:44 mine/
drwxr-xr-x 2 root root 4.0K Mar 13 12:44 theirs/
我拥有CWD和mine
,并且对两者都有写权限。
evaben@evaben /t/test> mv mine theirs/
mv: cannot move 'mine' to 'theirs/mine': Permission denied
我当然不能将目录移到它们的目录中;我在theirs
中没有写权限。
evaben@evaben /t/test [1]> mv theirs/ mine/
mv: cannot move 'theirs/' to 'mine/theirs': Permission denied
为什么我不能将theirs
移到mine
中?我可以编写CWD和目标(mine
)。我不会以任何方式修改theirs
。
evaben@evaben /t/test [1]> sudo chmod o+w theirs/
evaben@evaben /t/test> mv theirs/ mine/
(works)
如果我拥有他们的写许可,我可以制作MV。
维基百科的解释是:
为目录设置时,此(写)权限授予该功能 修改目录中的条目(包括创建文件), 删除文件,然后重命名文件。
Arch Wiki声明类似,这似乎加强了我的(显然是错误的)理解。
为了进一步遮盖我的大脑,它可以像我期望的那样工作:
evaben@evaben /t/test> ll
total 12K
drwxr-xr-x 3 evaben evaben 4.0K Mar 13 13:04 ./
drwxrwxrwt 19 root root 4.0K Mar 13 12:43 ../
drwxr-xr-x 3 evaben evaben 4.0K Mar 13 13:03 mine/
-rw-r--r-- 1 root root 0 Mar 13 13:04 their_file
evaben@evaben /t/test> mv their_file mine/
(worked)
编辑:
我尝试直接使用重命名(2)。
rename("theirs", "mine");
Works IFF mine
为空。 -有效地取代了我的。如果我有文件; ENOTEMPTY 39 Directory not empty
。
rename("theirs", "mine/theirs");
给出EACCES 13 Permission denied
。这既是我想要做的,也是mv
所提供的-显然不是mv
中的错误(据我所知仍然是错误)。
答案 0 :(得分:1)
我认为rename(2)手册页中的解释如下:
ERRORS
EACCES Write permission is denied for the directory containing oldpath or newpath, or, search per‐
mission is denied for one of the directories in the path prefix of oldpath or newpath, or
oldpath is a directory and does not allow write permission (needed to update the ..
entry). (See also path_resolution(7).)
显然,为了将theirs
移至mine
,您需要具有更新..
上的theirs
链接的权限。
答案 1 :(得分:-1)
“我不会以任何方式修改
theirs
。”
不太正确。 mv
过程的一部分是从其原始位置删除文件。这意味着您需要该原始位置的写权限,而您没有该权限。尝试改用cp
。