0

I'm using paramiko to connect to the remote machine via SSH where a bash command is ran and the stdout output needs to be read line by line as they are sent.

This is what I have so far. get_pty=True needs to be set.

import paramiko
import sys

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh.connect('my.host.com', 22, 'root', key_filename="/home/me/.ssh/id_ed25519")

stdin, stdout, stderr = ssh.exec_command("ls", get_pty=True)
while True:
    v = stdout.channel.recv(1024)
    if not v:
        break
    sys.stdout.write(v)
    sys.stdout.flush()

Running this gives the error

  File "/home/me/test.py", line 13, in <module>
    sys.stdout.write(v)
TypeError: write() argument must be str, not bytes

What is the correct way to read the multi-line output from running the command?

gameveloster
  • 901
  • 1
  • 6
  • 18

1 Answers1

1

The channel stdout gave you bytes, but the sys.stdout is a TextIO. Use sys.stdout.buffer.write(...) instead.

Keith
  • 42,110
  • 11
  • 57
  • 76