@MrCheatEugene
Человек. Учусь кодить.

Как можно получить stdout команды в реальном времени через Paramiko?

Необходимо выполнить команду, подключившись по SSH(я использую Paramiko), и получить от неё строку stdout тогда, когда она была возвращена.
Сначала я пытался сделать это через асинхронную функцию, но до конца не понял, как это нужно делать.

Текущий код запускается, но не даёт stdout команды вообще, хотя он есть.
код
import paramiko
import time
import asyncio

def line_buffered(f):
    line_buf = ""
    while not f.channel.exit_status_ready():
        line_buf += f.read(1)
        if line_buf.endswith('\n'):
            yield line_buf
            line_buf = ''

def sshExec(ipaddress,deviceUsername,devicePassword,sshPort,command): #finalDict
    try:
            print("Performing SSH Connection to the device")
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(ipaddress, username=deviceUsername, password=devicePassword, port=sshPort, look_for_keys=False, allow_agent=False)
            print("Channel established")
            (stdin, stdout, stderr) = client.exec_command(command)
            stdin.close()
            for line in stdout.read().splitlines():
                print(line)
            client.close()
            print("Channel is closed")
    except Exception as e:
        print(e)       


def main():
    start = time.time()

    tasks = []
    #tasks.append(asyncio.create_task(sshExec('ev3dev','robot','maker','22',"brickrun /home/robot/mouse/main.py")))
    #await asyncio.gather(*tasks)

    #end = time.time()
    #print("The time of execution of above program is :", end-start)
    
#if __name__ == "__main__":
    #asyncio.run(main())
sshExec('hostname','user','password','22',"command")


Можно ли как-то получить stdout команды в реальном времени через Paramiko или любой другую SSH библиотеку в питоне?
  • Вопрос задан
  • 19 просмотров
Пригласить эксперта
Ответы на вопрос 1
@stepanof23
DevOps/DataOps
У меня работает код, похожий Ваш. С некоторыми отличиями:
stdin, stdout, stderr = client.exec_command(command)
err = stderr.read()
out_str = stdout.read().decode()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы