当通过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: $!"; 

,改变RDRWTR贯穿始终。


我不知道Windows环境如何影响上述。模块会给一些信心,但我不知道如何open2票价。另一个可能的罪魁祸首可能是缓冲,即使我没有看到它是如何在你的代码。为了以防万一,你可以尝试

​​

IO::Handle默认情况下从,我认为,v5.16开始加载。

也有关于这个in perlfaq5的讨论,有进一步阅读的链接。

但是,如果您确实有缓冲问题,那么最有可能在另一端,如果没有模块,解决方案可能并不容易。从骆驼

如上所述,IO::PtyExpect模块提供一个伪终端设备引述,给您线缓冲,而无需修改在管的端部的方案。

+0

非常感谢。这对我有效。 – user7030551