Для начала импортируем библиотеку (если нет в системе — скачать можно на гите)
from Exscript import Account
from Exscript.protocols import SSH2
Для Cisco, например, попингуем Гугл, но ничто не мешает использовать команды для конфигурирования:
acc = Account('USERNAMESSHAAA', 'PASS')
con = SSH2()
con.connect('ROUTER_IP')
con.login(acc)
con.execute('terminal length 0')
con.execute('ping vrf INTERNET 8.8.8.8')
con.send('exit')
output = con.response
В Output будет:
ping vrf INTERNET 8.8.8.8
Wed May 11 19:13:25.551 FET
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/20/21 ms
RP/2/RSP2/CPU1:Msk-1-sr9000#
Именно на Huawei возникла задача, с которой долго боролся — нежелание Exscript ждать выполнения операции, требующей времени и отправки подтверждения. Например, при диагностике пар в линии нужно было подтвердить прерывание сервиса for a while нажатием на y и подтверждением по Enter, а потом подождать пару секунд, пока завершится тест. На этом Exscript вешался, методом проб и ошибок вывел решение.
Пример работы в консоли при ручном подключении к коммутатору для выполнения данной задачи:
sys
Enter system view, return user view with Ctrl+Z.
[SW]int g0/0/5
[SW-GigabitEthernet0/0/5]v
Warning: The command will stop service for a while, continue?[Y/N]:y
Pair A length: 56meter(s)
Pair B length: 56meter(s)
Pair C length: 56meter(s)
Pair D length: 56meter(s)
Pair A state: Open
Pair B state: Open
Pair C state: Open
Pair D state: Open
[SW-GigabitEthernet0/0/5]
А вот так можно сделать в Exscript, ограничивая случайный тест на аплинках через вычет в Description триггера запрета To_Smth_Important_Device:
acc = Account('USERNAMESSHAAA', 'PASS')
con = SSH2()
con.connect('ROUTER_IP')
con.login(acc)
con.execute('screen-length 0 temporary')
con.execute('sys')
con.execute('interface GigabitEthernet0/0/2')
con.execute('disp th')
upck = ''
upck = con.response
if 'To' not in upck:
con.set_prompt(r'Y')
con.execute('vi')
con.set_prompt('Pair D state.{0,20}')
con.execute('Y')
output = con.response
else:
output = 'UPLINK DETECTED! TEST ON UPLINKS RESTRICTED!'
con.send('quit\r')
con.send('quit\r')
con.send('quit\r')
В Output:
/N]:Y
Info: This operation may take a few seconds. Please wait for a moment........done.
Pair A length: 56meter(s)
Pair B length: 56meter(s)
Pair C length: 56meter(s)
Pair D length: 56meter(s)
Pair A state: Open
Pair B state: Open
Pair C state: Open
Pair D state: Open
Парсить вывод можно на своё усмотрение.
Спасибо за внимание!
Комментарии (9)
kvaps
11.05.2016 20:03Спасибо за статью, пользуясь случаем хотел спросить:
Если требуется выполнять серию команд на удаленной машине, причем нужно считать output каждой и в зависимости от него отправлять уже следующую команду.
Насколько целесообразно каждый раз открывать новое SSH-подключение? — и какой в данном случае TrueWay?
Единственный вариант, который я нашел на данный момент, что бы не рвать подключение — это pexpect. Может существует более подходящее решение?crypby
11.05.2016 22:45+1Соединение каждый раз открывать нецелесообразно. Если надо действовать по мере output предыдущей команды, я делаю парс с помощью регулярных выражений из re:
wcid = con.response ev = re.search('regular_expr', wcid) if ev is not None: do smth else: do smth2
Ничто не мешает суммировать Output команд по
wcid ='' wcid+=conn.response
tgz
12.05.2016 09:22+3У цысоньки то хоть NETCONF есть. А хуавей в этом плане полный мрак и днище. Везде какие то косяки и кривизна. Например конфиг заканчивается нулевым байтом, отчего hg напрмиер определяет файл как binary со всеми вытекающими. Приходится уговаривать. Ну и в выводе у них постоянно то \r, то \r\n то еще что-нибудь как разделитель строк. Китайщина, одним словом.
Ну а по теме обязательно читать вот тут https://pynet.twb-tech.com/crypby
12.05.2016 12:58Спасибо за ссылку на курс! Интересно. Кстати, можно на трекерах найти, если кому-то очень хочется, но не можется…
Gray_Wolf
Почему не взять готовый Configuration Manager?
С готовым шедулером для загрузки конфигов, контролем параметров конфигов и прочим.
С бесплатными продуктами я не работал, но думаю какой-нибудь rconfig настроить будет проще чем всё таки пилить свой велосипед.
crypby
Configuration Manager хорош для тривиальных решений и однородных Cisco — сетей. Но оставленные им конфиги зачастую засорены.
Приложение, в котором это используется, взаимодействует с самым разным железом, поэтому использование фирменных утилит какого-то одного вендора не удобно.
Gray_Wolf
Если честно не представляю чем может быть засорён какой нибудь running-config…
Из платных решений я работал с CA Spectrum (с модулем conf man) и IBM Tivoli Netcool Configuration Manager, оба прекрасно работают с железом от различных вендоров (второй позволяет конфигурировать не только сетевое оборудование но и vmware через cli).
rconfig судя по описанию тоже не заточен под конкретного вендора.
Возможно в вашем конкретном случае подобные продукты и не подойдут, но всё же я бы не рекомендовал пилить свой велосипед предварительно не протестировав их.