私はディレクトリ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
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 -l
、ls -F
、ls
、色分けされた出力などは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
権限を付与する必要があります。
当然のことながら、ディレクトリエントリを作成するには、w
とx
の両方の権限が必要です。
$ 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の ファイルシステムのアクセス許可 に関する記事に簡単な概要があります。
ディレクトリを読み取るには、そのディレクトリ(xビット)をトラバースできる必要もあります。したがって、ディレクトリに何らかの方法でアクセスできるようにするには、最低でもr-xが必要です。