Автоматизация работы с 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
а сам пайтон на цисках работает? Скрипты можно на целевом железе запускать?