chmod
ちょうどsetgidビットを設定解除したときにいくつかの興味深い動作が見つかりました。
$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test # double what?!
驚くべきことに、setgidビットを設定解除しようとするとchmod 0755
機能しません。ただし、マニュアルページにはこれが予想される動作であると記載されています。
SETUIDおよびSETGIDビット
ファイルのグループIDがユーザーの有効なグループIDまたはユーザーの補足グループIDのいずれかに一致しない場合、chmodはユーザーが適切な権限を持っていない限り、一般ファイルのset-group-IDビットをクリアします。その他の制限により、MODE または RFILE の set-user-ID および set-group-ID ビットが無視される可能性があります。この動作は、基本的なchmodシステムコールのポリシーと機能によって異なります。疑わしい場合は、基本的なシステム動作を確認してください。
chmod は、明示的に別段の指定がない限り、ディレクトリの set-user-ID および set-group-ID ビットを保持します。 u + sやgsなどのシンボルモードを使用してビットを設定または消去できます。数値モードを使用してこれらのビットを設定できます(消去できません)。
(強調追加)
したがって、chmod 0755
setgidビットを設定解除するという意味ではないようです。それではなぜchmod 00755
キャンセルしますか?chmod
役に立たないと思います。五数字パターンの数字。もう一度マニュアルページから:
数字のパターンは、以下に由来します。ワンからネット4、2、1 値のビットを加算した 8 進数 (0-7)。省略された数字には前にゼロが付いていると見なされます。
(強調追加)
ここで何が起こっているのでしょうか?chmod
単一の先行ゼロを無視することにした理由は何ですか?なぜこのようなことが起こるのでしょうか?いいえ2つの前の0を無視しますか?
(chmod(GNU Coreutils)8.6を含むDebian Stretch 9.1)
ベストアンサー1
見つけました!この情報はマニュアルページにはありませんが、Coreutils オンラインマニュアルで確認できます。気をつけて:
ほとんどのシステムでは、ディレクトリのset-group-IDビットが設定されている場合、新しく作成されたサブファイルはそのディレクトリと同じグループを継承し、新しく作成されたサブディレクトリは親ディレクトリのset-group-IDビットを継承します。一部のシステムでは、ディレクトリのset-user-IDビットは、新しいサブディレクトリのset-user-IDビットと同様に、新しいサブファイルの所有権に同様の影響を与えます。これらのメカニズムにより、新しいファイルを使用または
chmod
共有chown
する必要性が減り、ユーザーがファイルを共有しやすくなります。これらの便利なメカニズムは、ディレクトリのset-user-IDおよびset-group-IDビットに依存します。
chmod
同じコマンドを使用してディレクトリからこれらのビットを定期的にクリアすると、mkdir
メカニズムがより便利になり、ファイル共有がより困難になります。したがって、同様のコマンドは、chmod
ユーザーがシンボリックモードで具体的に言及したり、演算子数値モード(「= 755」など)を使用または設定しない限り、ディレクトリのset-user-IDまたはset-group-IDビットには影響しません。 。数字モードで消去するか、5桁以上の8進数字モードで消去します。
引用:https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html