Pull to refresh

Красивый автологин на активное сетевое оборудование

Reading time 3 min
Views 18K
Добрый день, уважаемые Хабралюди!
Хочу поделиться с вами моим способом упрощения жизни сетевого админа. Предлагаю способ автоматического ввода логина и пароля на все оборудование сразу. Не претендую на новизну и свежесть идеи, но собственное решение гораздо проще, прозрачнее и как-то ближе к сабжу. Добро пожаловать под кат.

Что есть

Имеется провайдерская сеть управляемого оборудования в количестве сотен устройств разных производителей (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, благодаря которому очень просто решаются многие, тривиальные и не очень, задачи. Спасибо за внимание, жду вашей критики, буду рад узнать ваше мнение.
Tags:
Hubs:
+27
Comments 41
Comments Comments 41

Articles