設定していないのに書き込みを許可するchmod

設定していないのに書き込みを許可するchmod

権限を体系的に変更する Perl スクリプトがあります。スクリプトが最初に行うことは、すべての権限を削除することです。これは、chmod(perl から) を呼び出すことによって行われます。明示的にクリアしない限り、set guid ビットがクリアされないことがわかったので、これを行いました。

system('find',
        $topdir,
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

グループとディレクトリに異なる権限を設定しました。 を使用してfind、次のように perl から呼び出します (この場合はディレクトリ用)。

system(
    'find',
    $topdir,
    '-type', 'd',
    '-exec', 'chmod', 'g=rx', '{}', ';'
  );

rx のみを設定したにもかかわらず、スクリプトの実行が完了した後にファイル権限を確認すると、スクリプトには rwx があるように見えます。なぜこのようなことが起こるのかよくわからないので、注意すべき点はありますか。明示的に設定している場所はありません。ACL も設定していますが、すべて期待どおりに動作します。getfacl で確認したときに注目すべき点は、 と だけですmask::rwxdefault:mask::rwxこれが問題の原因でしょうか?

答え1

エラー出力を見てください。find: `…' Permission deniedエラーが表示されているはずです。最初に行うことは、 からすべてのアクセス権限を削除することです$topdir。これにより、それ以上の再帰が防止されます。chmod最初のコマンドを除いて、予期したコマンドは実行されません。

ツリー内のすべてのディレクトリへのアクセス許可を削除する場合は、内側から外側に向かって実行する必要があります。そうしないと、親ディレクトリから切り離されると、そのディレクトリに再帰的にアクセスできなくなります。

system('find',
        $topdir,
        '-depth',
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Perlを使用している場合は、File::Find外部プログラムを呼び出す代わりに、関数findを使用してfinddepth正しい走査順序を取得します。

2 回のトラバーサルを実行するのは無意味に思えます。代わりに、1 回のトラバーサルを実行して、ファイルのアクセス許可を、たとえば、必要な値に直接設定しますchmod 0750。を使用するとFile::Find、たとえば、ディレクトリと通常のファイルを別々に扱うなど、柔軟性が向上します。

関連情報