我想通过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 5/Net/Telnet/cisco.pm第756行使用/g修饰符是没有意义的。
|-----------------------------------------------------------------| \这个系统仅供授权用户使用。\x\x{e76f}\x{e76f}未经授权使用这个计算机系统的个人,或超出其职权范围的个人,其在这个系统上的所有活动都要受到系统的审查和记录。在不正当地使用本系统监测个人的过程中,或在系统维护过程中,也可以对授权用户的活动进行监视。\x{e76f}\x{e76f}任何使用这一系统的人都明确同意进行这种监测,并被告知,如果这种监测揭示了犯罪活动的可能证据,系统工作人员可向执法人员提供这种监测的非诚勿扰证据。| |-----------------------------------------------------------------|
写入错误: test.pl第45行未打开文件句柄
发布于 2016-01-29 13:31:29
尝试使用从未发布到CPAN但功能强大的Net::OpenSSH::Gateway模块。
它可能会找到一种方式来连接到远程计算机通过网关为您!
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创建隧道。
相反,您必须在网关中找到能够连接到远程路由器的程序。例如,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:添加错误处理代码。
https://stackoverflow.com/questions/35077158
复制相似问题