这是一个简单的Perl脚本,它接受2个参数 - 一个字符串(一个URL)和一个整数值.
我所要做的就是在给定的时间段(以秒为单位)内对传递的URL运行curl请求.
当URL很简单时,一切都很好,http://admin:admin@localhost:5074/?q=james但是当&URL中存在问题时会出现问题.
问题是system(),即使退出循环,curl请求仍会继续运行.
这是怎么回事?
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";
Run Code Online (Sandbox Code Playgroud)
命令是:
perl curl.pl "http://admin:admin@localhost:5074/?q=james&format=xml" 5
Run Code Online (Sandbox Code Playgroud)
&您的URL中有一个字符被shell解释为"在后台运行此命令".您需要通过以下方式&正确地转义元字符,以避免shell解释它们:
use String::ShellQuote qw( shell_quote );
system("curl --user admin:admin --digest " . shell_quote($url));
Run Code Online (Sandbox Code Playgroud)
或者首选:
system('curl', '--user', 'admin:admin', '--digest', $url);
Run Code Online (Sandbox Code Playgroud)
后者完全避免创建shell,并curl直接使用给定的参数分叉/执行,这些参数会自动转义.它更快,更安全.有关更多信息,请参阅系统perldoc.
另外,您应该考虑使用LWP.它是新Perls的Perl核心的一部分(无需安装),您无需担心逃避任何事情.