Python Exscript - JunOS

2019-08-08 14:10发布

I'm trying to to run a script to show all of the configuration and write them on files for juniper and CISCO routers. So far the CISCO script is working as it should but the thing is with the juniper router.

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()

After getting the list of devices to query, I run this but it gets stuck as if there is a limit of buffer... -

If I attempt to do a different command:
("show configuration | display set | match destination ")
-- I get the output written on a file or screen.

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

=========== ==== Question - How do i get the script to RUN AND PROVIDE THE OUTPUT OF the command: show configuration | display set the 2nd pic shows the error i get but if I change the command to: show configuration | display set | match description I get the information requested. Am i missing to add something in the module so that exscript/python to avoid the timeout?

3条回答
趁早两清
2楼-- · 2019-08-08 14:43

For handling Junos devices using python, I would recommend you to use 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()
查看更多
Explosion°爆炸
3楼-- · 2019-08-08 14:44

I use this script using PyEZ with JSON for using multiples IP addresses.

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()

the JSON file looks like:

   {
  "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"
           ]
}
查看更多
你好瞎i
4楼-- · 2019-08-08 14:52

By default, JunOS paginates lengthy output returned by any command. What's likely happening is that the Juniper device that you're connecting to is paginating the output of the show configuration | display set command, and Exscript is timing out because the device is waiting on user input to continue pagination of the output of the command, rather than returning a prompt that Exscript recognizes.

I would make the following modification:

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

This will disable output pagination for that particular command, and should return immediately to the prompt and allow Exscript to return the output to you. For good measure I also add a carriage return to my commands as well, ie:

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

But the usefulness of doing the above is debatable, as if I remember correctly the execute() method should be doing this for you anyway.

查看更多
登录 后发表回答