如何使用Net::OpenSSH perl软件包从远程服务器登录和访问路由器



我想通过Perl脚本从远程服务器访问路由器。

我的Perl脚本位于一台服务器上以访问该远程服务器上的远程服务器,可以访问所有路由器,这意味着存在两层架构。

我尝试创建远程服务器隧道,然后使用用户名和密码访问路由器,但没有运气。 我该怎么办?

更新:以下脚本

my $ssh = Net::OpenSSH->new('RemoteHostIp', port => 3345, user => 'username', password => 'password', 'master_opts' => [-o => "StrictHostKeyChecking=no"]);
my ($pty, $pid) = $ssh->open2pty(netcat => 'router_ip', 23);
my $telnet = Net::Telnet::Cisco->new(-fhopen => $pty,
                                     -prompt => '/.*$ $/',
                                     -telnetmode => 0,
                                     -cmd_remove_mode => 0,
                                     -output_record_separator => "r");
$telnet->waitfor(-match => '/username:/', -errmode => "return") or die "login failed : ".$telnet->lastline;
$telnet->send_wakeup("routerusername");
$telnet->waitfor(-match => '/password:/', -errmode => "return") or die "login failed : ".$telnet->lastline;
$telnet->send_wakeup("routerpassword");
my @lines = $telnet->cmd(String => "sh ver", Timeout => 10);
print @lines;
$telnet->close;

输出:

在/usr/local/share/perl5/Net/Telnet/Cisco.pm 第 756 行拆分时使用/g 修饰符毫无意义。

|-----------------------------------------------------------------||本系统仅供授权用户使用。 ||未经授权使用此计算机系统的个人,或在 ||超出其权限,受制于其所有 ||该系统上的活动由系统监控和记录 ||人员。 || ||在监控个人不当使用过程中 ||系统,或在系统维护过程中,活动 ||的授权用户也可以被监控。 || ||使用此系统的任何人都明确同意此类监控 ||并建议,如果此类监测显示可能 ||犯罪活动的证据,系统人员可以提供 ||向执法人员提供此类监控的证据。 ||-----------------------------------------------------------------|

写入错误:文件句柄未在第 45 行打开 test.pl

尝试使用从未发布到CPAN但功能齐全的Net::OpenSSH::Gateway模块。

它也许能够为您找到通过网关连接到远程计算机的方法!

use Net::OpenSSH;
use Net::OpenSSH::Gateway;
my $ssh = Net::OpenSSH->new($host, user => $user, ...
                            gateway => { proxy => "ssh://$gateway" });

更新:似乎(从您在下面作为评论发布的代码来看)实际上,您想远程登录远程路由器。 Net::OpenSSH::Gateway无法处理,因为它是专门为通过代理或网关连接到远程SSH服务器而设计的。

此外,似乎在网关中禁用了端口转发,因此您不能仅使用 Net::OpenSSH::open_tunnel 创建隧道。

相反,您必须在网关中找到一些能够连接到远程路由器的程序。例如,socatnetcattelnet等,并通过Net::OpenSSH对象调用它。

例如:

my ($pty, $pid) = $ssh->open2pty(netcat => $host, $port)
  or die "unable to launch remote netcat: " . $ssh->error;
my $telnet = Net::Telnet::Cisco->new(-fopen => $pty,
                                     -prompt => '/.*$ $/',
                                     -telnetmode => 0,
                                     -cmd_remove_mode => 0,
                                     -output_record_separator => "r");

最后,请注意,在您发布的代码中,您在几个地方错误地使用了点(.)而不是逗号(,)。

更新 2:添加了错误处理代码。

最新更新