【发布时间】:2010-10-31 12:12:21
【问题描述】:
如何在 Python 3.0 中建立 SSH 连接?我想将文件保存在设置了无密码 SSH 的远程计算机上。
【问题讨论】:
如何在 Python 3.0 中建立 SSH 连接?我想将文件保存在设置了无密码 SSH 的远程计算机上。
【问题讨论】:
我建议将 ssh 作为子进程调用。它可靠且便携。
import subprocess
proc = subprocess.Popen(['ssh', 'user@host', 'cat > %s' % filename],
stdin=subprocess.PIPE)
proc.communicate(file_contents)
if proc.retcode != 0:
...
您必须担心引用目标文件名。如果您想要更大的灵活性,您甚至可以这样做:
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:
...
【讨论】:
tardata.getvalue()有你的答案
您希望将所有 ssh 功能实现为 python 库吗?看看 paramiko,虽然我认为它还没有移植到 Python 3.0(还没有?)。
如果您可以使用现有的 ssh 安装,则可以使用 Dietrich 描述的 subprocess 方式,或者(另一种方式)您也可以使用 pexpect (website here)。
【讨论】:
第一:
无密码ssh登录两步
在您的终端中
[macm@macm ~]$ ssh-keygen
[macm@macm ~]$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@192.168.1.XX <== change
现在使用 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)
【讨论】:
这可能需要一些工作,因为“twisted:conch”似乎没有 3.0 版本。
【讨论】:
我写了Python bindings for libssh2,它在 Python 2.4、2.5、2.6、2.7 和 3 上运行。
【讨论】:
libssh2 适用于 Python 3.x。
请参阅此堆栈溢出文章
How to send a file using scp using python 3.2?
【讨论】: