How can I make an SSH connection in Python 3.0? I want to save a file on a remote computer where I have password-less SSH set up.
6 Answers
I recommend calling ssh as a subprocess. It's reliable and portable.
import subprocess
proc = subprocess.Popen(['ssh', 'user@host', 'cat > %s' % filename],
stdin=subprocess.PIPE)
proc.communicate(file_contents)
if proc.retcode != 0:
...
You'd have to worry about quoting the destination filename. If you want more flexibility, you could even do this:
import subprocess
import tarfile
import io
tardata = io.BytesIO()
tar = tarfile.open(mode='w:gz', fileobj=tardata)
... put stuff in tar ...
proc = subprocess.Popen(['ssh', 'user@host', 'tar xz'],
stdin=subprocess.PIPE)
proc.communicate(tardata.getvalue())
if proc.retcode != 0:
...

- 205,541
- 37
- 345
- 415
-
proc.communicate(tardata) says TypeError: must be string or buffer, not _io.BytesIO – monty0 Sep 11 '13 at 19:04
-
then `tardata.getvalue()` has your answer – Dietrich Epp Sep 11 '13 at 19:06
You want all of the ssh-functionality implemented as a python library? Have a look at paramiko, although I think it's not ported to Python 3.0 (yet?).
If you can use an existing ssh installation you can use the subprocess
way Dietrich described, or (another way) you could also use pexpect
(website here).

- 191
- 6
- 18

- 112,638
- 29
- 165
- 179
-
That OP asked for Python 3 option, but you mentioned paramiko anyways. But I agree the downvote is undeserved, given that's not all you said. Forgive me. – tshepang Jan 10 '13 at 12:16
-
1the [paramiko homepage](http://www.paramiko.org) now states that it also works with python 3.3+. Quote:"Paramiko is a Python (2.6+, 3.3+) implementation of the SSHv2 protocol [1], providing both client and server functionality..." – klaas Sep 22 '14 at 18:18
First:
Two steps to login via ssh without password
in your terminal
[macm@macm ~]$ ssh-keygen
[macm@macm ~]$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@192.168.1.XX <== change
Now with python
from subprocess import PIPE, Popen
cmd = 'uname -a'
stream = Popen(['ssh', 'root@192.168.1.XX', cmd],
stdin=PIPE, stdout=PIPE)
rsp = stream.stdout.read().decode('utf-8')
print(rsp)

- 1,959
- 23
- 25
libssh2 works great for Python 3.x.
See this Stack Overflow article
How to send a file using scp using python 3.2?
I have written Python bindings for libssh2, that run on Python 2.4, 2.5, 2.6, 2.7 and 3.

- 2,077
- 2
- 17
- 16
It might take a little work because "twisted:conch" does not appear to have a 3.0 variant.

- 10,122
- 10
- 42
- 61