私が理解したように、ディレクトリに対する「読み取り」権限はすべてのディレクトリのリストを受け入れます。名前そのディレクトリ内にはそれがすべてです。
FS設計の一般的な理解によれば、ディレクトリがファイルとして保存される場合、そのコンテンツには少なくともファイル名に加えてそのinodeへの参照を含める必要があります。 Unixの「すべてはファイルです」という哲学を使用して、「読み取り」権限はディレクトリ自体の「ファイルの内容」へのアクセスを許可します。しなければならない各ファイルのinode番号を検索すれば十分です。しかし、これは事実ではありません。
私がここで何を見逃しているのでしょうか?
ベストアンサー1
〜のように@muruが言った。ディレクトリの内容を読み取ると(ディレクトリが初期のUnicesなどの一般的なファイルとして実装されているかどうかにかかわらず)、inode番号(LinuxだけでなくすべてのPOSIXシステムでも)を確実に取得できます。
できないと思わせるのは、努力したからかもしれません。
ls -i dir
あなたが所有しているディレクトリに読むしかし、探すライセンスを確認し、以下を確認してください。
file1: Permission denied
file2: Permission denied
これは、実装が単にアイテムを印刷するのではなく、返された各アイテムに対して操作を実行しようとするls
ためです。lstat()
readdir()
d_ino
すべての実装がこれを行うわけではありません。たとえば、ls
ksh93の組み込み関数(ビルド時に含まれていて使用されている場合builtin ls
)は、各ファイルをingの代わりにd_ino
ingとして返された内容を印刷します。readdir()
lstat()
ls
ほとんどの実装でinode番号検索を使用する1つの理由は、おそらくマウントポイントであるlstat()
ファイルに対して誤ったinode番号を取得することが多いからです。
% ksh93 -o emacs
$ builtin ls
$ /bin/ls -i /
21 bin 28 home-blank 6 lost+found 22 root 5 tmp
2 boot 9 home-test 26 media 1 run 2 u
8 cdrom 14 lib 17 mnt 15 sbin 13 usr
1 dev 23 lib32 855691 opt 25 snap 229376 var
19 etc 20 lib64 34 pool0 18 srv
34 home 4 libx32 1 proc 1 sys
$ ls -i /
21 bin 28 home-blank 6 lost+found 22 root 5 tmp
24 boot 9 home-test 26 media 12 run 2 u
8 cdrom 14 lib 17 mnt 15 sbin 13 usr
3 dev 23 lib32 855691 opt 25 snap 229376 var
19 etc 20 lib64 11 pool0 18 srv
265966 home 4 libx32 7 proc 16 sys
ksh93の組み込み関数がルートファイルシステム内のマウントポイント(たとえば/boot
、、、/proc
上/sys
)であるファイルのinode番号と(私の場合はGNU)、そのファイルの有効なinode番号、つまりinode番号を提供する方法を理解します。ルートファイルシステムの番号とファイルシステムがインストールされているディレクトリ。ls
/bin/ls
ls
Aはとにかくファイルに対して行われますls -id some/file
(lstat()
ksh93はls
実際にstat()
POSIXと互換性がないようにするためにaを行います)。
$ ls -id /boot
2 /boot
(ksh93とGNUの両方を使用ls
)