如何使用 SSH 在全局配置模式下运行 Cisco IOS 命令?

如何使用 SSH 在全局配置模式下运行 Cisco IOS 命令?

我知道 Kron,但据说没有办法运行全局配置命令:

http://www.techrepublic.com/article/schedule-commands-with-cisco-ios-kron/

如果我使用 Putty 连接,Putty 可以在登录后运行多个命令,效果非常好。问题是我想每天晚上 11 点自动进入交换机并关闭一系列接口。

我正在尝试使用 sshpass,但它似乎一次只允许 1 个命令。

还有一种无需密码即可进入思科交换机的方法,但是从 IOS 15.0 开始:

https://www.m00nie.com/2010/12/password-less-ssh-login-using-pki-to-cisco-ios/

答案1

几年前,我也做过同样的工作。以下是我当时做的事情,希望能有所帮助:

#!/usr/bin/expect -f

set ipadr [lindex $argv 0]
set cmd [lindex $argv 1]
set fich [lindex $argv 2]

if { ${cmd} == 1 } then {set comm "sh flash | tee tftp://TFTP-IP-ADDRESS/essai\r"} else {set comm "copy flash:${fich} tftp://TFTP-IP-ADDRESS\r"}

spawn ssh niji@${ipadr}
expect {
"password:"  { send "YOURPASSWORDHERE\r" }
"(yes/no)?"  { send "yes\r"; expect { "password:" { send "YOURPASSWORDHERE\r"; }}}
"Name:"      { send "YOURUSERNAMEHERE\r"; sleep 3 ; send "YOURPASSWORDHERE\r"; }
"Connection refused" { exit }
}

expect {
">" { send "en\r" ; sleep 3; send "EN-PASSWD\r";}
"#" { send "\r" }
}


expect {
"#" { send "${comm}" ; sleep 5; send "\r" ;send "\r" }
}

expect {
"#" { send "exit\r"; send "quit\r" }
}

这将使用作为参数提供的 IP 地址连接 IOS 设备。密码和用户名是硬编码的,所以我想你会想要改进这一点。

发送到路由器的命令是“copy run tftp”或类似的命令,但您也可以将其更改为您需要的任何命令。

那是一段时间前的事了,我想如果现在必须重新使用它的话我会做一些返工,但那可能是一个很好的开始的基础。

干杯,

答案2

好的,我发现了这个:

/usr/local/bin/sshpass -p ssh 密码[电子邮件保护]< ios-cmds.txt

其中 ios-cmds.txt 包含单独的行中的所有命令,就好像我按顺序输入它们一样。

此外,我的一位同事建议使用 linux 命令:

expect

编辑:需要注意的一点是,如果 SSH 会话从未发生过,则与交换机的证书交换部分将使命令默默失败,或不执行任何操作。首先连接到交换机以手动接受证书,然后 SSHPASS 将很乐意登录并执行命令。

编辑2:在 YBounya 的评论之后,我得到了这个脚本,它基本上循环遍历连续的 IP 并关闭一系列接口,该脚本接收“on”或“off”作为参数来执行开启或关闭操作:

#!/usr/bin/expect -f

if { [lindex $argv 0] eq "on"} {
set action "no shut\r"
puts "Turning on switchports\n"
  } elseif { [lindex $argv 0] eq "off" } {
set action "shut\r"
puts "Turning off switchports\n"
} else {
puts "No power action found. Provide \"on\" or \"off\"."
exit
}  

proc shutPort {ip action} { 

spawn ssh [email protected].$ip

expect {
    "(yes/no)"              { send "yes\r";
                              expect { "assword:" { send -- "REAL_PASSWORD\r"; }}}
    "assword: "             { send -- "REAL_PASSWORD\r" }
    "No route to host"      { return } ;# switch uses Telnet or just not listen on port 22
    "Connection refused"    { return } ;# switch is not reachable
    "modulus too small"     { return } ;# RSA key is not acceptable
}

expect ">"
send -- "en\r"

expect "assword: "
send -- "REAL_PASSWORD\r"

expect -re "\r\n#"
send -- "conf t\r"

expect "(config)#"
send -- "int ran gig1/0/7-48\r" 

expect  {
  "config-if-range" { send -- $action } ; # if previous sends succeeds, enter interface range mode
  "marker"  { send "int ran gig0/7-48\r"; # interface syntax didn't work
              expect  {
                "config-if-range"   { send -- $action }
                "marker"    { send "int ran fas0/7-48\r";
                              expect  {
                                "config-if-range"   { send -- $action }
                                "marker"    { send "int ran fas0/7-24\r";
                                              expect  {
                                                "config-if-range"   { send -- $action }
} } } } } } }

send -- "exi\r"
send -- "exi\r"
send -- "exi\r"

expect eof
}


for  {set i 42} {$i < 51} {incr i} {

shutPort $i $action
}

相关内容