2013-10-08 117 views
1

我在perl中使用期望從我的路由器獲取接口信息。當我在遠程路由器上運行命令時,應該在那裏丟失大約10-15行。不知道爲什麼它停止,有什麼想法?Perl Net :: SSH ::期望不打印出所有預期的輸出

#!/usr/bin/perl -w 

#use strict; 
use warnings; 
use Net::SSH::Expect; 

my $ssh = Net::SSH::Expect->new (
     host => "10.10.10.10", 
     user => 'user', 
     password => 'pass' 
     ); 
my $login_output = $ssh->login(); 
     if ($login_output !~ /router#/) { 
      die "Login has failed. Login output was $login_output"; 
     } 
#$ssh->run_ssh() or die "SSH process couldn't start: $!"; 
$ssh->send("show int g2/1"); 
my $line; 

while (defined ($line = $ssh->read_line())) { 
     print $line."\n"; 
} 
+3

是否有可能'read_line()'是即使路由器將是第二次以後發送的詳細信息,缺省爲1秒後超時? – geoffspear

+0

我不這麼認爲,它會打印出線條然後停下來停下來。我嘗試添加一個超時變量,但沒有骰子... – user2859077

+0

1.是否捕獲到STDERR?如果您直接ssh到路由器並運行'show int g2/1>/dev/null'。還有什麼東西仍然印在屏幕上? 2.輸出是否在不同的線路上使用不同的端子? –

回答

0

我懷疑,因爲你正在處理一個路由器,要啓用raw_pty => 1,如Net::SSH::Expect文檔建議。另外,使用 - > exec調用代替 - > send + read_line可能更容易。

要進一步調試,請將log_stdout傳遞給Net :: SSH :: Expect構造函數,並查看是否可以檢測到發生任何錯誤。你爲什麼評論'嚴格使用'?始終'嚴格使用'和'使用警告'

1

Net :: SSH :: Expect不可靠。使用其他模塊爲Net::OpenSSHNet::SSH2Net::SSH::Any或者只是Expect

use Net::OpenSSH; 
my $ssh = Net::OpenSSH->new("10.10.10.10", 
          user => 'user', 
          password => 'pass', 
          timeout => 60); 

my $output = $ssh->capture('show int g2/1'); 

# or for some non-conforming SSH server implementations rather 
# common in network equipment you will have to do... 
my $output = $ssh->capture({stdin_data => "show int g2/1\n"}); 

$ssh->error and die "unable to run remote command: " . $ssh->error; 
+0

謝謝salva這是完美的! – user2859077