baraboomとpethの答えはどちらも正しいです:シンボリックリンク自体の許可ビットは無関係です(macOSを除く。以下を参照)。シンボリックリンクの許可を変更するには、chmod
コマンドラインツールまたはchmod()
システムコールによって-シンボリックリンクのターゲットに対して実行された場合。
symlink()システムコールのSUSv4 / POSIX.1-2008の説明を引用するには:
作成されたシンボリックリンクのファイルモードビットの値は指定されていません。POSIX.1-2008で指定されたすべてのインターフェイスは、stat構造体のst_modeフィールドで返されるファイルモードビットの値が指定されていないことを除き、シンボリックリンクの内容を常に読み取ることができるかのように動作します。
ここで、「指定なし」は、実装ごとに解釈の余地を残します。詳細:
- Linux(ext4fsを使用してテスト済み)では、symlinkが作成されたときのumaskが何であれ、を
stat()
返しますst_mode=0777
。ls -l
したがってlrwxrwxrwx
、シンボリックリンクの場合は常に表示されます。
- MacOSの(HFS)とFreeBSD(UFSとZFSの両方)には、シンボリックリンクは独自の権限を持っているん:
chmod -h
コマンドは(内部的に非POSIXの使用は、このリンク許可に変更することができます上記のlchown()
これを達成するためのシステムコールを)、およびstat()
システム呼び出しは、この値を返しますst_mode
。
POSIXで指定されているように、LinuxおよびFreeBSDのシンボリックリンクは常にたどることができます。特に、FreeBSDでは、これはシンボリックリンクのファイルモードがアクセス制御にまったく影響しないことを意味します。
一方、macOSはPOSIXをわずかに破壊します。読み取り許可に関係なくシンボリックリンクをたどることができますが、ユーザーに読み取り許可がない場合は(Permission denied)でreadlink()
失敗しEACCES
ます。
$ 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
(-> target
2番目のls -l
コマンドからの出力では一部が欠落していることに注意してください。ユーザーが読み取り許可を持っていなくてもcat symlink
、target
ファイルの内容は成功し、印刷されsymlink
ます。)
NetBSDは、symperm
設定されている場合、シンボリックリンクの読み取り/実行許可を制御しreadlink()
、トラバーサルをリンクする特別なマウントオプションを明らかに提供します。