I have a problem with getting piping to work with paramiko.
This works:
ssh = paramiko.SSHClient()
[...]
stdin, stdout, stderr = ssh.exec_command("find /tmp")
stdout.read()
This does not work (blocks forever on stdout.read()):
[...]
stdin, stdout, stderr = ssh.exec_command("bash -")
stdin.write("find /tmp\n")
stdin.close()
stdout.read()
Any ideas?
EDIT:
I looked at the source code for paramiko, and ChannelFile.close does not really do anything in terms of communication. So I looked at the channel API, and this seems to work:
stdin.write("find /tmp\n")
stdin.flush()
stdin.channel.shutdown_write()
stdout.read()
With some investigation, it appears that
stdin.close()does not actually end the bash session. To do that, you could use the bash commandexit(stdin.write('exit\n')) or dig into the paramikoChannelobject underneath thestdinobject:If you’d like the bash session to continue for another command, you’ll need to use the channel object directly. The documentation for
Channelmentionsrecv_ready(self)andrecv(self, nbytes)which will allow you t check for the data before you try to get it.