chmod を設定しない場合は書き込みが許可されます。

chmod を設定しない場合は書き込みが許可されます。

権限を体系的に変更するPerlスクリプトがあります。このスクリプトが実行する最初の作業は、すべての権限を削除することです。これはchmod(perl で) 呼び出しによって行われます。私は設定された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::rwxだけですdefault:mask::rwx。これで問題が発生する可能性がありますか?

ベストアンサー1

エラー出力を見てください。find: `…' Permission deniedエラーが表示されます。最初にすべきことは、すべてのアクセス権を削除することです$topdir。これにより、その権限に対する追加の再帰を防ぐことができます。chmod最初のコマンドを除いて、予想されるコマンドは実行されません。

ツリー内のすべてのディレクトリへのアクセスを削除するには、内部から外部に作業する必要があります。そうしないと、親ディレクトリから離れると、そのディレクトリに戻ることはできません。

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

Perlを使用しているので、次のようにしてください。File::Find外部プログラムを呼び出す代わりにfindfinddepth正しい巡回順序を得るには、この機能を使用してください。

2回のパスをするのは意味がないようです。代わりに、パススルーを実行し、ファイル権限を必要に応じて直接設定します(たとえば、chmod 0750権限が何でも)。を使用すると、File::Findディレクトリと通常のファイルを別々に処理するなど、より柔軟性を得ることができます。

おすすめ記事