Магазин / аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники
Google+

[11 ноября 2019 | 14 ноября 2019 | 2 декабря 2019]

Автоматизация работы с Cisco через Pexpect

Решил немного автоматизировать работу с Циской, так как есть серия необходимых действий которые вроде бы и не сложные, но иногда необходимые. А так как их необходимо делать сразу на пачке железяк, то я захотел всё это дело автоматизировать. Ну и учитывая, что я решил побаловаться с Питоном, то автоматизировать решил на Python. Первое с чем пришлось столкнуться — это с несовместимостью версий SSH на современном Линуксе и на устаревших железках Cisco.

По этому, для начала, попробуйте проверить работоспособность SSH на вашем управляющем оборудовании (сервере, Распбери Пи, компьютере администратора).

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# ORCINUS.RU Project

import sys
import os
import pexpect

cisco_ip = passwords['gateway']['addr']
cisco_login = passwords['gateway']['login']
cisco_pw = passwords['gateway']['password']

cisco = pexpect.spawn('ssh %s@%s' % (cisco_login, cisco_ip))
cisco.timeout = 4
print(cisco.readline())

У меня при этом вылезла следующая ошибка: b'Unable to negotiate with 192.168.30.1 port 22: no matching cipher found. Their offer: aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc\r\r\n'.

Это озачает, что сервер предлагает тип подключения который сейчас не поддерживается. Для включения этого типа конекта его необходимо активировать у себя на компьютере (сервере и везде где вы собираетесь использовать подключение к циске по SSH). И так. Редактируем файл /etc/ssh/ssh_config и добавляем в конец файла вот такие строчки:

Host: IP-cisco
   Ciphers aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc

После этого подключаемся из командной строки и подтверждаем работу с нашим RSA ключём. После тестового подключения из командной строки можно начинать работу из скрипта. Но не забывайте, что при установленном баннере на циске вы получите немного другой результат чем у меня. Обратите внимание на то, чтобы в вашем баннере небыло символов # («решётка»). На всех моих устройствах, как знают многие мои читатели, сделан баннер с рамочкой из этих символов.

В общем, немного поэкспериментировав получилось нечто следующее.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# ORCINUS.RU Project

import sys
import os
import pexpect

cisco_ip = 'Адрес кошки'
cisco_login = 'логин'
cisco_pwd = 'пароль'

cisco_expect = ['Name or service not known',
   'No route to host',
   'RSA key fingerprint is SHA256:',
   'Password:',
   '>',
   '#',
   'Connection closed',
   pexpect.EOF]

print('Подключаемся к кошке.')

# Подключение к циске через SSH
cisco = pexpect.spawn('ssh %s@%s' % (cisco_login, cisco_ip))
cisco.timeout = 5

# Ответ при подключении
get_result = cisco.expect(cisco_expect)

if get_result <= 1 or get_result == len(cisco_expect)-1:
   print('Соединение разорвано!')
   sys.exit()

while get_result in [2,3,4,5,6]:
   # Проверяем RSA сертификат
   if get_result == 2:
      cisco.sendline('yes')
      print('RSA сертификат принят...')
      get_result = cisco.expect(cisco_expect)
   # Проверяем пароль
   if get_result == 3:
      cisco.sendline(cisco_pwd)
      print('Ввод пароля.')
      get_result = cisco.expect(cisco_expect)
   # Повысить права
   if get_result == 4:
      cisco.sendline('enable')
      print('Повышение прав.')
      get_result = cisco.expect(cisco_expect)
   # Настроить терминал
   if get_result == 5:
      cisco.sendline('terminal length 0')
      print('Вход выполнен успешно.')
      get_result = 0
   # Разрыв коннекта
   if get_result == 6:
      print('Соединение разорвано, проверьте корректность пароля.')
      sys.exit()

#************************************
#* Тело скрипта для работы с циской *
#************************************




#*****************************
#* Завершаем работу с кошкой *
#*****************************

#print(cisco.readline())

cisco.sendline('quit')
print('Работа корректно завершена.')

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

Опять же уже имеющиеся в интернете примеры оказались не пригодными к использованию из-за массы ошибок как при обращении к оборудованию, так и при получении ответов от оборудования. Кстати, по умолчанию в этом примере считается, что пароль для входа на вашу Cisco соответствует паролю для команды enable. В боевом скрипте эти вещи будут учтены, но ничто не мешает вам доработать скрипт под себя. И не забывайте, что экспериментировать следует на специально выделеном оборудовании, а не на боевых кошках. Так же не забудьте, что логины и пароли следует хранить в отдельных файлах, а не «светить» в конфигах.

Если эта тема будет мне интересна, то я её в дальнейшем разовью. Сейчас же мне необходимо лишь обеспечить определённую автоматизацию и добавить возможность управлять оборудованием через Телеграмм.

• Перейти в архив


Комментарии

Включите JavaScript для комментирования.


Этот сайт использует файлы cookies, чтобы упростить вашу навигацию по сайту, предлагать только интересную информацию и упростить заполнение форм. Я предполагаю, что, если вы продолжаете использовать мой сайт, то вы согласны с использованием мной файлов cookies. Вы в любое время можете удалить и/или запретить их использование изменив настройки своего интернет-браузера.

Сообщайте мне о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта. Я готов сотрудничать со всеми желающими. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Рейтинг@Mail.ru LiveInternet Rambler's Top100 Яндекс.Метрика