首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Net::OpenSSH包从远程服务器登录和访问路由器?

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

Stack Overflow用户
提问于 2016-01-29 04:54:46
回答 1查看 802关注 0票数 2

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

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

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

更新:下面的脚本

代码语言:javascript
复制
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 5/Net/Telnet/cisco.pm第756行使用/g修饰符是没有意义的。

|-----------------------------------------------------------------| \这个系统仅供授权用户使用。\x\x{e76f}\x{e76f}未经授权使用这个计算机系统的个人,或超出其职权范围的个人,其在这个系统上的所有活动都要受到系统的审查和记录。在不正当地使用本系统监测个人的过程中,或在系统维护过程中,也可以对授权用户的活动进行监视。\x{e76f}\x{e76f}任何使用这一系统的人都明确同意进行这种监测,并被告知,如果这种监测揭示了犯罪活动的可能证据,系统工作人员可向执法人员提供这种监测的非诚勿扰证据。| |-----------------------------------------------------------------|

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

EN

回答 1

Stack Overflow用户

发布于 2016-01-29 13:31:29

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

它可能会找到一种方式来连接到远程计算机通过网关为您!

代码语言:javascript
复制
use Net::OpenSSH;
use Net::OpenSSH::Gateway;

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

Update:实际上,您似乎希望将telnet放到远程路由器中(从您在下面发布的代码中作为注释)。Net::OpenSSH::Gateway无法处理这个问题,因为它专门为通过代理或网关连接到远程SSH服务器而设计的。

此外,似乎端口转发在网关中是禁用的,所以您不能只使用Net::OpenSSH::open_tunnel创建隧道。

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

例如:

代码语言:javascript
复制
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:添加错误处理代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35077158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档