如何为Netmiko访问的{/ 44}输出创建每个for循环的专用文件

时间:2019-01-23 08:05:15

标签: python json file

我使用netmiko来访问我的Juniper和Cisco设备,并在for循环中运行它们自己的命令。我能够访问和运行命令并在每个循环上打印输出。我希望将每个输出保存为文件,并根据IP地址命名。我已经使用sys.stdout = open()测试了它,但是它只能打印和创建一个设备并返回IO错误,我认为这与我以循环方式打开/创建文件的方式有关。

获取设备的打印输出并创建文件,并基于每个for循环上的ip地址保存文件。

这是我的代码。

for device in devices['mydevice']:
try:
    print('~' * 100)
    print('Connecting to device:',device['ip'])
    connection = netmiko.ConnectHandler(**device)
    if  device['device_type'] == "juniper_junos" :
       print('**********SCAN JUNIPER DEVICES**********')
       sys.stdout=open("Juniper.txt","a")
       print(device['ip'])
       print(connection.send_command('show arp'))
       sys.stdout.close()
       os.rename('Juniper.txt', device['ip'])
    elif device['device_type'] == "cisco_ios" :
       print('**********SCAN CISCO DEVICES**********')
       sys.stdout=open("Cisco.txt","a")
       print(device['ip'])
       print(connection.send_command('show cdp neighbors'))
       print(connection.send_command('show version'))
       sys.stdout.close()
       os.rename('Cisco.txt', device['ip'])
    else :
       print("No valid device type scan")
    connection.disconnect()
except netmiko_exceptions as e:
    print('Failed to ', device['ip'], e)

我添加了sys.stdout = open()和sys.stdout.close(),在这两行之间是设备命令。在循环结束时,我根据IP地址重命名文件。

此代码只能创建1个1.1.1.1文件,然后返回以下错误

Connecting to device: 1.1.1.1
**********SCAN CISCO DEVICES**********
Traceback (most recent call last):
  File "mydevicessh.py", line 20, in <module>
     print('~' * 100)
ValueError: I/O operation on closed file.

我认为是因为我打开和关闭文件的方式。 请指导和进一步协助。谢谢

对于每个IP访问,它将运行命令并创建文件并根据IP命名。例如,我有3个cisco设备和2个juniper设备,在每个for循环上,它将读取ip列表并为juniper设备运行show arp命令,并打印命令的所有输出,然后创建文件,例如1.1.1.1.txt和1.1 .1.2.txt,然后对于cisco设备,它将运行命令show cdp neighbors和show version并打印所有命令输出并创建文件和名称1.1.1.3.txt,1.1.1.4.txt和1.1.1.5.txt

我在下面用open()测试它,它运行所有命令并仅保存一个设备1.1.1.1和IO错误的文件

with open('cisco.txt', 'w') as x:
  sys.stdout = x
  file = open('cisco.txt','w')
  file.write(connection.send_command('show cdp neighbors'))
  file.write(connection.send_command('show arp'))

我遇到相同的错误' ValueError:对关闭文件的I / O操作。'

1 个答案:

答案 0 :(得分:0)

为什么不使用标准文件来写而不是使用stdout来做呢?您可以更改代码以使用file和file.write。而且您无需为其命名,完成重命名后,只需给文件起最终名称即可:

for device in devices['mydevice']:
    try:
        print('~' * 100)
        print('Connecting to device:',device['ip'])
        connection = netmiko.ConnectHandler(**device)
        if  device['device_type'] == "juniper_junos" :
           print('**********SCAN JUNIPER DEVICES**********')
           file=open(device['ip']+".txt","a")
           file.write(device['ip'])
           file.write(connection.send_command('show arp'))
           file.close()
        elif device['device_type'] == "cisco_ios" :
           print('**********SCAN CISCO DEVICES**********')
           file=open(device['ip']+".txt","a")
           file.write(device['ip'])
           file.write(connection.send_command('show cdp neighbors'))
           file.write(connection.send_command('show version'))
           file.close()
        else :
           print("No valid device type scan")
        connection.disconnect()
    except netmiko_exceptions as e:
        print('Failed to ', device['ip'], e)