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