Сценарий Python SSH для извлечения информации о коммутаторах Cisco при подготовке к миграции сети - PullRequest
0 голосов
/ 17 октября 2018

У меня есть список IP-адресов и полных доменных имен Cisco Nexus5548.Не могли бы вы помочь с сценарием Python для SSH для каждого и извлечь следующее, чтобы импортировать его в формат столбца Excel:

Имя IP Номер порта Описание порта Тип порта Vlans Оптический тип Средний тип 172.xxx hqcr1-swx-x E1 / x Фактическое описание порта (Access или Trunk) 300-305,2276,… 1g-sr, 10g-sr, 1g-glct (медное волокно или twinax)

Это то, что япока что:

import paramiko, getpass, time

devices = {'device1': {'ip': 'xx.xx.xx.xx'}} 
           'device2': {'ip': 'xx.xx.xx.xx'}}
commands = ['show version\n', 'show run\n']

username = input('Username: ')
password = getpass.getpass('Password: ')

max_buffer = 65535

def clear_buffer(connection):
    if connection.recv_ready():
        return connection.recv(max_buffer)

# Starts the loop for devices
for device in devices.keys(): 
    outputFileName = device + '_output.txt'
    connection = paramiko.SSHClient()
    connection.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    connection.connect(devices[device]['ip'], username=username, password=password, look_for_keys=False, allow_agent=False)
    new_connection = connection.invoke_shell()
    output = clear_buffer(new_connection)
    time.sleep(2)
    new_connection.send("terminal length 0\n")
    output = clear_buffer(new_connection)
    with open(outputFileName, 'wb') as f:
        for command in commands:
            new_connection.send(command)
            time.sleep(2)
            output = new_connection.recv(max_buffer)
            print(output)
            f.write(output)

new_connection.close()

Большое спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

вы пробовали использовать exec_command на SSHClient?не знаю, как Cisco работает с открытием / закрытием нескольких каналов, но кажется, что это может помочь отделить вывод каждой команды вверх.

Я бы сделал что-то вроде:

from paramiko import SSHClient, AutoAddPolicy

def process_devices(devices, connect_args, commands):
    with SSHClient() as client:
        client.set_missing_host_key_policy(AutoAddPolicy())

        for device in devices:
            client.connect(device, **connect_args)

            cmdout = []
            for cmd in commands:
                stdin, stdout, stderr = client.exec_command(cmd, timeout=10)
                cmdout.append((stdout.read(), stderr.read()))

            yield (device, cmdout)

что полезно для таких вещей, как:

from getpass import getpass

devices = [
    '127.0.0.1',
]

connect_args = dict(
    username='smason',
    password=getpass("Password: "),
)

commands = [
    "echo hello world",
    "date",
]

for dev, cmdout in process_devices(devices, connect_args, commands):
    print(f"{dev}: {cmdout}")

вы, конечно, можете поместить вывод из process_devices непосредственно в dict, если хотите, это итератор, который возвращает соответствующие пары

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...