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