Добрый день, уважаемые Хабралюди!
Хочу поделиться с вами моим способом упрощения жизни сетевого админа. Предлагаю способ автоматического ввода логина и пароля на все оборудование сразу. Не претендую на новизну и свежесть идеи, но собственное решение гораздо проще, прозрачнее и как-то ближе к сабжу. Добро пожаловать под кат.
Имеется провайдерская сеть управляемого оборудования в количестве сотен устройств разных производителей (Cisco, D'link, Huawei и проч.). У каждого устройства есть каноническое имя, но dns запись для него отсутствует. Имеется список соответствия имен адресам. Все (точнее почти все) устройства предлагают авторизазацию через TACACS+. То есть, в самом худшем случае, чтобы поправить конфиг железки необходимо найти ip устройства по имени в вышеуказанном списке, зателнетиться, ввести логин и пароль и сделать то, что требуется.
Хочется как-то все это дело автоматизировать, и, наконец, не вдалбливать этот пароль тысячи раз в день. Необходимо получить доступ к единице оборудования простым вводом ее имени в шелле системы (cisco style).
Для решения задачи будем использовать:
Для pyhton используется pexpect — реализация expect в контесте этого языка.
Во-первых, необходимо написать скрипт, принимающий ip железки и отправляющий нас в ее шелл. Привожу код скрипта с комментариями, так по-моему проще, и не придется повторяться.
Теперь запустив скрипт и передав параметром ip железки, попадаем прямо в ее шелл без вопросов. Теперь возвращаемся к задаче. Необходимо простым вводом канонического имени получать доступ. Для этого будем использовать bash alias.
Для каждой железки добавим строку в bashrc: "
Теперь простым вводом имени железки в шелле получаем доступ к ней без лишних вопросов.
Хочется сказать большое спасибо разработчикам языка python, благодаря которому очень просто решаются многие, тривиальные и не очень, задачи. Спасибо за внимание, жду вашей критики, буду рад узнать ваше мнение.
Хочу поделиться с вами моим способом упрощения жизни сетевого админа. Предлагаю способ автоматического ввода логина и пароля на все оборудование сразу. Не претендую на новизну и свежесть идеи, но собственное решение гораздо проще, прозрачнее и как-то ближе к сабжу. Добро пожаловать под кат.
Что есть
Имеется провайдерская сеть управляемого оборудования в количестве сотен устройств разных производителей (Cisco, D'link, Huawei и проч.). У каждого устройства есть каноническое имя, но dns запись для него отсутствует. Имеется список соответствия имен адресам. Все (точнее почти все) устройства предлагают авторизазацию через TACACS+. То есть, в самом худшем случае, чтобы поправить конфиг железки необходимо найти ip устройства по имени в вышеуказанном списке, зателнетиться, ввести логин и пароль и сделать то, что требуется.
Чего хочется
Хочется как-то все это дело автоматизировать, и, наконец, не вдалбливать этот пароль тысячи раз в день. Необходимо получить доступ к единице оборудования простым вводом ее имени в шелле системы (cisco style).
Решаем задачу
Для решения задачи будем использовать:
- Конечно же linux — он же на рабочей лошадке.
- Конечно же python — он же решает все админские проблемы очень быстро, просто и прозрачно.
- Конечно же expect — что же еще нам поможет с автологином?
Для pyhton используется pexpect — реализация expect в контесте этого языка.
Во-первых, необходимо написать скрипт, принимающий ip железки и отправляющий нас в ее шелл. Привожу код скрипта с комментариями, так по-моему проще, и не придется повторяться.
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' автологин на cisco, d'link, huawei с детектированием вендора ''' # импортируем необходимые модули import pexpect from sys import argv # принимаем ip адрес аргументом командной строки p=pexpect.spawn('telnet %s' % argv[1]) # данные tacacs+ login='mylogin' password='mypassword' ''' первая итерация - детектируем вендора оборудования. длинк очень любит хвалиться, поэтому его детектируем по наличию текста 'D-Link' в приглашении. Остальные отличаются по приглашению ввода логина. ''' i = p.expect(['.D-Link.','login:','Username:']) if i == 0: print 'D-Link detected' p.expect(['login:','UserName:']) p.sendline(login) p.expect(['Password:','PassWord']) p.sendline(password) i = p.expect(['.4#', '.3#','.Fail.']) if i == 2: ''' Как было сказано - НЕ везде работает tacacs, поэтому если '.Fail.' - логинимся со стандартным именем и паролем. ''' print 'Wrong credentials! Trying default' p.expect(['login:','UserName:']) p.sendline('default') p.expect(['Password:','PassWord']) p.sendline('default') ''' Если зашли удачно - то получаем админа. #3 - обычный пользователь, #4 - админ ''' elif i == 1: print 'enabling admin' p.sendline("enable admin") p.expect('Password:') p.sendline('admin_pass') else: pass p.interact() elif i == 1: ''' для cisco все проще - получаем enable режим автоматом, так что делать ничего не приходится ''' print 'Cisco detected' p.sendline(login) p.expect('Password:') p.sendline(password) p.interact() elif i == 2: ''' Для huawei вводим логин и пароль, и переходим в режим привилегированного пользователя sys ''' print 'Huawei detected' p.sendline(login) p.expect('Password:') p.sendline(password) p.expect('.') print 'enabling sys' p.sendline('sys') p.interact()
Теперь запустив скрипт и передав параметром ip железки, попадаем прямо в ее шелл без вопросов. Теперь возвращаемся к задаче. Необходимо простым вводом канонического имени получать доступ. Для этого будем использовать bash alias.
Для каждой железки добавим строку в bashrc: "
alias имя_хоста="autologin ip_хоста"", а написанный скрипт положим в bin директорию (например /usr/bin/autologin).Теперь простым вводом имени железки в шелле получаем доступ к ней без лишних вопросов.
Вместо послесловия
Хочется сказать большое спасибо разработчикам языка python, благодаря которому очень просто решаются многие, тривиальные и не очень, задачи. Спасибо за внимание, жду вашей критики, буду рад узнать ваше мнение.
