自动逐跳远程登录至 Cisco 路由器

自动逐跳远程登录至 Cisco 路由器

我需要自动 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 用于任何自动化脚本。

相关内容