2016-10-17 72 views
1

我是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命令的完整輸出?輸出緩衝區中的字符數是否有限制?

回答

2

你沒有說你的$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

相關問題