2017-07-06 135 views
1

这是我第一次使用Net :: OpenSSH,并且我正在尝试创建一个SSH for循环,在那里我打印服务器的主机名在使用whoami。我强麦在命令行SSH连接到我的意图的服务器,但是当我运行我的脚本,我遇到以下错误......无法使用Net :: OpenSSH进行SSH,可以通过命令行

SSH:无法解析主机名
:名称或服务不知道
用户名

为了获得更多的信息,我打印的$ssh->error,其中$ssh是我的Net :: OpenSSH的对象的输出。

无法建立主SSH连接:密码错误或主进程在24行,$ FH线1

这是脚本到目前为止意外退出...

#!/usr/bin/perl 

use strict; 
use warnings; 
use Net::OpenSSH; 
my $file = 'servers.txt'; 
open (my $fh, $file) or die "Could not open"; 

while (my $row = <$fh>) { 
    my $user = "username"; 
    my $password = "password"; 
    my $ssh = Net::OpenSSH->new(host => $row, user => $user, password => $password); 
    $ssh-error and die "SSH connection failed: " . $ssh->error; 
    my $whoami = `whoami`; 
    print $whoami; 
} 

servers.txt文件是一个包含服务器主机名列表的纯文本文件。

我的理解是,如果我可以从命令行对这些服务器进行SSH连接,问题必须出现在脚本中,而不是服务器/网络。任何洞察为什么我Net :: OpenSSH无法解决看似可访问的服务器,将不胜感激。

+5

你需要在'$ row'上调用'chomp'吗? – mob

+2

这段代码甚至不应该编译(裸字“错误”)。 – melpomene

+0

“*姓名或服务不知道*”和​​“*错误的密码或moster过程已退出*”... *叹息* –

回答

2

“问题必须出现在脚本中”是的,我执行的脚本存在两个问题。第一个是语法错误。其他评论者已经注意到了这一点。

线

$ssh-error and die "SSH connection failed: " . $ssh->error; 

应该

$ssh->error and die "SSH connection failed: " . $ssh->error; 

另一个问题,这是从版本,您还没有表现出剧本的到来,这也得到了其他人注意到是否你没有从$ row中删除尾随的换行符。你这样做与

chomp($row) 

这样做作为while块的开放指令,你应该很好去。

我不得不强调在发布MCV时格外小心的重要性。在按下提交按钮之前,请将帖子中的代码复制到临时文件并执行,并且您将减少响应者的投诉。

顺便说一句,可能有让你解决你自己的问题的好习惯调试正在执行的Net :: OpenSSH->新

print STDERR ";$row;\n" if $debugging; # or something to this effect 

如果你做了这之前已经加入这一行,你会看到像这样的STDERR

;myhost 
; 

此外,您使用的模块在其荚提到一个体面的调试功能。调试输出不易解释,但如果您不知道问题出在哪里,那么您可能会从那里开始。如果你已经加入这一行

$Net::OpenSSH::debug = 8; 

然后你会看到这对STDERR

$ cat servers.txt 
localhostx 
$ perl x.pl 
... 
ssh: Could not resolve hostname localhostx 
: nodename nor servname provided, or not known 

这将是这个样子的,如果你曾经被称为格格,但主机名真正不存在

ssh: Could not resolve hostname localhostx: nodename nor servname provided, or not known 
+0

感谢@ jeff6times7,使用chomp工作。我也测试了您的调试建议,并能够更好地了解我的问题。张贴,我意识到我应该在提交我的问题之前更加小心。 –