ls -l
私は実行結果を見ています/proc/<pid>/fd/
:
lr-x------ 1 root root 64 Apr 22 23:13 0 -> /dev/null
lrwx------ 1 root root 64 Apr 22 23:13 1 -> 'socket:[19700]'
lrwx------ 1 root root 64 Apr 22 23:13 2 -> 'socket:[19700]'
...
シンボリックリンクに対する権限はどういう意味ですか?私の最初の考えは、ファイル記述子の「パターン」を表すことでした。しかし、もしそうなら、なぜstdout
読むことができますか?また、すべての記述子が実行可能なのはなぜですか?
答え1
Linuxの/proc
ファイルシステムは、オブジェクトを実際にはファイルではなくファイルとしてレンダリングします。これは既知のAPIを使用してオブジェクトをファイルにレンダリングします。
ファイル記述子への実際のシンボリックリンクはありません。ただし、シンボリックリンクはファイル記述子に関する情報を表示する便利な方法です。これらのシンボリックリンクは必要に応じて即座に生成されます(VFSにキャッシュされる可能性があるため、通常は最初に表示される日付があります)。通常、Linuxではシンボリックリンクはターゲットを認証するため、常に可能なすべての権限が許可されます。ただし、ここで許可マークは、ファイル記述子が開かれた方法を反映しています。これは、ユーザー(または時々ルート(プロセスがダンプ不可能またはトレース不可能に設定されている場合))が所有しているように見え、アクセス属性が実際に検証されていない場合でも、アクセス属性はユーザーに制限されます(所有権の確認)はい実施、下記参照)。多くの詳細が記録されています。proc(5)
/proc/[pid]/fd/
たとえば、入り口から:
/proc/[pid]/fd/
[...]
パイプとソケットのファイル記述子の場合、エントリはinodeの内容を持つファイルタイプのシンボリックリンクです。このファイルで readlink(2) を呼び出すと、次の形式の文字列が返されます。
タイプ: [インデックスノード]
[...]
このディレクトリのシンボリックリンクを逆参照または読み取る権限(readlink(2))は、ptraceアクセスモードの確認によって制御されます
PTRACE_MODE_READ_FSCREDS
。 ptrace(2) を参照してください。
したがって、同じユーザーに属するプロセスのみを確認できます(または、プロセスがダンプ不可能/処理不可能および他の特別な警告に設定されている場合は確認できません)。
私が文書化していないのは、proc(5)
シンボリックリンクに表示されているアクセス権がファイルディスクリプタの開きproc/[pid]/fd/
方を反映していることが多いということです。したがって、読み取り専用(ls -l /proc/self/fd/9 9</dev/null
)、書き込み専用(ls -l /proc/self/fd/9 9>/dev/null
)、または読み取り/書き込み(ls -l /proc/self/fd/9 9<>/dev/null
)を開くと、それぞれ次のアクセス権が表示されます。
lr-x------
l-wx------
lrwx------
同様に、生成された(名前が指定されていない)パイプを使用すると、pipe(2)
読み取りモードの1つのFDと書き込みモードの1つのFDがあります。ソケットは双方向です。読み取り専用または書き込み専用の「オープン」という概念はなく、実際にはopen(2)
システムコールもありません。lrwx------
読み書きできることを反映していると見なされます。
答え2
man chmod(1)が言った:
chmod はシンボリックリンクの権限を変更しません。 chmod システムコールはその権限を変更できません。シンボリックリンクの権限は絶対に使用されないため、これは問題ではありません。ただし、コマンドラインにリストされているすべてのシンボリックリンクに対して、chmodはポインティングファイルの権限を変更します。
基本的には意味がありません。