使用Python进行SSH的最简单的方法是什么?

我如何简单地从本地Python(3.0)脚本SSH连接到远程服务器,提供login名/密码,执行命令并将输出结果打印到Python控制台?

我宁愿不使用任何大的外部库或在远程服务器上安装任何东西。

我还没有尝试过,但这个pysftp模块可能会帮助,反过来使用paramiko。 我相信一切都是客户端的。

有趣的命令可能是.execute() ,它在远程机器上执行任意命令。 (该模块还提供了.get().put方法,它们更多地.put了它的FTP字符)。

更新:

我已经重新写了答案后,我原来链接到的博客文章不再可用。 一些引用这个答案的旧版本的评论现在看起来很奇怪。

您可以使用Paramiko自己编码,如上所示。 或者,您可以查看Fabric,一个Python应用程序,用于完成所有您询问的事情:

Fabric是一个Python库和命令行工具,旨在简化部署应用程序或通过SSH协议执行系统pipe理任务。 它提供了运行任意shell命令的工具(作为普通的login用户或通过sudo),上传和下载文件等等。

我认为这符合你的需求。 它也不是一个大型的库,不需要安装服务器,虽然它依赖于需要安装在客户端上的paramiko和pycrypt。

应用程序曾经在这里 。 现在可以在这里find。

 * The official, canonical repository is git.fabfile.org * The official Github mirror is GitHub/bitprophet/fabric 

有好几篇好文章,虽然你应该小心,因为它在过去的六个月里已经改变了:

使用Fabric来部署Django

现代Python黑客工具:Virtualenv,Fabric和Pip

使用Fabric和Virtualenv进行简单和轻松的部署


后来:面料不再需要paramiko来安装:

 $ pip install fabric Downloading/unpacking fabric Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded Running setup.py egg_info for package fabric warning: no previously-included files matching '*' found under directory 'docs/_build' warning: no files found matching 'fabfile.py' Downloading/unpacking ssh>=1.7.14 (from fabric) Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded Running setup.py egg_info for package ssh Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric) Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded Running setup.py egg_info for package pycrypto Installing collected packages: fabric, ssh, pycrypto Running setup.py install for fabric warning: no previously-included files matching '*' found under directory 'docs/_build' warning: no files found matching 'fabfile.py' Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin Running setup.py install for ssh Running setup.py install for pycrypto ... Successfully installed fabric ssh pycrypto Cleaning up... 

然而,这大部分都是美化的:ssh是paramiko的一个分支,两个库的维护者是一样的(Jeff Forcier,也是Fabric的作者), 维护者计划以paramiko的名字重新合并paramiko和ssh 。 (通过pbanka更正)

如果你想避免任何额外的模块,你可以使用subprocess模块来运行

 ssh [host] [command] 

并捕获输出。

尝试像这样:

 process = subprocess.Popen("ssh example.com ls", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output,stderr = process.communicate() status = process.poll() print output 

要处理用户名和密码,可以使用subprocess与ssh进程交互,也可以在服务器上安装公钥,以避免密码提示。

我写了libssh2的Python绑定 。 Libssh2是一个实现SSH2协议的客户端库。

 import socket import libssh2 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('exmaple.com', 22)) session = libssh2.Session() session.startup(sock) session.userauth_password('john', '******') channel = session.channel() channel.execute('ls -l') print channel.read(1024) 

你的“最简单”的定义在这里很重要 – 简单的代码意味着使用一个模块(虽然“大型外部库”是夸张的)。

我相信最新的(积极开发的)模块是paramiko 。 它附带下载的演示脚本,并提供详细的在线API文档。 你也可以尝试PxSSH ,这是包含在pexpect中 。 在第一个链接上有一个简短的示例以及文档。

再一次,就简单性而言,请注意良好的错误检测总是会使代码看起来更加复杂,但是您应该能够重复使用示例脚本中的大量代码,然后将其忽略。

像hughdbrown一样,我喜欢Fabric。 请注意,虽然它实现了自己的声明性脚本(用于进行部署等),但它也可以作为Python模块导入,并在您的程序中使用,而无需编写Fabric脚本。

织物有一个新的维护者,正在重写; 这意味着您将(当前)在网上find的大多数教程都不适用于当前版本。 而且,Google仍然会将旧的“结构”页面显示为第一个结果。

有关最新的文档,您可以检查: http : //docs.fabfile.org

我发现paramiko有些太低级了,Fabric不太适合用作库,所以我把我自己的库叫做spur ,它使用paramiko来实现一个更好的接口:

 import spur shell = spur.SshShell(hostname="localhost", username="bob", password="password1") result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello 

您也可以select在程序运行时打印输出,如果您希望在退出之前查看长时间运行的命令的输出,这将非常有用:

 result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout) 

这对我有效

 import subprocess import sys HOST="IP" COMMAND="ifconfig" def passwordless_ssh(HOST): ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh.stdout.readlines() if result == []: error = ssh.stderr.readlines() print >>sys.stderr, "ERROR: %s" % error return "error" else: return result 

只需使用ssh_decorate

 from ssh_decorate import ssh_connect ssh=ssh_connect('user','password','server') #Run a python function @ssh def python_pwd(): import os return os.getcwd() print (python_pwd())