如何使用Net::OpenSSH perl包从远程服务器登录和访问路由器?
我想通过Perl脚本从远程服务器访问路由器 我的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
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
克隆。