Вступление
Добрый день уважаемые хабражители!
Описанные ниже способ поможет сократить количество рутинной работы при настройке коммутаторов (например Planet, D-Link и др.) в случаях, когда необходимо выполнить несколько десятков — сотен однотипных операций вроде объявления виланов, добавления их на интерфейсы, экспорта конфигурационных файлов на tftp сервер. Безусловно решение далеко не оптимальное и рациональное, но, надеюсь, имеет право на жизнь.
Настройка производится через подключение по протоколу telnet. Увы, не смотря на то что современные свитчи поддерживают ssh и snmp, многие старые железки разумеют только telnet. Способ подойдет для среднего пользователя Windows, не программиста, т.к. используется всего лишь блокнот и пакетные bat файлы (просьба неровнодышащим к параолимпийским играм программистов дальше не читать).
Основной проблемой было найти программу, которая бы позволяла подключаясь к коммутатору по telnet автоматически проходить авторизацию, после чего передавать необходимые команды. Продолжительный поиск по проблеме давал результаты двух типов: код на делфи 15-летней давности и предложения осилить telnet клиент на питоне, что, каюсь, не входило в мои планы.
Чуть позже была найдена небезызвестная Kitty. Документации по программе что кот наплакал и основная часть находится на сайте и форуме без поиска. Подкупило наличие следующих функций: Kitty умеет запускать сохраненные сессии, где можно прописать логин и пароль для авторизации, строку с командами для авто выполнения, а так же путь к файлу со скриптом. Скрипт выполнятся после авторизации, его размер должен быть меньше 4096 байт или около 100 не длинных строк.
Подготовка
По умолчанию настройки Kitty хранятся в реестре, что не очень удобно. Создаем kitty.ini со следующим содержимым:
[KiTTY]
savemode=dir
initdelay=1.0
commanddelay=1.0
bcdelay=5
KittyPath=C:\Windows\System32\putty.exe
Где savemode=dir заставляет Kitty хранить сессии в папке Sessions. Задержки в моем случае почти не отличаются от стандартных, их можно и подкрутить, главное, чтобы команды успевали отправляться и отрабатывать.
Копируем putty.exe, kitty.exe и kitty.ini в System32 и выполняем:
kitty.exe -convert-dir
После этого настройки начинают подтягиваться из kitty.ini, а сессии сохраняются в C:\Windows\System32\Sessions.
Запускаем kitty.exe или kitty.exe -launcher
Создаем сессию
Перед созданием сессии рекомендую сохранить в сессии Default Settings оптимальные для себя настройки, в особенности выбрать кодировку UTF-8 в разделе Window — Translation.
Собственно сессия создается и сохраняется как обычно в Putty, только с большим количеством опций. В разделе Session выбираем telnet, прописываем host или ip адрес. В разделе Connection — Data прописываем логин и пароль для авторизации. Сделать это можно как в специальных полях, так и в строке Command или непосредственно в файле скрипта. Кому как нравится, я перепробовал все варианты. В данном примере опишу случай авторизации через строку Command. Синтаксис:
\n отправка символов
\p задержка на одну секунду, можно повторять нужное количество раз
\s05 пауза в секундах, если меньше 10, то пишется с нулем
Все зависит от модели коммутатора и указанных в kitty.ini задержек, подбиралось опытным путем:
\s05LOGIN\n\pPASSWORD\n\p
В строке Login script file указываем путь к файлу скрипта, например C:\scripts\script.txt
Возвращаемся в раздел Session, прописываем имя сессии, например testsession и сохраняем.
Пишем скрипт
В папке с файлом скрипта создаем обычный текстовый документ и сохраняем, например, как script.bat. Открываем его в любимом текстовом редакторе и пишем (и не забываем комментировать):
@echo off
setlocal enableextensions enabledelayedexpansion
chcp 1251
echo.
echo Пример простого скрипта для добавления виланов на коммутаторе D-Link
::---------------------------------------------------
::Генерирование скрипта на лету
@echo null>>script.txt
DEL script.txt
::---------------------------------------------------
FOR /L %%i IN (100,1,105) DO (
@echo #
@echo create vlan %%i tag %%i
)>>script.txt
@echo #>>script.txt
@echo logout>>script.txt
::---------------------------------------------------
::Запуск скрипта
start /wait kitty.exe -load "testsession"
pause
Первая часть скрипта позволяет выводить комментарии на русском языке. Правда для начала в свойствах командной строки нужно выставить шрифт Lucida Console. echo выводит комментарии при выполнении пакетного файла, :: двойное двоеточие — комментарии в коде (не употребляйте их в циклах).
Во второй части чистим существующий или не существующий файл, затем записываем в него скрипт. Все что угодно душе и поставленной задаче.
В третьей части запускаем Kitty с параметром -load «имя_сессии», где /wait определяет, что командный файл будет ждать пока завершится выполнение Kitty, а pause позволяет увидеть закончилось выполнение c ошибкой или всё в порядке.
Содержимое получившегося текстового файла:
#
create vlan 100 tag 100
#
create vlan 101 tag 101
#
create vlan 102 tag 102
#
create vlan 103 tag 103
#
create vlan 104 tag 104
#
create vlan 105 tag 105
#
logout
Как можно догадаться при выполнения скрипта Kitty ожидает строку оканчивающуюся на # (или любое другое окончание, пример ниже) и отправляет в ответ следующую строку и т.д.
::Сохранение конфигурации на коммутаторе Planet
@echo #>>testscript2.txt
@echo copy running-config startup-config>>testscript2.txt
@echo :>>testscript2.txt
@echo Y>>testscript2.txt
@echo #>>testscript2.txt
@echo exit>>testscript2.txt
В скрипт можно перенести этап авторизации, а перед логаутом, например, добавить сохранение и экспорт конфигурационного файла.
Заключение
Таким образом можно формировать достаточно объемные скрипты и сравнительно быстро их выполнять. Недостатком, конечно же является то, что выполнять их придется частями, но таково ограничение Kitty. Наверняка есть множество других способов решения подобных задач — от загрузки готового конфига на коммутатор, до использования специализированного софта. Спасибо за внимание.
P.S.
Так же удобно выполнять команды следующего рода (благо их можно быстренько штамповать как скриптом, так и банально в Excel):
start kitty -telnet LOGIN@192.168.0.100 -pass PASSWORD -cmd "<Например какие-нибудь команды>\n\psave\n\plogout"
start kitty -ssh root@192.168.0.1 -pass PASSWORD -cmd "reboot"
P.P.S.
Пример скрипта с expect:
#!/usr/bin/expect -f
set timeout -1
spawn ssh -o PubkeyAuthentication=no LOGIN@IPADDRESS
expect -exact "password: "
sleep 1
send -- "PASSWORD\r"
expect -exact "admin#"
sleep 1
send -- "COMMAND\r"
expect -exact "admin#"
sleep 1
send -- "logout\r"
expect {\$\s*} { interact }