ファイル許可はシンボリックリンクにどのように適用されますか?


93

この構造があるとしましょう:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3file3システム上の別の場所へのリンクです。

ここでchmod 777、ディレクトリとその中のすべてのコンテンツについて説明します。私のfile3in /tmpはそれらの許可を受け取りますか?また、同じ状況にあるが、逆転したとしましょう。

/tmp/file3 -> /directory/file3

リンク先のファイルにアクセス許可を適用すると、リンクにどのような影響がありますか?


パーミッションはファイルにのみ影響し、シンボリックリンクには影響しません。
バラブーム

回答:


90

それはあなたがどのように電話をかけるかchmod、そしてあなたが走っているプラ​​ットフォームに依存します。

たとえば、Linuxシステムでman chmodは、次のように言います。

chmod シンボリックリンクのアクセス許可を変更しないでください。chmod システムコールは、自分の権限を変更することはできません。シンボリックリンクの権限は使用されないため、これは問題ではありません。ただし、コマンドラインにリストされている各シンボリックリンクchmodに対して、ポイント先のファイルのアクセス許可を変更します。対照的に、 chmod再帰的なディレクトリトラバーサル中に発生したシンボリックリンクは無視されます。

ただし、Macでは、chmodを使用して、(fromから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

2
それは私にとっても驚きでした。次の質問:シンボリックリンクのパーミッション誰になりますか?
エドワードフォーク

@EdwardFalkシンボリックリンクのアクセス許可は、リンクされたファイルからアクセス許可を取得するためにすべてを横断できる必要があるため、制限されません。
ウォルフ

5

baraboomとpethの答えはどちらも正しいです:シンボリックリンク自体の許可ビットは無関係です(macOSを除く。以下を参照)。シンボリックリンクの許可を変更するには、chmodコマンドラインツールまたはchmod()システムコールによって-シンボリックリンクのターゲットに対して実行された場合。

symlink()システムコールのSUSv4 / POSIX.1-2008の説明を引用するには

作成されたシンボリックリンクのファイルモードビットの値は指定されていません。POSIX.1-2008で指定されたすべてのインターフェイスは、stat構造体のst_modeフィールドで返されるファイルモードビットの値が指定されていないことを除き、シンボリックリンクの内容を常に読み取ることができるかのように動作します。

ここで、「指定なし」は、実装ごとに解釈の余地を残します。詳細:

  • Linux(ext4fsを使用してテスト済み)では、symlinkが作成されたときのumaskが何であれ、をstat()返しますst_mode=0777ls -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

-> target2番目のls -lコマンドからの出力では一部が欠落していることに注意してください。ユーザーが読み取り許可を持っていなくてもcat symlinktargetファイルの内容は成功し、印刷されsymlinkます。)

NetBSDは、symperm設定されている場合、シンボリックリンクの読み取り/実行許可を制御しreadlink()、トラバーサルをリンクする特別なマウントオプションを明らかに提供します。


-1
  1. リンクファイルをドロップします(プロセスによって使用されていないことを確認した後)
  2. 777-umask = required file permissionsとなるようにumaskを設定します
  3. リンクファイルを新たに作成する

3
これは質問にどのように答えますか?
jww
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.