这是我第一次使用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无法解析看似可访问的服务器的原因的任何见解都将不胜感激。
答案 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