ファイルの inode しか知らないのに、その inode にリンクしているファイルを検索せずにファイルにアクセスできないのはなぜですか? ファイルへのハード リンクには、ファイルに関するすべての実際の情報を含む inode の場所を示す名前と番号だけが含まれています。ファイルを開くために inode 番号を直接使用するユーザーモードの方法がないと言われたとき、私は驚きました。
これは、システムが提供する無害で便利な機能のように思えます。なぜ提供されないのですか?
ファイルの inode しか知らないのに、その inode にリンクしているファイルを検索せずにファイルにアクセスできないのはなぜですか? ファイルへのハード リンクには、ファイルに関するすべての実際の情報を含む inode の場所を示す名前と番号だけが含まれています。ファイルを開くために inode 番号を直接使用するユーザーモードの方法がないと言われたとき、私は驚きました。
これは、システムが提供する無害で便利な機能のように思えます。なぜ提供されないのですか?
セキュリティ上の理由 -- ファイルにアクセスするには、ファイルにアクセスするために必要なルートからすべてのディレクトリを検索するためのパーミッションと同様に、ファイルに対するパーミッションが必要です。i ノードでファイルにアクセスできる場合は、ファイルを含むディレクトリのチェックをバイパスできます。
これにより、一連のユーザー (または一連のグループ) がアクセスできるファイルを作成でき、他のユーザーはアクセスできなくなります。ユーザーのみがアクセスできるディレクトリ (ユーザーごとに 1 つのディレクトリ) を作成し、その後ハード-ファイルをこれらすべてのディレクトリにリンクします。ファイル自体には誰でもアクセスできますが、実際には、リンク先のディレクトリのいずれかに対する検索権限を持つユーザーのみがアクセスできます。
一部のオペレーティング システムにはその機能があります。たとえば、OS X ではCarbon File Managerをサポートするために必要であり、Linux ではdebugfs
. もちろん、任意の UNIX で を介してコマンドラインからfind -inum
実行できますが、inode でファイルにアクセスできない本当の理由は、特に有用ではないからです。読み取りまたは実行できないフォルダーに読み取り可能なファイルがある場合、inodeを開くとそれを検出できるため、ファイルのアクセス許可を回避します。
あまり役に立たない理由は、呼び出しを介して inode 番号を見つける必要があるためです。*stat()
その時点で、既にファイル名 (または開いている fd)を持っているか、inum を推測する必要があります。
Btrfs にはそのための ioctl があります (このパッチでBTRFS_IOC_INO_PATHSが追加されました) が、パスに沿ったアクセス許可をチェックしようとせず、単にルートに予約されています。
あなたのコメントへの回答: 「ファイルを渡す」には、 fd を使用して AF_LOCAL ソケットを渡すことができますSCM_RIGHTS
( を参照man 7 unix
)。