Linux / POSIXにlchownがあるのにlchmodがないのはなぜですか?


11

これは、Linuxがサポートしてシンボリックリンク(すなわちの所有者を変更するようだlchown)が、シンボリックリンクのモード/許可を変更する(つまりlchmod)されるサポートされていません。私が見る限り、これはPOSIXに準拠しています。ただし、これらの操作のどちらか一方だけをサポートするのではなく、両方をサポートする理由がわかりません。この背後にある動機は何ですか?


1
シンボリックリンクの権限は常にlrwxrwxrwxです。A chmodはここでは意味がありません。リンクをたどると、ターゲットの権限にアクセスできます。
ott-- 2015

2
@ott:Linuxでは、Linuxがをサポートしていないため、シンボリックリンクのアクセス許可は常に正確に付与したものですlchmod。しかし、他のUnixライクなOS(Mac OS Xなど)はサポートしているため、LinuxがサポートするのにLinuxがサポートしないのはなぜですかlchown
Florian Brucker

回答:


9

Linuxは、ほとんどのUnixライクなシステム(Apple OS / Xはまれな例外の1つです)と同様に、たとえばターゲットを解決する際にシンボリックリンクのアクセス許可を無視します。

ただし、他のファイルと同様に、シンボリックリンクの所有権はt、などのビットが設定されているディレクトリ内のエントリの名前を変更したり、リンクを解除したりする場合に重要/tmpです。

でファイル(シンボリックリンクかどうかに関係なく)を削除または名前を変更するには、ファイル/tmpの所有者である必要があります。これが、シンボリックリンクの所有権を変更したい(リンク解除/名前変更のアクセス許可を付与または削除する)ための1つの理由です。

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

また、Mark Plotnickが現在削除した回答で述べたように、バックアップおよびアーカイブアプリケーションはlchown()、シンボリックリンクを元の所有者に復元する必要があります。別のオプションは、シンボリックリンクを作成する前にeuidとegidを切り替えることですが、それは効率的ではなく、シンボリックリンクが抽出されるディレクトリでの正しい管理を複雑にします。


これが本来の動機であるかどうかはわかりませんが、デザインが役立つ理由はあります。ありがとう!
Florian Brucker

0

posixにはlchmod()はありませんが、シンボリックリンクの権限を設定できるfchmodat()があります。これはまだ評価されるためにシンボリックリンクの許可を必要としません。


1
OP lchmodは、POSIXに準拠していないことを認識しています。この答えは、まだ問題になっていないことを何を追加しますか?
muru、2015

opはなぜ関数の1つだけがサポートされているのかと尋ね、私は説明された名前ではなく、事実上両方が利用できることを説明しました。
schily 2015

1
どうして?標準によると一部の実装では、シンボリックリンクのモードを変更できます。これは、POSIX仕様のインターフェースではサポートされていません。そのようなサポートを備えたシステムは、lchmod()という名前のインターフェースを提供します。このような実装をサポートするために、fchmodat()にはフラグパラメーターがあります。これは、実装がシンボリックリンクのパーマを変更できるようにするfchmodatのフラグがあることを示しています。必ずしもできるわけではありません。
muru 2015

正解です。シンボリックリンクの権限は35年以降評価されていないため、モードを変更しても意味がありません。Fchmodat()は、直交性のために存在します。シンボリックリンクの設定可能なタイムスタンプは人間がディレクトリツリーを理解するのに役立つため、唯一の真の利点はfutimensat()でした。
schily 2015

@ schilly、OS / Xはシンボリックリンクの権限を尊重します。そこには、読み取り権限がない場合、ターゲットを解決できません。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.