web-dev-qa-db-ja.com

読み取り権限のあるディレクトリを一覧表示できないのはなぜですか?

私はディレクトリdとその中にファイルfを作成しました。次に、そのディレクトリに対する読み取り権限のみを自分に与えました。これはファイルを一覧表示できることを意味する必要があることを理解しています(例: here )が、できません。

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

書き込みと実行のアクセス許可を変更すると、ファイルが表示されます。

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

どうしてこれなの? MacOSを使用しています。

編集:@ccornの回答を参照して、私が魚を使用していることは適切であり、type lsは以下を提供します:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end
14
wrgrs

lsが必要以上のことを試みないようにするためのいくつかの準備:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

rディレクトリ権限のデモ:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

従来のUnixファイルシステムでは、ディレクトリは単に(名前、iノード番号)ペアのリストでした。 iノード番号は、残りのファイルメタデータが格納されるファイルシステムのiノードテーブルへのインデックスとして使用される整数です。

ディレクトリのr権限は、その中の名前をlistすることを許可しますが、iノードテーブルに格納されている情報にはアクセスできません。ファイルの種類、ファイルの長さ、ファイルのアクセス許可などを取得する、またはファイルを開く。そのためには、ディレクトリに対するx権限が必要です。

これが理由です ls -lls -Fls、色分けされた出力などはx権限なしで失敗しますが、単なるlsは成功します。

x権限だけでiノードアクセスが許可されます。つまり、そのディレクトリ内で明示的な名前が指定されている場合、xはそのiノードを検索してそのディレクトリエントリのメタデータにアクセスできます。

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

したがって、ファイルを開くには/a/b/c/fまたはそのメタデータのリスト、ディレクトリ//a/a/b/a/b/cにはx権限を付与する必要があります。

当然のことながら、ディレクトリエントリを作成するには、wxの両方の権限が必要です。

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

Wikipediaの ファイルシステムのアクセス許可 に関する記事に簡単な概要があります。

8
ccorn

ディレクトリを読み取るには、そのディレクトリ(xビット)をトラバースできる必要もあります。したがって、ディレクトリに何らかの方法でアクセスできるようにするには、最低でもr-xが必要です。

4
Soruk