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

[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 '.

Это озачает, что сервер предлагает тип подключения который сейчас не поддерживается. Для включения этого типа конекта его необходимо активировать у себя на компьютере (сервере и везде где вы собираетесь использовать подключение к циске по 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. В боевом скрипте эти вещи будут учтены, но ничто не мешает вам доработать скрипт под себя. И не забывайте, что экспериментировать следует на специально выделеном оборудовании, а не на боевых кошках. Так же не забудьте, что логины и пароли следует хранить в отдельных файлах, а не «светить» в конфигах.

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

Тэги: ИТ, Cisco, программирование

Отредактировано:2020-09-07 06:03:46




6 комментариев
Имя: Алексей 🖉
а сам пайтон на цисках работает? Скрипты можно на целевом железе запускать?

Комментарий оставлен: 2019-11-14 00:00:00


Имя: Orcinus Orca 🖉
Алексей, на цисках используется TCL, есть примеры на этом языке для создания интерфейса командной строки через WEB. Но это немного не то, что мне нужно.

В дальнейшем придется связывать скрипты с совершенно непредсказуемыми вещами, от Телеграмма до 1С-ки. На текущий момент стоит задача конфигурировать маршруты в зависимости от времени суток (это можно сделать на самой циске, там есть подобный инструмент) и нагрузки на ИБП. Следующая задача будет в установке маршрутов в зависимости от оплаты счетов разным провайдерам (у нас сейчас 3 провайдера).
Комментарий оставлен: 2019-11-14 00:00:00


Имя: Алексей 🖉
То есть, триггером будет сообщение об оплате в 1С, скрипт автоматически переконфигурирует маршруты?

Приглянись ещё к Jenkins. Вот он как раз заточен под управление разнообразными программами, у которых нет прямого сопряжения друг с другом, при помощи триггеров. И он умеет запускать скрипты на пайтоне. Это робот более выского мета-уровня.


Комментарий оставлен: 2019-11-14 00:00:00


Имя: Orcinus Orca 🖉
Алексей, не совсем, там 1С работает через MS SQL-Server на котором хранится БД, так из определенной таблицы будут браться данные и в зависимости от них строить маршруты для VPN. Технически можно построить OSFP, но он не понимает переключение провайдера с тарифами на помегабайтной основе. В общем, всё слишком сложно чтобы делать не на костылях.

Jenkins на Java, что мне крайне не нравится. Я в бытность клиент-банков на Java уже запарился с их несовместимостью по версиям, сложностью разворачивания. Там установкой интерпретатора не обойтись. А зачем добавлять в систему дополнительные инструменты если имеющихся хватает с головой и выше? Я не люблю усложнять систему только ради усложнения системы.

Комментарий оставлен: 2019-11-14 00:00:00


Имя: Алексей 🖉
Понятно. Интересная задача.

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

Комментарий оставлен: 2019-11-14 00:00:00


Имя: Orcinus Orca 🖉
Алексей, он будет катастрофически избыточным для моих задач.
Комментарий оставлен: 2019-11-14 00:00:00



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

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

Top.Mail.Ru
Top.Mail.Ru LiveInternet Rambler's Top100 Яндекс.Метрика