Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过perl的open2执行时未完全打印telnet命令输出_Perl_Telnet - Fatal编程技术网

通过perl的open2执行时未完全打印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

我是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 $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);