通过perl的open2执行时未完全打印telnet命令输出
我是perl的新手 我的目标:执行telnet命令并捕获完整输出 我的代码:通过perl的open2执行时未完全打印telnet命令输出,perl,telnet,Perl,Telnet,我是perl的新手 我的目标:执行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 $li
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;
使用IPC::Open2;
open2(\*RDR,\*WTR,“telnet主机名8000 2>&1”)或die(“无法联系主机名”);
打印WTR“$command\n”;
打印WTR“退出\n”;
foreach我的$line()
{
打印$行。“\n”;
}
关闭RDR;
问题:通过putty执行telnet命令时,打印的输出超过12行。但是通过这个perl脚本只打印了3行
解决尝试:
我试过Expect、Net::Telnet、IO::Pty。但由于安全原因,这些模块没有安装在我的刀片服务器中
问:那么,在不使用任何这些有用的魔法模块的情况下,如何使用perl获得任何telnet命令的完整输出?输出缓冲区中的字符数有任何限制吗?您没有说任何关于
$命令的内容,但这对我很有用
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
并在整个过程中更改RDR
和WTR
我不知道Windows环境如何影响上述内容。这些模块会给人一些信心,但我不确定如何open2
票价。另一个可能的罪魁祸首可能是缓冲,尽管我不知道它在代码中会是什么样子。以防万一,你可以试试
use IO::Handle;
STDERR->autoflush(1);
STDOUT->autoflush(1);
默认情况下,IO::Handle
是从v5.16开始加载的
还有关于这一点的讨论,以及进一步阅读的链接
但是,如果确实存在缓冲问题,则最有可能发生在另一端,如果没有模块,这可能不容易解决。引自骆驼
如前所述,IO::Pty
和Expect
模块提供了一个伪tty设备,无需修改管道末端的程序即可提供行缓冲
use IO::Handle;
STDERR->autoflush(1);
STDOUT->autoflush(1);