вы пробовали использовать 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
, если хотите, это итератор, который возвращает соответствующие пары