我想在Perl脚本中使用Windows内置FTP工具来确保链接的吞吐量。因此,该脚本将创建以下命令脚本:
open <ip>
<username>
<password>
hash
get 500k.txt
quit
然后我使用以下Perl代码运行命令脚本:
system(@args);
@args = ("ftp", "-s:c:\\ftp_dl.txt");
system(@args);
如果我在DOS框中运行命令,输出如下所示:
ftp> open <ip>
Connected to <ip>
220 "Welcome to the fast and fabulous DUFTP005 ftp-server :-) "
User (<ip>:(none)):
331 Please specify the password.
230 Login successful.
ftp> hash
Hash mark printing On ftp: (2048 bytes/hash mark) .
ftp> get 500k.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 500k.txt (14336 bytes).
#######
226 File send OK.
ftp: 14336 bytes received in 0.00Seconds 14336000.00Kbytes/sec.
ftp> quit
221 Goodbye.
为了能够获得吞吐量,我需要提取行:
ftp: 14336 bytes received in 0.00Seconds 14336000.00Kbytes/sec.
我对Perl不太熟悉。有人知道如何获得这条线吗?
答案 0 :(得分:5)
在管道模式下使用open:
open($filehandle, "$command|") or die "did not work: $! $?";
while(<$filehandle>)
{
#do something with $_
}
或使用反引号:
my @programoutput=`$command`
答案 1 :(得分:2)
你can't get the output with system()
。
而是使用bactkicks:
my $throughput = 0;
my $output = `ftp -s:c:\\ftp_dl.txt`;
if (($? == 0) && ($output =~ /([\d+\.]+)\s*K?bytes\/sec/m)) {
$throughput = $1;
}
$output
将包含执行ftp
命令的所有行(但不包含发送到STDERR
的任何错误消息)。
然后我们检查ftp
是否返回成功(0
)以及输出中是否有吞吐量。
如果是这样,我们会将$throughput
设置为它。
这是Perl,有很多方法可以做到这一点:
您还可以使用支持Windows的Net::FTP
模块来处理文件传输,并使用Time::HiRes等计时模块对其进行计时并计算吞吐量。
这样你就不会依赖ftp程序了(你的脚本不适用于Windows的本地化版本,例如没有太多的重新工作,你需要依赖ftp程序安装并在同一个位置)。
答案 2 :(得分:2)
请参阅perlfaq8,其中有几个答案可以解决此问题。你可能需要的问题是:
此外,您可能对标准库中的一些IPC(进程间通信)Perl模块感兴趣:
部分Perl文档也可能有所帮助:
如果您不熟悉Perl文档,可以查看我的Perl documentation documentation。
祝你好运,答案 3 :(得分:-2)
您应该尝试使用更适合此任务的libcurl。