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

88 投票
12 回答
227471 浏览
提问于 2025-04-15 13:24

我想知道怎么从本地的Python(3.0)脚本简单地通过SSH连接到一个远程服务器,输入登录名和密码,执行一个命令,然后把输出结果打印到Python的控制台上。

我希望不使用任何大型的外部库,也不想在远程服务器上安装任何东西。

12 个回答

29

如果你想避免使用额外的模块,可以用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进程进行交互,或者你也可以在服务器上安装一个公钥,这样就可以避免输入密码的提示。

63

你可以自己用Paramiko来编写代码,正如上面提到的那样。或者,你也可以看看Fabric,这是一个用Python写的应用程序,可以帮助你完成你提到的所有事情:

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

我觉得这很符合你的需求。它的体积也不大,不需要在服务器上安装,虽然在客户端需要安装paramiko和pycrypt这两个依赖库。

这个应用以前可以在这里找到,现在可以在这里找到。

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

关于它有几篇不错的文章,不过你要小心,因为它在过去六个月里有了一些变化:

用Fabric部署Django

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

用Fabric和Virtualenv简单易用的部署


后来:Fabric不再需要安装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和ssh合并为一个名为paramiko的库。(这个更正来自pbanka。)

43

我还没试过,但这个 pysftp 模块可能会有帮助,它是基于 paramiko 的。我觉得所有的操作都是在客户端进行的。

比较有意思的命令可能是 .execute(),这个命令可以在远程机器上执行任意指令。(这个模块还有 .get().put 方法,更像是 FTP 的功能)。

更新:

我重新写了这个回答,因为我之前链接的博客文章现在已经无法访问了。提到旧版本的评论现在看起来可能会有点奇怪。

撰写回答