处理SSH的Python库

34 投票
4 回答
94475 浏览
提问于 2025-04-15 17:14

我打算用Python写第一段处理ssh命令的代码。我在StackOverflow上查了一下,发现有几个Python库可以用来处理通过ssh传递的命令,比如paramikopexpect,还有其他一些库。

具体来说,我需要从远程服务器读取文件内容,通过ssh/scp复制文件,以及在远程服务器上启动脚本后获取输出。

也许一些专家可以给点建议,告诉我哪个库更好,并说明它们的优缺点?

4 个回答

6

上面提到的那些库都有一个共同的缺点,就是它们不能同时连接多个服务器。在现在这个时代,系统管理员需要在成百上千台服务器上运行命令,所以能够处理并行命令执行的库就显得非常重要。我知道的有两个这样的库:

  1. Trigger

  2. Parallel-SSH

Trigger 不仅仅是一个 SSH 的封装,更像是一个网络库,它利用了 Twisted 的核心 API 来实现同时进行的输入输出操作。

Parallel-SSH 是一个对 Paramiko 的简单封装,但它在背后使用了 Gevent 来实现并行的输入输出操作。

31

因为你在协议层面上没有做什么特别的事情,所以你可能不需要把整个协议都用Python实现。你可以直接使用subprocess模块来运行ssh或scp命令。

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

库和包装器:

  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()
    

注意:上面的代码示例只是为了让你有个大概的了解;这些代码没有经过测试。

撰写回答