我尝试通过中央管理服务器访问路由器作为“ssh hop”服务器
#!/usr/bin/perl -X
use strict;
use Net::OpenSSH;
use Net::Telnet;
my $lhost = "linuxserver";
my $luser = "linuxuser";
my $lpass = "linuxpassword";
my $chost = "routername";
my $cpass = "Routerpassword";
my $prompt = '/(?:Password: |[>])/m';
my @commands = ("show users\r");
my $ssh = Net::OpenSSH->new($lhost,
'user' => $luser,
'password' => $lpass,
'master_opts' => [ '-t' ],
#'async' => 1 # if enabled then password cannot be set here
);
my ($pty, $err, $pid) = $ssh->open2pty("telnet $chost");
my $t = new Net::Telnet(
-telnetmode => 0,
-fhopen => $pty,
-prompt => $prompt,
-cmd_remove_mode => 1,
-output_record_separator => "\r",
#-dump_log => "debug.log",
);
my $end = 0;
while (!$end) {
my ($pre, $post) = $t->waitfor($prompt);
if ($post =~ /Password: /m) {
# send password
$t->print("$cpass");
}
elsif ($post =~ /[>#]/ && @commands) {
my $cmd = shift(@commands);
if ($cmd !~ /[\r\n]/) {
$t->print($cmd);
}
else {
print $t->cmd($cmd);
}
}
else {
$end = 1;
$t->cmd("exit");
}
}
#close $pty;
$t->close();
不幸的是我总是收到以下错误: 读错误:test.pl第71行的输入/输出错误
有人可以帮助我吗?还是有更好的解决方案来测试是否可以通过“hop”服务器进行telnet连接?
连接看起来像: 工作站--ssh->服务器--telnet->路由器
提前致谢。
答案 0 :(得分:2)
我认为最好的选择是建立到管理服务器的SSH隧道并使用它来远程登录路由器。
答案 1 :(得分:2)
让Net::Telnet工作Net::OpenSSH有时并不像应该的那样容易,需要进行一些实验才能找到正确的标志和调用组合,以使其发挥作用。
例如,如果代理上允许使用隧道,则使用netcat打开原始连接(或Net::OpenSSH支持TCP转发),而不是telneting到目标主机。
Expect + Net::OpenSSH可能是更好的选择。