0

これは、文字列(URL)と整数値の2つのパラメーターを受け取る単純なPerlスクリプトです。

私がやろうとしているのは、渡されたURLに対して指定された期間(秒単位)のcurlリクエストを実行することだけです。

URLが単純なhttp://admin:admin@localhost:5074/?q=james場合は問題ありませんが、URLにある場合に問題が発生&します。

問題はsystem()、ループを終了した後でも、makecurlリクエストが実行され続けることです。

どうしたの?

use strict;
use warnings;
use URI::Escape;

my $url = uri_escape($ARGV[0]);
print "URL=".$url."\n"; 
my $duration = $ARGV[1];
print $duration;
my $start = time(); 
my $end = $start + $duration;
my $request = 0;

while(time() <= $end ){ 
    system("curl --user admin:admin --digest ".uri_unescape($url)); 
    $request++;
}

print "------------------------ END ----------------------------------\n";
print "URL = ".uri_unescape($url)." \n";
print "Total requests made = ".$request."\n";
print "Reqs/sec = ".($request/$duration)."/sec \n";
#print $start."\n";
#print $end."\n";
print "Duration = ".$duration." sec \n";
print "-------------------------------------------------------------------\n";

コマンドは次のとおりです。

perl curl.pl "http://admin:admin@localhost:5074/?q=james&format=xml" 5
4

1 に答える 1

8

&URLに、シェルによって「このコマンドをバックグラウンドで実行する」と解釈されている文字があります。&次のいずれかの方法で、シェルにメタ文字を解釈させないように、メタ文字を適切にエスケープする必要があります。

use String::ShellQuote qw( shell_quote );
system("curl --user admin:admin --digest " . shell_quote($url)); 

または優先:

system('curl', '--user', 'admin:admin', '--digest', $url);

curl後者はシェルの作成をまったく回避し、指定された引数を使用して直接フォーク/実行します。これらの引数は自動的にエスケープされます。より速く、より安全です。詳細については、システムperldocを参照してください。

余談ですが、LWPの使用を検討する必要があります。これは新しいPerl用のPerlコアの一部であり(インストールなし)、何もエスケープすることを心配する必要はありません。

于 2013-03-15T00:51:16.070 に答える