无法使用Net :: OpenSSH进行SSH,可以通过命令行

时间:2017-07-06 21:09:41

标签: perl ssh perl-module

这是我第一次使用Net :: OpenSSH,我正在尝试创建一个SSH for循环,在那里我使用whoami打印我所使用的服务器的主机名。我很乐意从命令行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无法解析看似可访问的服务器的原因的任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:2)

&#34;问题必须在于剧本&#34;是的,我执行的脚本有两个问题。第一个是语法错误。其他评论者也注意到了这一点。

该行

   $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-&gt; new

之前添加了这一行。
print STDERR ";$row;\n" if $debugging;  # or something to this effect

如果你这样做了,你会在STDERR

上看到类似的东西
;myhost
;

此外,您使用的模块在其pod中提到了一个不错的调试功能。调试输出不是那么容易解释,但如果您不知道问题出在哪里,那么您可以从那里开始。如果你添加了这一行

$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

如果您调用了chomp但主机名确实不存在

,那将会是这样的
ssh: Could not resolve hostname localhostx: nodename nor servname provided, or not known