使用Python进行SSH的最简单方法是什么?
我想知道怎么从本地的Python(3.0)脚本简单地通过SSH连接到一个远程服务器,输入登录名和密码,执行一个命令,然后把输出结果打印到Python的控制台上。
我希望不使用任何大型的外部库,也不想在远程服务器上安装任何东西。
12 个回答
如果你想避免使用额外的模块,可以用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进程进行交互,或者你也可以在服务器上安装一个公钥,这样就可以避免输入密码的提示。
你可以自己用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
关于它有几篇不错的文章,不过你要小心,因为它在过去六个月里有了一些变化:
现代Python黑客工具:Virtualenv、Fabric和Pip
后来: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。)
我还没试过,但这个 pysftp 模块可能会有帮助,它是基于 paramiko 的。我觉得所有的操作都是在客户端进行的。
比较有意思的命令可能是 .execute()
,这个命令可以在远程机器上执行任意指令。(这个模块还有 .get()
和 .put
方法,更像是 FTP 的功能)。
更新:
我重新写了这个回答,因为我之前链接的博客文章现在已经无法访问了。提到旧版本的评论现在看起来可能会有点奇怪。