GNU/Linux >> Linux の 問題 >  >> Linux

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

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 上記のコマンドは、このリンク許可を変更できます (内部的に非 POSIX lchown() を使用します)。 これを実現するためのシステム コール)、および 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() を制御します およびリンク トラバーサル。


Linux
  1. Linuxのchmodとchown–Linuxでファイルのパーミッションと所有権を変更する方法

  2. cPanelファイルマネージャーでファイルのアクセス許可を変更する方法

  3. chmodを使用してファイルのパーミッションを変更するにはどうすればよいですか?

  1. Linuxパーミッション:chmodの紹介

  2. Fat32ドライブのファイルパーミッションを変更するには??

  3. setgid を削除するには (linux/unix)?

  1. Linuxでchmodを使用してファイルパーミッションを再帰的に変更する方法

  2. umask は ACL にどのように影響しますか?

  3. UNIX のアクセス許可とファイルの種類について