汚染モードでFile :: Find :: Ruleを使用するにはどうすればよいですか?
-
10-07-2019 - |
質問
次のようなものを使用して、指定されたディレクトリ内のサブディレクトリのリストを取得しようとしています:
#!/usr/bin/perl -wT
use strict;
use warnings;
use File::Find::Rule;
use Data::Dumper;
my @subdirs = File::Find::Rule->maxdepth(1)->directory->relative->in('mydir');
print Dumper(@subdirs);
ただし、これを実行すると結果が得られます。
-Tスイッチを使用して実行中のchdirの安全でない依存関係
File :: Find
は汚染モードを処理するためのオプションですが、 File :: Find :: Rule
。上記を行うことは可能ですか?サブディレクトリをリストするために別の方法を使用する必要がありますか?汚染モードについて本当に理解しなければならない明らかなことを完全に誤解していますか?
解決
(編集!)さて、ロジックは、以下を投げることが機能することを示唆しています:
->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )
これにより、引数をモジュールの find()
関数に直接渡すことで、File :: Findの汚染モード機能を使用できます。ちなみに、File :: Findは、 qr //
演算子を使用して $ untaint_pattern
を設定する必要があることに言及しています。たとえば、デフォルト値は
$untaint_pattern = qr|^([-+@\w./]+)$|
ただし、これは機能しません!実際、あなたの問題はFile :: Find :: Ruleの既知のバグです。 (たとえば、 CPAN および Debian バグレポート。)バグ修正が必要な場合は、両方それらのバグレポートにはパッチがあります。
制限された環境にいる場合、できることの1つは、基本的に自分でコードにパッチを実装することです。たとえば、すべてを1つのファイルに保存する場合は、 use File :: Find :: Rule
の後に大きなコードブロックを追加できます。これは非常に迅速な修正であり、最適ではない可能性があることに注意してください。うまくいかない場合(たとえば、ファイル名にスペースがあるため)、使用されるパターン qr | ^([-+ @ \ w ./]+)$ |
を変更します。
最後に、コード編成を少し改善したい場合、これをMyFileFindRuleFixまたは何かと呼ばれる別のパッケージにダンプすることをお勧めします。これはの後に常に
自体。 use
File :: Find :: Rule
package File::Find::Rule;
no warnings qw(redefine);
sub in {
my $self = _force_object shift;
my @found;
my $fragment = $self->_compile( $self->{subs} );
my @subs = @{ $self->{subs} };
warn "relative mode handed multiple paths - that's a bit silly\n"
if $self->{relative} && @_ > 1;
my $topdir;
my $code = 'sub {
(my $path = $File::Find::name) =~ s#^(?:\./+)+##;
$path = "." if ($path eq ""); # See Debian bug #329377
my @args = ((編集!)さて、ロジックは、以下を投げることが機能することを示唆しています:
->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )
これにより、引数をモジュールの find()
関数に直接渡すことで、File :: Findの汚染モード機能を使用できます。ちなみに、File :: Findは、 qr //
演算子を使用して $ untaint_pattern
を設定する必要があることに言及しています。たとえば、デフォルト値は
です
$untaint_pattern = qr|^([-+@\w./]+)$|
ただし、これは機能しません!実際、あなたの問題はFile :: Find :: Ruleの既知のバグです。 (たとえば、 CPAN および Debian バグレポート。)バグ修正が必要な場合は、両方それらのバグレポートにはパッチがあります。
制限された環境にいる場合、できることの1つは、基本的に自分でコードにパッチを実装することです。たとえば、すべてを1つのファイルに保存する場合は、 use File :: Find :: Rule
の後に大きなコードブロックを追加できます。これは非常に迅速な修正であり、最適ではない可能性があることに注意してください。うまくいかない場合(たとえば、ファイル名にスペースがあるため)、使用されるパターン qr | ^([-+ @ \ w ./]+)$ |
を変更します。
最後に、コード編成を少し改善したい場合、これをMyFileFindRuleFixまたは何かと呼ばれる別のパッケージにダンプすることをお勧めします。これはの後に常に use
File :: Find :: Rule
自体。
<*>, $File::Find::dir, $path);
my $maxdepth = $self->{maxdepth};
my $mindepth = $self->{mindepth};
my $relative = $self->{relative};
# figure out the relative path and depth
my $relpath = $File::Find::name;
$relpath =~ s{^\Q$topdir\E/?}{};
my $depth = scalar File::Spec->splitdir($relpath);
#print "name: \'$File::Find::name\' ";
#print "relpath: \'$relpath\' depth: $depth relative: $relative\n";
defined $maxdepth && $depth >= $maxdepth
and $File::Find::prune = 1;
defined $mindepth && $depth < $mindepth
and return;
#print "Testing \'(編集!)さて、ロジックは、以下を投げることが機能することを示唆しています:
->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )
これにより、引数をモジュールの find()
関数に直接渡すことで、File :: Findの汚染モード機能を使用できます。ちなみに、File :: Findは、 qr //
演算子を使用して $ untaint_pattern
を設定する必要があることに言及しています。たとえば、デフォルト値は
です
$untaint_pattern = qr|^([-+@\w./]+)$|
ただし、これは機能しません!実際、あなたの問題はFile :: Find :: Ruleの既知のバグです。 (たとえば、 CPAN および Debian バグレポート。)バグ修正が必要な場合は、両方それらのバグレポートにはパッチがあります。
制限された環境にいる場合、できることの1つは、基本的に自分でコードにパッチを実装することです。たとえば、すべてを1つのファイルに保存する場合は、 use File :: Find :: Rule
の後に大きなコードブロックを追加できます。これは非常に迅速な修正であり、最適ではない可能性があることに注意してください。うまくいかない場合(たとえば、ファイル名にスペースがあるため)、使用されるパターン qr | ^([-+ @ \ w ./]+)$ |
を変更します。
最後に、コード編成を少し改善したい場合、これをMyFileFindRuleFixまたは何かと呼ばれる別のパッケージにダンプすることをお勧めします。これはの後に常に use
File :: Find :: Rule
自体。
<*>\'\n";
my $discarded;
return unless ' . $fragment . ';
return if $discarded;
if ($relative) {
push @found, $relpath if $relpath ne "";
}
else {
push @found, $path;
}
}';
#use Data::Dumper;
#print Dumper \@subs;
#warn "Compiled sub: '$code'\n";
my $sub = eval "$code" or die "compile error '$code' $@";
my $cwd = getcwd;
# Untaint it
if ( $cwd =~ qr|^([-+@\w./]+)$| ) {
$cwd = $1;
} else {
die "Couldn't untaint \$cwd: [$cwd]";
}
for my $path (@_) {
# $topdir is used for relative and maxdepth
$topdir = $path;
# slice off the trailing slash if there is one (the
# maxdepth/mindepth code is fussy)
$topdir =~ s{/?$}{}
unless $topdir eq '/';
$self->_call_find( { %{ $self->{extras} }, wanted => $sub }, $path );
}
chdir $cwd;
return @found;
}
use warnings;
package main;