3

我想在 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 不是很熟悉。有人知道如何获得那条线吗?

4

4 回答 4

5

使用在管道模式下打开:

open($filehandle, "$command|") or die "did not work: $! $?";
while(<$filehandle>)
{
#do something with $_
}

或使用反引号:

my  @programoutput=`$command`
于 2009-02-20T09:32:08.950 回答
2

无法使用system().

而是使用反踢:

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,有很多方法可以做到这一点:

您还可以使用Net::FTP支持 Windows 的模块来处理文件传输,并使用Time::HiRes等计时模块来计时并计算您的吞吐量。

这样您就不会依赖 ftp 程序(例如,如果没有大量返工,您的脚本将无法在 Windows 的本地化版本上运行,并且您需要依赖 ftp 程序安装在同一位置)。

于 2009-02-20T09:38:22.333 回答
2

请参阅perlfaq8,其中有几个与此主题相关的答案。这个问题你可能需要的是:

此外,您可能对标准库中的一些 IPC(进程间通信)Perl 模块感兴趣:

  • IPC::Open2
  • IPC::Open3

一些 Perl 文档也可能有帮助:

如果您不熟悉 Perl 文档,可以查看我的Perl 文档文档

祝你好运,

于 2009-02-20T19:12:27.463 回答
-2

您应该尝试使用更适合该任务的libcurl 。

有一个易于使用的 API

于 2009-02-20T09:25:55.453 回答