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 command exit
(stdin.write('exit\n')
) or dig into the paramiko Channel
object underneath the stdin
object:
stdin.channel.shutdown_write()
If you'd like the bash session to continue for another command, you'll need to use the channel object directly. The documentation for Channel
mentions recv_ready(self)
and recv(self, nbytes)
which will allow you t check for the data before you try to get it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With