「私が逃したものは何ですか」

「私が逃したものは何ですか」

私が理解したように、ディレクトリに対する「読み取り」権限はすべてのディレクトリのリストを受け入れます。名前そのディレクトリ内にはそれがすべてです。

FS設計の一般的な理解によれば、ディレクトリがファイルとして保存される場合、そのコンテンツには少なくともファイル名に加えてそのinodeへの参照を含める必要があります。 Unixの「すべてはファイルです」という哲学を使用して、「読み取り」権限はディレクトリ自体の「ファイルの内容」へのアクセスを許可します。しなければならない各ファイルのinode番号を検索すれば十分です。しかし、これは事実ではありません。

私がここで何を見逃しているのでしょうか?

ベストアンサー1

〜のように@muruが言った。ディレクトリの内容を読み取ると(ディレクトリが初期のUnicesなどの一般的なファイルとして実装されているかどうかにかかわらず)、inode番号(LinuxだけでなくすべてのPOSIXシステムでも)を確実に取得できます。

できないと思わせるのは、努力したからかもしれません。

ls -i dir

あなたが所有しているディレクトリに読むしかし、探すライセンスを確認し、以下を確認してください。

file1: Permission denied
file2: Permission denied

これは、実装が単にアイテムを印刷するのではなく、返された各アイテムに対して操作を実行しようとするlsためです。lstat()readdir()d_ino

すべての実装がこれを行うわけではありません。たとえば、lsksh93の組み込み関数(ビルド時に含まれていて使用されている場合builtin ls)は、各ファイルをingの代わりにd_inoingとして返された内容を印刷します。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/lsls

Aはとにかくファイルに対して行われますls -id some/filelstat()ksh93はls実際にstat()POSIXと互換性がないようにするためにaを行います)。

$ ls -id /boot
     2 /boot

(ksh93とGNUの両方を使用ls

おすすめ記事