处理SSH的Python库

33

我将编写用于处理Python SSH命令的第一段代码,经过在Stackoverflow上的搜索,发现有几个可用于处理通过SSH传递的命令的Python库,如ParamikoPexpect和其他一些库。

特别地,我需要从远程服务器读取文件内容,通过SSH/SCP复制文件,在远程服务器上启动脚本后获取输出。

也许一些专家可以建议哪个库更好,并指明其优点或缺点?

4个回答

32

由于在协议级别上您没有进行任何特殊操作,因此您可能不需要完全使用Python实现协议,而可以使用subprocess模块运行ssh/scp命令。

import subprocess
subprocess.check_call(['ssh', 'server', 'command'])
subprocess.check_call(['scp', 'server:file', 'file'])

11
不知道为什么你会被踩,但我已经搜索了一下,这仍然是最适合那些不想在机器上安装一组库却需要让他们的代码工作的人的最佳解决方案。 - saccharine
1
是的。它还将利用主机别名、ProxyCommands和其他~/.ssh/config设置。 - Tobu
3
投票反对的原因:依赖外部二进制文件。不跨平台。不可编程,即依赖于外部提供的配置和密钥。运行顺序子进程会产生大量开销,对于多个远程主机不具有良好的可扩展性。还有其他问题,但这些是重要的。 - danny
1
@danny,它完美地匹配了我的使用情况,我相信对许多其他人也是如此。 - wobbily_col
3
@wobbily_col 我相信它确实可以,但是OP特别要求Python库。OpenSSH二进制文件不是Python库。 - danny
显示剩余4条评论

27

库、封装:

  1. http://www.lag.net/paramiko/

#!/usr/bin/env python
import paramiko
from contextlib import contextmanager
host = '192.168.10.142'
username = 'slacker'
password = 'password'
def create_ssh(host=host, username=username, password=password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    try:
       print "creating connection"
       ssh.connect(host, username=username, password=password)
       print "connected"
       yield ssh
    finally:
       print "closing connection"
       ssh.close()
       print "closed"

1) 使用 2) 并提供一些高级功能。如果后者符合您的要求,建议尝试使用 1)。


更新:1) 已经不存在了(2017-09-12)

  1. http://media.commandline.org.uk/code/ssh.txt(示例用法:https://zeth.net/archive/2008/05/29/sftp-python-really-simple-ssh/

s = ssh.Connection('example.com', 'warrior', password = 'lennalenna')
s.put('/home/warrior/hello.txt', '/home/zombie/textfiles/report.txt')
s.get('/var/log/strange.log', '/home/warrior/serverlog.txt')
s.execute('ls -l')
s.close()

注意: 上面的代码示例仅用于了解;这些代码未经测试。


6
没有以上讨论的库所提供的一个特性是对多个服务器的并发连接。在今天,系统管理员需要在数百台服务器上运行命令的情况下,可以处理并行命令执行的库非常重要。我知道的两个库是:
1. Trigger 2. Parallel-SSH Trigger不仅仅是SSH包装器,更像是一个网络库,它利用Twisted核心API实现并发I/O操作。
Parallel-SSH是一个库,它是Paramiko的薄封装器,但在内部使用Gevent来实现并发I/O操作。

强调并发点。此外,特别是Parallel-SSH本身支持SFTP以及SSH功能,如代理和代理转发,所有这些都使用gevent通过异步网络I/O实现。 - danny

3

试试看Twisted Conch。它可以处理你需要的一切。如果你只是想要SCP风格的文件传输,你可以使用Python模块secsh-filexfer


1
secsh-filexfer 的链接已失效。 - nmichaels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接