Paramiko stdout.read выдает «AttributeError: объект ‘tuple’ не имеет атрибута ‘read'»

#python #ssh #paramiko

#python #ssh #paramiko

Вопрос:

Я новичок в Python, поэтому прошу прощения, если я что-то пропустил.

Я создаю скрипт, который может подключаться к машинам Linux для запуска пары команд и вывода этих результатов для использования в отчете HTML. Когда я запускаю скрипт (за вычетом генерации отчета HTML), он выдает следующую ошибку, когда команды передаются функции, которая выполняет команду CLI:

AttributeError: объект ‘tuple’ не имеет атрибута ‘read’

Как мне обработать этот тип ошибки в функции, когда ей будет передано около 30 различных команд CLI, и ей нужно вернуть результаты?

 import paramiko as paramiko
from paramiko import SSHClient

# Connect

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('', username='', password='', look_for_keys=False)

def ExecSSHCommand(cli):
    stdout = ssh.exec_command(cli)

    print(type(stdout))  # <class 'paramiko.channel.ChannelFile'>

    # Print output of command. Will wait for command to finish.
    print(f'STDOUT: {stdout.read().decode("utf8")}')

    stdout.close()

    # Close the client itself
    ssh.close()

status = ExecSSHCommand('show status') 
service = ExecSSHCommand('show services')
  

Это полная ошибка:

 line 55, in <module>
  status = ExecSSHCommand('show status') line 22,
in ExecSSHCommand print(f'STDOUT: {stdout.read().decode("utf8")}')
AttributeError: 'tuple' object has no attribute 'read' 
  

Ответ №1:

exec_command Действительно, возвращает кортеж stdin / stdout / stderr.

Вы хотите это:

 stdin, stdout, stderr = ssh.exec_command(cli)
  

Еще одна несвязанная вещь заключается в том, что вы не можете закрыть SSHClient после каждой команды. Поэтому это должно быть перемещено из конца ExecSSHCommand функции в конец скрипта:

 ssh.close()