Добрый день, уважаемые Хабралюди!
Хочу поделиться с вами моим способом упрощения жизни сетевого админа. Предлагаю способ автоматического ввода логина и пароля на все оборудование сразу. Не претендую на новизну и свежесть идеи, но собственное решение гораздо проще, прозрачнее и как-то ближе к сабжу. Добро пожаловать под кат.
Имеется провайдерская сеть управляемого оборудования в количестве сотен устройств разных производителей (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, благодаря которому очень просто решаются многие, тривиальные и не очень, задачи. Спасибо за внимание, жду вашей критики, буду рад узнать ваше мнение.