
権限を体系的に変更する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
外部プログラムを呼び出す代わりにfind
。finddepth
正しい巡回順序を得るには、この機能を使用してください。
2回のパスをするのは意味がないようです。代わりに、パススルーを実行し、ファイル権限を必要に応じて直接設定します(たとえば、chmod 0750
権限が何でも)。を使用すると、File::Find
ディレクトリと通常のファイルを別々に処理するなど、より柔軟性を得ることができます。