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

如何使用Net::OpenSSH perl包从远程服务器登录和访问路由器?,perl,remote-server,tunnel,ssh-tunnel,Perl,Remote Server,Tunnel,Ssh Tunnel,我想通过Perl脚本从远程服务器访问路由器 我的Perl脚本位于一台服务器上,用于访问该远程服务器上的远程服务器,可以访问所有路由器,这意味着存在两层体系结构 我曾尝试创建远程服务器隧道,然后使用用户名和密码访问路由器,但没有成功。我该怎么办 更新:以下脚本 my $ssh = Net::OpenSSH->new('RemoteHostIp', port => 3345, user => 'username', password => 'password', 'maste

我想通过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修饰符是毫无意义的

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


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

请尝试使用从未发布到CPAN但功能模块

它可能会为您找到一种通过网关连接到远程机器的方法

use Net::OpenSSH;
use Net::OpenSSH::Gateway;

my $ssh = Net::OpenSSH->new($host, user => $user, ...
                            gateway => { proxy => "ssh://$gateway" });
更新:看起来(从您在下面作为注释发布的代码来看),实际上,您希望telnet进入远程路由器
Net::OpenSSH::Gateway
无法处理此问题,因为它是专门为通过代理或网关连接到远程SSH服务器而设计的

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

相反,您必须在网关中找到一些能够连接到远程路由器的程序。例如,
socat
netcat
telnet
,等等,并通过
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:添加了错误处理代码。

您遇到了什么错误?实际上我无法创建隧道。我的意思是不能在ssh中使用telnet。感谢您的响应,在网关属性中,如何传递用于网关服务器身份验证的用户名和密码。三种类型的路由器是Cisco、Junipher和Alacatel。Cisco使用telnet,Junpher和Alcatel使用SSH。我已经编写了使用Net::OpenSSH打开隧道的脚本,并将其传递给Net::telnet::Cisco包,以便为路由器创建新的隧道。但是,我犯了以下错误。通道2:打开失败:管理禁止:打开失败写入错误:filehanlde未在“具有行号的pl文件”处打开。以下脚本:my$pe=Net::OpenSSH->new(“JumpServer”,端口=>3453,用户=>'username',密码=>'password');my($pty,$pid)=$pe->open_tunnel('router_ip',23);my$telnet=Net::telnet::Cisco->new(-fopen=>$pty,-prompt=>'/.\$$/',-telnetmode=>0,-cmd\u remove\u mode=>0,-output\u record\u separator=>“\r”)$telnet->waitfor(-match=>'/username\:/'.-errmode=>“return”)$telnet->send_wakeup(“routerusername”)$telnet->waitfor(-match=>'/password\:/'.-errmode=>“return”)$telnet->send_wakeup(“路由密码”);my@lines=$telnet->cmd(字符串=>“sh ver”,超时=>10);打印@行$telnet->close@user3213879:将脚本和您得到的错误准确地、未经编辑地粘贴到您的原始帖子上,并正确引用。否则就不可能跟踪所发生的事情。@Thribhuwan:我在我的邮政编码中添加了错误检查。网关上可能没有
netcat
。您必须在那里查找类似的程序(
socat
telnet
,等等),然后使用它。否则,如果某些脚本语言(
perl
python
ruby
等)可用,您可以使用它来实现自己的
netcat
克隆。