uscr 14.04.2012 11:34

СкриптыВелосипед для автологина на активное сетевое оборудование.

Дисклеймер:


статья написана в попытке развеять застой на ресурсе. Обнаружив, что срач, поднятый lwilis собрал больше комментариев, чем любой другой пост за последнее время, мне стало обидно. Так что это - затравочка, а вы давайте годные посты.

Здравствуйте


Статья короткая от того, что ничего сложного в ней нет. Это - мой способ избавления себя от рутинного вбивания пары логин/пароль при логине на свитч. А если нужно проследить всю цепочку свитчей до серверной (9 свитчей, в среднем), а делается это не 1 и даже не 31 раз за день, то пальцы начинают плакать. Поэтому, под катом пара скриптов и небольшое пояснение по настройке и использованию.


Сам пост:


Сначала скрипты, которые осуществят задуманное. Их нужно положить в один каталог (можно разнести по разным, но это потребует переписывания bash скрипта, что сделать совсем не сложно).

bash скрипт firefox_telneting:

#!/bin/bash





addr=`echo $1 | cut -d / -f 3 | tr ":" " "`


gnome-terminal --tab -t $addr -e "`dirname $0`/i_telneter.py $addr"


python скрипт i_telneter.py (Скрипт отображается неверно. Я постил багу, но всем по пока не поправили, поэтому можно скачать готовый скрипт файлом.):

#!/usr/bin/env python


# -*- coding: utf-8 -*-


import pexpect


import keyring


import os


from sys import argv





tmt = 3


models=['D-Link', 'Cisco', 'UserName', 'Username']


synonims = [[2, 0], [3, 1]]


username = 'username'





ip = argv[1]


def notify(title = 'OLOLO', message = 'trololo', pic = '/usr/share/pixmaps/gnome-color-browser.png'):


os.system("notify-send \"%s\" \"%s\" -i %s" % (title, message, pic))





def auth(tlnt, model, username, ip):


password = keyring.get_password(model, username)





try:


tlnt.expect(['Username:', 'login','UserName'], timeout=tmt)


except pexpect.TIMEOUT:


notify("Обломался автологин на %s" % ip, "Всё в твоих руках.", '/usr/share/pixmaps/faces/coffee.jpg')


tlnt.interact()





tlnt.sendline(username)


tlnt.expect(['Password:','PassWord'])


tlnt.sendline(password)


notify("Автологин на %s" % ip, "Это %s, а ты - %s" % (model, username), '/usr/share/pixmaps/faces/puppy.jpg')


tlnt.interact()


notify("Закрылось соединение на %s" % ip, "Волнует ли тебя это?", '/usr/share/pixmaps/faces/coffee.jpg')


tlnt = pexpect.spawn('telnet %s' % ip)





i = tlnt.expect(models)


for j in synonims:


if i == j[0]:


i = j[1]


break


try:


auth(tlnt, models[i], username, ip)


except pexpect.EOF:


pass


Для работы питонячьего скрипта понадобится установить модули pexpect и keyring (хотя в убунте, например, keyring уже стоит).

Bash скрипт трогать не нужно. Поскольку пароли я предлагаю хранить на брелке gnome-keyring), то с питоном стоит поступить так: зайти в интерактивную консольку питона (для этого просто набрать в консоли: python), импортировать модуль для доступа к брелку (для этого набрать в консоли уже питона: import keyring) и вбить пароли по одному (keyring.set_password('name', 'username', 'password')). В качестве name нужно использовать некоторые идентификаторы. У меня это — D-Link и Cisco. Всё остальное объявляется синонимами.
Синонимы работают так: в переменной models указывается список идентификаторов, к которым привязаны пароли на брелке и строки, по которым expect будет определять, на что мы логинимся. Например, строка запроса имени пользователя будет отличаться для циски и длинка. Для других вендоров тоже можно найти свои особенности. Главное теперь, правильно настроить синонимы. Они указываются вложенными списками в списке synonims по следующему принципу: [номер синонима, номер идентификатора]. Под номером подразумевается порядковый номер в списке models (python считает с нуля, помни об этом, дружок).

Пример:
models = [ длинк, циска, синоним_длинк1, синоним_длинк2, синоним_циска ]
synonims = [ [2,0], [3,0], [4,1] ]

Скрипт активно сообщает о каждом своём чихе с помощью всплывающих уведомлений, а именно — используя программу notify-send, так что нужно не забыть установить её. На этом всё. Далее милые бонусы.

Бонусы
Открытие telnet ссылок в firefox.

    В адресной строке пишем: about:config. Мы в конфигураторе.
    Кликаем правой клавишей на таблице значений -> New -> Boolean
    Создаём запись «network.protocol-handler.expose.telnet = false» и закрываем конфигуратор.
    Теперь кликаем на любую telnet ссылку.
    Браузер спросит: «чем открыть, хозяин?». Вот тут то вы ему и покажете на скрипт firefox-telneting.


Теперь работает.


Открытие telnet ссылок в google crome.
Тут всё сложнее и проще сразу. Хром самый умный. Он знает, что в линуксе за открытие всего и вся отвечает скрипт /usr/bin/xdg-open. Через него и предлагает он открывать незнакомые ссылки. Всё было бы хорошо, но: xdg-open срать хотел на telnet:// ссылки, а даже если бы и знал о сущесвовании их, то всё равно всё испортил бы, потому, что нам нужен автологин, а не простая консолька с телнетом. Поэтому нужно открыть текстовым редактором /usr/bin/xdg-open и в нужную функцию (они зависят от DE, для гнома - open_gnome) добавьте строки:

1
2
3
if (echo "$1" | grep -q '^telnet://'); then
путь/до/скрипта/firefox_telneting $1
exit 0



Теперь совсем всё.


Тэги: pexpect telnet автологин
+ 5 -
Похожие Поделиться

Sergey Vlasenko 14.04.2012 11:43 #
при логине на свитч
я так понимаю это все же маршрутизаторы
uscr 14.04.2012 11:48 #
И маршрутизаторы тоже. В основной массе, всё таки свитчи. DES-3526, например.
Sergey Vlasenko 14.04.2012 11:47 #
Вроде скрипт питоновский, а не вижу не одного отступа, так и должно быть?

P.S.: свои предыдущие сообщения изменять нельзя?
uscr 14.04.2012 11:48 #
Менять нельзя. Отсутствие отступов - местная бага. Перед спойлером со скриптом есть ссылка для скачивания скрипта файлом.