#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()