Назад | Перейти на главную страницу

Как я могу использовать SSH для выполнения команд Cisco IOS в режиме глобальной конфигурации?

Я знаю про Kron, но якобы нет возможности запускать глобальные команды конфигурации:

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

Если я подключаюсь с помощью Putty, Putty может запускать несколько команд после входа в систему, и это работает как шарм. Дело в том, что я хочу автоматически включать коммутатор каждую ночь в 23:00 и отключать ряд интерфейсов.

Я пытаюсь использовать sshpass, но, похоже, разрешает только 1 команду за раз.

Существует также способ входа в коммутаторы cisco без пароля, но начиная с IOS 15.0:

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

Хорошо, я нашел это:

/ usr / local / bin / sshpass -p пароль ssh admin@1.1.1.1 <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 admin@192.168.201.$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
}

Так получилось, что несколько лет назад у меня была такая же работа. Вот что я делал в то время, надеюсь, это поможет:

#!/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" }
}

Это подключает устройство IOS с IP-адресом, предоставленным в качестве аргумента. Пароли и имена пользователей жестко запрограммированы, поэтому я полагаю, вы захотите это улучшить.

На маршрутизатор отправляется команда «copy run tftp» или что-то в этом роде, но вы также можете изменить ее на все, что вам нужно.

Это было некоторое время назад, полагаю, я бы переделал, если бы мне пришлось использовать его сейчас, но это может быть хорошей базой для начала.

Привет,