質問: ファイルパーミッションはシンボリックリンクにどのように適用されますか? あなたがこの構造を持っているとしましょう:+ directory -- file1 -- file2 -- file3 -> /tmp/file3 file3は、システム上の別の場所にある別のfile3へのリンクです。それでは、ディレクトリとその中のすべてのコンテンツをchmod 777と言いましょう。 file3内の私の/tmpはそれらの許可を受けますか?また、状況は同じだが逆になったとしましょう。/tmp/file3 -> /directory/file3 リンク先のファイルにアクセス許可を適用した場合、リンクにどのような影響がありますか?
回答: baraboomとpethの答えはどちらも正しいです。シンボリックリンク自体のパーミッションビットは無関係で(macosを除く。下記参照)、シンボリックリンクのパーミッションを変更する - chmodコマンドラインツールまたはchmod()システムコールで - シンボリックリンクのターゲットに対して実行されたかのように動作します。 symlink()システムコールのsusv4/posix.1-2008記述を引用するには : 作成されたシンボリックリンクのファイルモードビットの値は指定されていません。 posix.1-2008で規定されているすべてのインタフェースは、シンボリックリンクの内容を常に読み取ることができるかのように動作します。ただし、ファイルモードビットの値は/のst_modeフィールドに返されます。statstructureは指定されていません。 ここで、「未指定」は各実装の解釈の余地を残します。詳細: linux(ext4fsを使用してテスト済み)では、シンボリックリンクが作成されたときのumaskの内容にかかわらず、stat()はst_mode=0777を返します。したがってls -lは、シンボリックリンクの場合は常にlrwxrwxrwxを表示します。 macos(hfs)とfreebsd(ufsとzfsの両方)では、シンボリックリンクはそれ自身の許可を持っています:これを達成するために内部的にposix以外のlchown()システムコールを使う上記のchmod -hコマンドは変更できますstat()システムコールはst_modeに対してこの値を返します。 posixで規定されているように、linuxとfreebsdのシンボリックリンクはいつでもたどることができます。特にfreebsdでは、これはシンボリックリンクのファイルモードがアクセス制御にまったく影響しないことを意味します。一方、macosはposixをわずかに壊します。読み取り権限に関係なくシンボリックリンクをたどることができますが、ユーザーに読み取り権限がない場合、readlink()はeacces(permission denied)で失敗します。$ sudo ln -shf target symlink $ sudo chmod -h 444 symlink $ ls -l symlink lr--r--r-- 1 root staff 1 mar 14 13:05 symlink -> target $ sudo chmod -h 000 symlink $ ls -l symlink ls: symlink: permission denied l--------- 1 root staff 1 mar 14 13:05 symlink $ echo kthxbye > target $ cat symlink kthxbye (2番目の-> targetコマンドからの出力にls -l部分が欠落していること、およびユーザーがtargetに対する読み取り許可を持っていなくてもcat symlinkは引き続き成功し、symlinkファイルの内容を印刷したことに注意してください。)netbsdは明らかにsympermという特別なマウントオプションを提供しています。これが設定されていると、シンボリックリンクの読み取り/実行パーミッションがreadlink()とリンクトラバーサルを制御するようになります。