当通过perl执行open2时telnet命令输出没有完全打印
我是perl的新手。当通过perl执行open2时telnet命令输出没有完全打印
我的目标:在执行telnet命令,并捕获满输出
我的代码:
use IPC::Open2;
open2(\*RDR, \*WTR, "telnet host_name 8000 2>&1") or die ("could not contact host_name");
print WTR "$command\n";
print WTR "quit\n";
foreach my $line (<RDR>)
{
print $line."\n";
}
close RDR;
问题:通过油灰执行telnet命令时,输出超过12行被打印。但通过这个perl脚本只打印3行
解决方法尝试: 我试过期望,Net :: Telnet,IO :: Pty。但由于安全原因,这些模块未安装在刀片服务器中。
问题:因此,如果不使用任何这些有用的魔法模块,如何使用perl获取任何telnet命令的完整输出?输出缓冲区中的字符数是否有限制?
你没有说你的$command
什么,但这对我很有用。
use warnings 'all';
use strict;
use IPC::Open2;
my $host = 'google.com';
my $pid = open2(\*RDR, \*WTR, "telnet $host 80 2>&1")
or die "Can't contact $host: $!";
print WTR "GET\n";
print WTR "quit\n";
while (my $line = <RDR>)
{
print $line if $. <= 10; # print only first 10 lines
}
close RDR;
waitpid($pid, 0);
my $child_exit_status = $? >> 8; # check how it went
这打印整个页面(没有if ...
)。为方便起见,打印限制为10行。
请仔细阅读文档IPC::Open2,因为所有这些都涉及到。
open2()
返回子进程的进程ID。open2()
在退出后不等待并收获子进程。 [...]
这整个事情是相当危险的,因为你可能永远阻止。 [...]
另请参阅IPC::Open3。一个备受好评的模块是IPC::Run,如果可能的话已经安装。 Tiny::Capture也非常出色,在this recent post中看到一个非常类似的问题。两者都非常有名,所以你的管理员可以接受他们。
我建议切换到词法文件句柄
my $pid = open2 my $read_fh, my $write_fh, "telnet $host 80 2>&1"
or die "Can't contact $host: $!";
,改变RDR
和WTR
贯穿始终。
我不知道Windows环境如何影响上述。模块会给一些信心,但我不知道如何open2
票价。另一个可能的罪魁祸首可能是缓冲,即使我没有看到它是如何在你的代码。为了以防万一,你可以尝试
的IO::Handle
默认情况下从,我认为,v5.16开始加载。
也有关于这个in perlfaq5的讨论,有进一步阅读的链接。
但是,如果您确实有缓冲问题,那么最有可能在另一端,如果没有模块,解决方案可能并不容易。从骆驼
如上所述,
IO::Pty
和Expect
模块提供一个伪终端设备引述,给您线缓冲,而无需修改在管的端部的方案。
非常感谢。这对我有效。 – user7030551