我需要自动 telnet 到 Cisco 路由器并获取“显示版本”结果。问题是,我需要先 telnet 到 A,再从那里 telnet 到 B,然后才能 telnet 到 Cisco 路由器。
我已经尝试过以下方法,但没有效果。
root@linux:~#cat command
myName
myPassword
telnet 2.2.2.2
myName2
myPassword2
telnet 3.3.3.3
cisco
ciscoPass
show version
root@linux:~#nc 1.1.1.1 23 -i 1 < command
答案1
你可以试试TCL/期待。在这种情况下它非常方便。下面是一个示例脚本(您可能需要对其进行一些调整):
#!/usr/bin/expect --
if {$argc != 1} {
puts "Wrong parameters."
puts "Usage: $argv0 <ip address router 1> <ip address router 2>"
exit 1
}
# Telnet to router 1
spawn telnet [lindex $argv 0]
expect {
"Username:" {send "myuser\r"}
}
expect {
"assword:" {
send "mypasswd"
send "\r"
}
}
expect "\>"
# Telnet on router 2
# Telnet to router 1
send "telnet [lindex $argv 1]"
expect {
"Username:" {send "myuser\r"}
}
expect {
"assword:" {
send "mypasswd"
send "\r"
}
}
expect "\>"
send "sh ver\r"
expect "\>"
# Quiting router 2
send "quit\r"
expect "\>"
# Quiting router 1
send "quit\r"
expect "Connection closed by foreign host."
wait
exit 0
答案2
这会起作用
(
sleep 1
echo user ; sleep 1
echo pass ; sleep 1
echo telnet router2
sleep 1
echo user ; sleep 1
echo pass ; sleep 1
echo telnet router3
sleep 1
echo user ; sleep 1
echo pass ; sleep 1
echo sh ver ; sleep 1
) | telnet router1
答案3
Perl 库网络::Telnet::思科非常适合处理这类脚本。
您只需担心命令,而不必担心与路由器的 telnet 通信。
简单示例:
#!/usr/bin/perl -w
use Net::Telnet::Cisco;
if ($#ARGV == -1) {
print "Usage : $0 <ip address>\n";
}
else {
my $host = $ARGV[0];
my $session = Net::Telnet::Cisco->new(Host => $host);
$session->login('username', 'password');
my @uptime = $session->cmd('sh ver | i uptime');
print @uptime;
$session->close;
}
$ ./uptime_cisco.pl router.mydomain
router uptime is 3 weeks, 1 day, 16 hours, 55 minutes
Netcat 是一个很棒的工具,但是这种库的易用性使得我不再将 netcat 用于任何自动化脚本。