web-dev-qa-db-ja.com

chmodはいつ失敗しますか?

chmodはどのような状況で失敗しますか?

マニュアルページを確認しましたが、使用方法が指定されているだけであり、動作しない状況については詳しく説明していません。

chmodは次の場合に機能すると思います。

  • あなたは根です
  • あなたはターゲットファイルを所有しています(そして平凡なモードビットを設定しています、つまりスティッキービットではありません、他のもの)

ユーザーはchmodを使用して、グループアクセス権を持つファイルの権限を変更できますか?読み取り/書き込みアクセスに関連していますか?

8
Wug

ファイルの所有者またはrootユーザーのみがファイルの権限を変更できます。ファイルまたはその親ディレクトリの現在の権限は関係ありません¹。これは [〜#〜] posix [〜#〜] で指定されます:

アプリケーションは、プロセスの実効ユーザーIDがファイルの所有者と一致するか、プロセスがこれを行うための適切な特権を持っていることを確認する必要があります。

ほとんどのuniceでは、「適切な特権」はrootとして実行することを意味します。これらの条件が満たされていない場合、chmodは通常EPERMで失敗しますが、セキュリティ違反のためにプログラムを中止するなどの他の動作は許可されます。

さらに、一部のUNIXバリアントには、chmodを承認または禁止するシステム固有の方法があります。たとえば、Linuxには capabilityCAP_FOWNER)所有者に関係なく、プロセスがファイルのアクセス許可およびその他のメタデータを変更できるようにします。

ファイルが存在し、アクセス可能で、適切な所有者がいるにもかかわらず、chmodが失敗する理由は他にもあります。一般的なものには、読み取り専用ファイルシステム、またはFATなどの権限をサポートしないファイルシステムが含まれます。それほど一般的ではないものには、Linuxのext2ファイルシステムおよび後続バージョンでの immutable attribute などのシステム固有の制限が含まれます。

¹ chmodを実行しているプロセスがファイルにアクセスできる必要がある場合を除き、ファイルを含むディレクトリと、そのために通過する他のディレクトリに対する実行権限が必要です。

必要な詳細は、chmod()システムコールのマニュアルページにあります。の代わりに man chmod 使用する man 2 chmodman chattrおよびman 2 setxattrもあなたの興味を引きます。 chattr/setxattr()が設定するファイル属性は、chmodによって設定される従来のUnix権限の動作を補強します。

2
Kyle Jones

UNIX標準によれば、「プロセスの実効ユーザーIDはファイルの所有者と一致する必要があります。そうでない場合、プロセスにはこれを行うための適切な特権が必要です。」

適切な特権についてのビットはいくつかの説明が必要です。従来のシステムでは、プロセスの実効UID(LinuxではファイルシステムUID。ただし、以下を参照)が0の場合、すべてのファイルでchmodが許可されます。ルート]。

Linuxには capabilities というシステムがあり、_CAP_FOWNER_ビットはすべてのファイルでchmodを使用する機能を制御します。デフォルトでは、execve()呼び出しがルートプロセスを作成するとき(setuidバイナリを実行するか、実UIDが0のとき)、または実効UIDが0に設定されているとき(および、がゼロ以外の値に設定されている場合)、およびファイルシステムのUIDが0に設定されている場合は_CAP_FOWNER_を含む一連の機能が有効になります(ゼロ以外の値に設定されている場合は無効になります)。詳細については、マンページをお読みください。

スティッキービットについて言及しましたが、ユーザーがファイルに割り当てられているグループに属していない場合でも、ユーザーがファイルにsetgidビットを設定できない可能性があるという事実は省略しました。 setuidまたはsetgidビットは、追加の実装定義の状況では無視される場合もあります。

1
Random832

ユーザーはchmodを使用して、グループアクセス権を持つファイルの権限を変更できますか?

見てみてみませんか?

$ touch foo
$ Sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted
0
dubiousjim