Страница 1 из 2
Работа со свитчами через paramiko из Python
Добавлено: 20 мар 2017 00:28
norguhtar
Ребят может вы проясните каким образом со свитчами работать из чего-то отличного чем обычный интерфейс CLI? Попытка использовать вот такой код приводит к подвисанию скрипта
Код: Выделить всё
#!/usr/bin/python
import paramiko
host = "swip"
user = "admin"
pwd = "admin"
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=pwd)
print "exec command\n"
stdin,stdout,stderr = client.exec_command('sh ver'')
print "executed command\n"
print stdout.read()
client.close()
Выводится
и все дальше висяк. Попытка сделать тоже самое при помощи Net::SSH2 в perl приводит к тому же. Проверка кода на linux и mikrotik никаких проблем не выявляет. Так каким образом и что нужно исправить чтобы это заработало? Меня сильно удручает то что в целом базовые вещи не работают.
Версии ПО на свитче
Код: Выделить всё
SW version 1.1.45[5bb753fb] ( date 30-May-2016 time 12:24:53 )
Boot version 0.0.0.3 ( date 23-Feb-2011 time 17:40:14 )
HW version 01.06
Код: Выделить всё
System Description: MES2124M AC 28-port 1G Managed Switch
Сама железяка.
Re: Работа со свитчами через paramiko из Python
Добавлено: 20 мар 2017 14:30
Evgen_94
Добрый день.
Попытка использовать вот такой код приводит к подвисанию скрипта
По какой-то причине скрипт не отправляет на коммутатор команду. Можете попробовать написать скрипт через exscript.
Код: Выделить всё
#!/usr/bin/env python
from Exscript import Account
from Exscript.protocols import SSH2
acc = Account('user','pass')
conn = SSH2()
conn.connect('192.168.10.12')
conn.login(acc)
conn.execute('sh ver')
print conn.response
conn.send('exit\r')
conn.close()
Re: Работа со свитчами через paramiko из Python
Добавлено: 20 мар 2017 15:30
norguhtar
Evgen_94 писал(а):Добрый день.
Попытка использовать вот такой код приводит к подвисанию скрипта
По какой-то причине скрипт не отправляет на коммутатор команду. Можете попробовать написать скрипт через exscript.
А теперь вопрос почему Exscript работает а Paramiko на базе которого он написан нет? У меня есть мысль, что к свитчу не уходит управляющий код о завершении команды и ее запуске. Может быть уточните какая у вас эмуляция терминала используется и что нужно отправлять перевод строки (\n) или перевод коретки (\r) ?
Судя по исходникам Exscript и тому что вы дальше пишете \r подается.
Re: Работа со свитчами через paramiko из Python
Добавлено: 20 мар 2017 18:12
Evgen_94
Судя по исходникам Exscript и тому что вы дальше пишете \r подается.
Всё так.
А теперь вопрос почему Exscript работает а Paramiko на базе которого он написан нет?
Вопрос интересный.
Re: Работа со свитчами через paramiko из Python
Добавлено: 20 мар 2017 23:46
norguhtar
Неа не работает вами предложенный модуль. Попробуйте к примеру получить вывод
Код: Выделить всё
conn.execute('enable')
print conn.response
conn.execute('sh interfaces switchport gi 0/1')
print conn.response
Т.е. включить привилегированный режим и затем получить данные по порту. Как вы думаете что получим? Правильно он не включится. Более того пишет
Проще говоря у свитчей адово кривой CLI который не возможно автоматизировать.
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 09:14
Evgen_94
Неа не работает вами предложенный модуль. Попробуйте к примеру получить вывод
Код: Выделить всё
conn.execute('enable')
print conn.response
conn.execute('sh interfaces switchport gi 0/1')
print conn.response
Т.е. включить привилегированный режим и затем получить данные по порту. Как вы думаете что получим? Правильно он не включится. Более того пишет
Код: Выделить всё
% Unrecognized command
Вы под каким пользователем пытаетесь зайти? С какой привилегией? Если у пользователя 15 привилегия, то вы уже заходите в привилегированном режиме. Попробуйте задать пароль на enable,и в скрипте укажите этот пароль
Логика выполнения команды conn.execute такая: если при подключении к железке в консоле будет решетка на конце, то enable не будет использоваться, если на конце будет > , то по умолчанию будет использоваться команда enable. На месах на enable необходимо обязательно задать пароль.
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 10:30
Голубцов Дмитрий
norguhtar писал(а):Проще говоря у свитчей адово кривой CLI который не возможно автоматизировать.
Из каких соображений вы приняли решение о "кривости" CLI? Очень странно, когда человек пишет такие фразы только из-за того, что какой-то инструмент не заработал как надо с первого раза. Пробовали ли вы другие варианты автоматизации?
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 11:08
norguhtar
Голубцов Дмитрий писал(а):Из каких соображений вы приняли решение о "кривости" CLI? Очень странно, когда человек пишет такие фразы только из-за того, что какой-то инструмент не заработал как надо с первого раза. Пробовали ли вы другие варианты автоматизации?
Я пробовал 3 разных модуля для CLI и все три работают весьма и весьма странно. Если вы считаете что с CLI проблем нет то не могли бы вы привести примеры работы с CLI коммутатора. Из perl при помощи к примеру Net::SSH2 и из python при помощи модуля paramiko. Нужно буквально выполнение 3 сценариев.
- Получение информации в не привилегированном режиме. К примеру sh ver
- Включение привилегированного режима. И вывод информации по порту sh interfaces switchport gi 0/1
- Включение режима конфигурации и к примеру выключение порта
На данный момент даже первый сценарий работает только в одной вариации. Причем тот же paramiko отлично работает и с linux и mikrotik. А вот с коммутатором eltex не работает по той же схеме. По мне это как раз таки говорит о проблемах не в модуле, а софте коммутатора. К примеру своя особенная эмуляция терминала. По этому и задаются вопросы.
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 11:14
norguhtar
Evgen_94 писал(а):Вы под каким пользователем пытаетесь зайти? С какой привилегией? Если у пользователя 15 привилегия, то вы уже заходите в привилегированном режиме.
Это как? Приглашение выглядит как
И без ввода enable банально не доступны команды.
Evgen_94 писал(а):Попробуйте задать пароль на enable,и в скрипте укажите этот пароль
Логика выполнения команды conn.execute такая: если при подключении к железке в консоле будет решетка на конце, то enable не будет использоваться, если на конце будет > , то по умолчанию будет использоваться команда enable. На месах на enable необходимо обязательно задать пароль.
Эммм. Ничего не понял. Почему при банальном ручном подключении ssh этого всего не требуется? И все работает. А тут начинаются какие-то танцы с бубном. Так же не понял почему обязательно требуется указание пароля на enable
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 11:46
Evgen_94
еа не работает вами предложенный модуль. Попробуйте к примеру получить вывод
Код: Выделить всё
conn.execute('enable')
print conn.response
conn.execute('sh interfaces switchport gi 0/1')
print conn.response
Попробуйте убрать.
Код: Выделить всё
conn.execute('enable')
print conn.response
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 12:01
Evgen_94
В СЦ скрипт отрабатывает. Для примера прикладываю.
Код: Выделить всё
#!/usr/bin/env python
from Exscript import Account
from Exscript.protocols import SSH2
acc = Account('test1','eltex')
conn = SSH2()
conn.connect('192.168.10.12')
conn.login(acc)
conn.execute('terminal datadump')
conn.execute('sh int switchport gi0/1')
print conn.response
conn.execute('sh run')
print conn.response
conn.execute('sh ver')
print conn.response
conn.send('exit\r')
conn.close()
Вывод:
Код: Выделить всё
./simple1.py
sh int switchport gi0/1
Port : gi1/0/1
Port Mode: Access
Gvrp Status: disabled
Ingress Filtering: true
Acceptable Frame Type: all
Ingress UnTagged VLAN ( NATIVE ): 10
Protected: Disabled
Port is member in:
Vlan Name Egress rule Port Membership Type
---- -------------------------------- ----------- --------------------
10 - Untagged Static
Forbidden VLANS:
Vlan Name
---- --------------------------------
Classification rules:
Protocol based VLANs:
Group ID Vlan ID
------------ -------
Mac based VLANs:
Group ID Vlan ID
------------ -------
Subnet based VLANs:
Group ID Vlan ID
------------ -------
sh run
vlan database
vlan 10
exit
!
qos advanced
!
hostname MES2124MB
!
username test password encrypted 598be21a481bc492783ea6566abffefc6e4a316a privilege 15
username test1 password encrypted 598be21a481bc492783ea6566abffefc6e4a316a
!
line ssh
password 598be21a481bc492783ea6566abffefc6e4a316a encrypted
exit
!
ip ssh server
!
interface gigabitethernet 1/0/1
switchport access vlan 10
exit
!
interface gigabitethernet 1/0/2
channel-group 1 mode auto
exit
!
interface gigabitethernet 1/0/3
channel-group 2 mode on
exit
!
interface vlan 10
ip address dhcp
exit
!
sh ver
SW version 1.1.44[a0025cf1] ( date 12-Jan-2016 time 16:23:25 )
Boot version 0.0.0.3 ( date 23-Feb-2011 time 17:40:14 )
HW version 01.07
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 12:08
Голубцов Дмитрий
Вот пример на expect, его можно легко перенести на питоновский pexpect. Скрипты на perl, paramiko и т.д. можете спросить у других участников форума.
Код: Выделить всё
#!/usr/bin/expect
spawn ssh user@192.168.16.108
expect {
"word:" {send "user\r"}
"yes/no)?" {send "yes\r"; expect "word"; send "user\r"}
}
expect ">"
send "show version\r"
expect ">"
send "enable\r"
expect "#"
send "term data\r"
expect "#"
send "sh interfaces switchport gi 0/1\r"
expect "#"
send "conf\r"
expect "#"
send "int gi 0/12\r"
expect "#"
send "sh\r"
expect "#"
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 12:32
norguhtar
Голубцов Дмитрий писал(а):Вот пример на expect, его можно легко перенести на питоновский pexpect. Скрипты на perl, paramiko и т.д. можете спросить у других участников форума.
expect меня мало интересует. Меня интересуют пример на perl или praramiko и почему на них не работает. Пример на paramiko я привел выше и он не работает на eltex, причем совершенно аналогично не работает и Net::SSH2, т.е. свитч не возвращает данные. При этом на linux и mikrotik срабатывает без проблем.
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 12:34
norguhtar
Evgen_94 писал(а):В СЦ скрипт отрабатывает. Для примера прикладываю.
Эм.. Ребят я не пойму почему в случае использования Exscript enable не требуется. А в случае простого подключения требуется?
И остается вопрос с конфигурацией. Или там тоже не требуется вводить configure?
Re: Работа со свитчами через paramiko из Python
Добавлено: 21 мар 2017 12:42
norguhtar
дополнительный вопрос зачем делается вот эта команда: