ファイルの権限は、そのファイルを削除する機能とは何の関係もないことが簡単にわかります。ディレクトリリストを変更する機能は、ディレクトリの権限によって制御されます。
しかし、長年にわたって、私は書き込み権限の目的が次のことを可能にすることであると信じてきました。改訂するディレクトリの実行権限は「検索」です。つまり、ファイルのリストを表示するか、ディレクトリを変更します。
今日私は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