chmod
はどのような状況で失敗しますか?
マニュアルページを確認しましたが、使用方法が指定されているだけであり、動作しない状況については詳しく説明していません。
chmod
は次の場合に機能すると思います。
ユーザーはchmod
を使用して、グループアクセス権を持つファイルの権限を変更できますか?読み取り/書き込みアクセスに関連していますか?
ファイルの所有者またはrootユーザーのみがファイルの権限を変更できます。ファイルまたはその親ディレクトリの現在の権限は関係ありません¹。これは [〜#〜] posix [〜#〜] で指定されます:
アプリケーションは、プロセスの実効ユーザーIDがファイルの所有者と一致するか、プロセスがこれを行うための適切な特権を持っていることを確認する必要があります。
ほとんどのuniceでは、「適切な特権」はrootとして実行することを意味します。これらの条件が満たされていない場合、chmod
は通常EPERM
で失敗しますが、セキュリティ違反のためにプログラムを中止するなどの他の動作は許可されます。
さらに、一部のUNIXバリアントには、chmod
を承認または禁止するシステム固有の方法があります。たとえば、Linuxには capability (CAP_FOWNER
)所有者に関係なく、プロセスがファイルのアクセス許可およびその他のメタデータを変更できるようにします。
ファイルが存在し、アクセス可能で、適切な所有者がいるにもかかわらず、chmod
が失敗する理由は他にもあります。一般的なものには、読み取り専用ファイルシステム、またはFATなどの権限をサポートしないファイルシステムが含まれます。それほど一般的ではないものには、Linuxのext2ファイルシステムおよび後続バージョンでの immutable attribute などのシステム固有の制限が含まれます。
¹ chmod
を実行しているプロセスがファイルにアクセスできる必要がある場合を除き、ファイルを含むディレクトリと、そのために通過する他のディレクトリに対する実行権限が必要です。
必要な詳細は、chmod()システムコールのマニュアルページにあります。の代わりに man chmod
使用する man 2 chmod
。 man chattr
およびman 2 setxattr
もあなたの興味を引きます。 chattr/setxattr()が設定するファイル属性は、chmodによって設定される従来のUnix権限の動作を補強します。
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ビットは、追加の実装定義の状況では無視される場合もあります。
ユーザーは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