我使用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操作。'
答案 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)