Как создать выделенный файл для каждого цикла for, если / else вывод Netmiko access - PullRequest
0 голосов
/ 23 января 2019

Я использую netmiko для доступа к каждому из моих устройств Juniper и Cisco и запускаю свои собственные команды для цикла.Я могу получить доступ и запустить команды и распечатать вывод в каждом цикле.Я хочу, чтобы каждый вывод был сохранен в виде файла и назовите его на основе IP-адреса.Я протестировал его с помощью sys.stdout = open (), но он мог печатать и создавать только для одного устройства и возвращать ошибку ввода-вывода, которая, как я полагал, связана со способом, которым я открываю / создаю файл в цикле.

Получить вывод на печать устройств и создать файл и сохранить файл на основе 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 и запускать команду show arp для устройств juniper, печатать все выходные данные команды, а затем создавать файлы, такие как 1.1.1.1.txt и 1.1..1.2.txt, а затем для устройств cisco он запустит команду show cdp соседей и покажет версию, распечатает все выходные команды и создаст файл и имя 1.1.1.3.txt, 1.1.1.4.txt и 1.1.1.5.txt

Я тестирую его ниже с помощью open (), и он запускает все команды и сохраняет файл только для одного устройства 1.1.1.1 и ошибки ввода-вывода

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:Операция ввода / вывода для закрытого файла. '

1 Ответ

0 голосов
/ 23 января 2019

Почему бы не использовать стандартный файл для записи вместо того, чтобы делать это с stdout ?. Вы можете изменить свой код, чтобы использовать файл и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...