chmod
の呼び方次第 および実行しているプラットフォーム。
たとえば、Linux システムでは man chmod
です。 こう言っています:
chmod
シンボリック リンクのアクセス許可を変更することはありません。 chmod
システムコールはそれらのパーミッションを変更できません。シンボリック リンクのアクセス許可は使用されないため、これは問題ではありません。ただし、コマンドラインにリストされたシンボリックリンクごとに、 chmod
指定されたファイルの権限を変更します。対照的に、chmod
再帰的なディレクトリ トラバーサル中に検出されたシンボリック リンクを無視します。
ただし、Mac では、chmod を使用して、次のようなオプションを使用してシンボリック リンクのアクセス許可を変更できます (man chmod
から)。 ):
-h ファイルがシンボリック リンクの場合、リンクが指すファイルではなく、リンク自体のモードを変更します。
例として、この回答の残りの部分で Linux マシンを使用していると仮定します。
最初のケースで chmod -R 777 directory
を実行した場合 パーミッションを再帰的に変更する場合、リンク ターゲットは影響を受けませんが、 chmod 777 directory/*
を行うと
リンク ターゲットのアクセス許可を直接変更すると、それらのアクセス許可は引き継がれます (man ページと baraboom が言うように、実際のリンク アクセス許可は何にも使用されないため)。
説明のためのテスト ログ:
$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
baraboom と peth の答えはどちらも正しい:シンボリック リンク自体の許可ビットは無関係であり (macOS を除く。以下を参照)、シンボリック リンクの許可を変更する – chmod
による コマンドライン ツールまたは chmod()
システム コール – シンボリック リンクのターゲットに対して実行されたかのように動作します。
symlink() システムコールの SUSv4/POSIX.1-2008 の説明を引用するには:
<ブロック引用>作成されたシンボリック リンクのファイル モード ビットの値は指定されていません。 POSIX.1-2008 で指定されたすべてのインターフェイスは、st_mode で返されるファイル モード ビットの値を除いて、シンボリック リンクの内容を常に読み取ることができるかのように動作します。 stat のフィールド 構造が指定されていません。
ここで、「未指定」は実装ごとに解釈の余地があります。仕様:
- Linux (ext4fs を使用してテスト済み) では、
stat()
st_mode=0777
を返します 、シンボリックリンクが作成されたときの umask に関係なく。ls -l
したがって、常にlrwxrwxrwx
と表示されます シンボリック リンク用。 - macOS (HFS) および FreeBSD (UFS と ZFS の両方) では、シンボリック リンクには独自のアクセス許可があります:
chmod -h
上記のコマンドは、このリンク許可を変更できます (内部的に非 POSIXlchown()
を使用します)。 これを実現するためのシステム コール)、およびstat()
システムコールはst_mode
に対してこの値を返します .
POSIX で指定されているように、Linux と FreeBSD のシンボリック リンクは常にたどることができます。特に FreeBSD では、これはシンボリック リンクのファイル モードがアクセス制御にまったく影響を与えないことを意味します。
一方、macOS は POSIX をわずかに破っています。シンボリック リンクは読み取り許可に関係なくたどることができますが、 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()
を制御します およびリンク トラバーサル。