파일의 권한은 해당 파일을 삭제하는 기능과 아무 관련이 없다는 것을 쉽게 알 수 있습니다. 디렉토리 목록을 수정하는 기능은 디렉토리의 권한에 의해 제어됩니다.
그러나 수년에 걸쳐 나는 쓰기 권한의 목적이 다음을 허용하는 것이라고 믿어 왔습니다.개정하다디렉터리의 실행 권한은 "검색"입니다. 즉, 파일 목록을 표시하거나 디렉터리를 변경합니다.
오늘 나는 rm
디렉토리에서 파일을 찾았습니다.둘 다쓰기 및 실행 비트가 설정됩니다. 실제로 실행 세트가 없으면 쓰기는 거의 쓸모가 없습니다.
$ tree foo/
foo/
└── file_to_delete
0 directories, 1 file
$ chmod -x foo
$ ls -ld foo
drw-rw-r-- 2 ire_and_curses users 4096 Sep 18 22:08 foo/
$ rm foo/file_to_delete
rm: cannot remove ‘foo/file_to_delete’: Permission denied
$ chmod +x foo/
$ rm foo/file_to_delete
$ tree foo/
foo/
0 directories, 0 files
$
나는 이 행동이 매우 놀랍다고 생각한다. 디렉토리의 경우 글쓰기가 실제로 유용하기 위해서는 구현해야 하는 이유는 무엇입니까?
답변1
실행 비트가 없으면 stat()
디렉터리의 파일에 대해 실행할 수 없습니다. 즉, 해당 파일에 대한 inode 정보를 확인할 수 없습니다. 파일을 삭제하려면 알아야 합니다 stat()
.
이에 대한 시연:
$ ls -ld test
drw------- 2 alienth alienth 4096 Sep 18 23:45 test
$ stat test/file
stat: cannot stat ‘test/file’: Permission denied
$ strace -e newfstatat rm test/file
newfstatat(AT_FDCWD, "test/file", 0x1a3f368, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
newfstatat(AT_FDCWD, "test/file", 0x7fff13d4f4f0, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
rm: cannot remove ‘test/file’: Permission denied
+++ exited with 1 +++
간단한 ls -l
.
$ ls -l test
ls: cannot access test/file: Permission denied
total 0
-????????? ? ? ? ? ? file