Python Exscript - JunOS

Я пытаюсь запустить скрипт, чтобы показать все настройки и записать их в файлы для маршрутизаторов juniper и CISCO. Пока что скрипт CISCO работает как надо, но дело в маршрутизаторе juniper.

for ii in JUNIPER:
    print ii
    cmd2 = 'show configuration | display set'
    conn.connect(ii)
    conn.login(account1)
    conn.execute(cmd2)
    print conn.response
    #filerouter = open(ii, "w")
    #filerouter.write(conn.response)
    #filerouter.close()

После получения списка устройств для запроса, я запускаю это, но он застревает, как будто есть предел буфера... -

Если я попытаюсь сделать другую команду:
("show configuration | display set | match destination ")
- Я получаю вывод, написанный на файле или экране.

C:\Python27>python.exe C:\User\suserrr\Downloads\shrun.py
'clear' is not recognized as an internal or external command,
operable program or batch file.
Generating configs for ROUTER:  R1.test.site
Generating connect for ROUTER:  R2.test.site
==============
===========
routername
Traceback (most recent call last):
  File "C:\Users\userrr\Downloads\shrun.py", line 40, in <module>
    conn.execute(cmd2)
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\Protocol.py", line 900, in execute
    return self.expect_prompt()
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\Protocol.py", line 999, in expect_prompt
    result = self.expect(self.get_prompt())
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\Protocol.py", line 980, in expect
    result = self._expect(prompt)
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\Protocol.py", line 956, in _expect
    result = self._domatch(to_regexs(prompt), True)
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\SSH2.py", line 329, in _domatch
    if not self._fill_buffer():
  File "C:\Python27\lib\site-packages\exscript-2.1.440-py2.7.egg\Exscript\protocols\SSH2.py", line 303, in _fill_buffer
    raise TimeoutException(error)
Exscript.protocols.Exception.TimeoutException: Timeout while waiting for response from device

=========== ==== Вопрос - Как мне заставить скрипт выполнить RUN и предоставить результат выполнения команды: show configuration | display set 2-й рис показывает ошибку, которую я получаю, но если я изменю команду на: show configuration | display set | match description Я получаю запрошенную информацию. Я не могу добавить что-то в модуль, чтобы exscript/python, чтобы избежать тайм-аута?

3 ответа

Решение

По умолчанию JunOS разбивает на длинные данные, возвращаемые любой командой. Вероятно, происходит то, что устройство Juniper, к которому вы подключаетесь, разбивает на страницы выходные данные show configuration | display set команда, и Exscript имеет тайм-аут, потому что устройство ожидает ввода данных пользователем, чтобы продолжить разбивку на выходные данные команды, а не возвращать запрос, который распознает Exscript.

Я бы сделал следующую модификацию:

for ii in JUNIPER:
    print ii
    cmd2 = 'show configuration | display set | no-more'
    conn.connect(ii)
    conn.login(account1)
    conn.execute(cmd2)
    print conn.response

Это отключит пагинацию вывода для этой конкретной команды и должно немедленно вернуться к приглашению и позволить Exscript вернуть вам вывод. Для удобства я также добавляю возврат каретки в мои команды, а именно:

cmd2 = 'show configuration | display set | no-more\r'

Но полезность выполнения вышесказанного спорна, как будто я правильно помню execute() метод должен делать это для вас в любом случае.

Для работы с устройствами Junos с использованием Python я бы порекомендовал вам использовать PyEZ - https://github.com/Juniper/py-junos-eznc

from jnpr.junos import Device
from lxml import etree

dev = Device('hostname', user='username', password='Password123')
dev.open()

cnf = dev.rpc.get_config()    # similar to 'show configuration | no-more' on cli
print (etree.tounicode(cnf))

dev.close()

Я использую этот скрипт, используя PyEZ с JSON для использования нескольких IP-адресов.

from jnpr.junos import Device
from lxml import etree
import json


config_file = open('config.json')
config = json.load(config_file)
config_file.close()


for host in config['ip']:

    dev = Device(host=host, user=config['username'], 
    password=config['password'], port=22)
    dev.open()
    data = dev.rpc.get_config(options={'format':'set'})
    file_name = dev.facts['fqdn']
    print(etree.tostring(data))
    dev.close()

    f = open(file_name + '.txt', 'w')
    f.write(etree.tostring(data))
    f.close()

файл JSON выглядит так:

   {
  "username": "user",
  "password": "password",
  "ip": [
             "10.255.6.100",
             "10.255.6.101",
             "10.255.6.102",
             "10.255.6.103",
             "10.255.6.104"
           ]
}
Другие вопросы по тегам