如何在ssh-agent上使用ssh-proxy并行ssh进行身份验证?

时间:2014-08-29 21:07:34

标签: python linux python-2.7 ssh proxy

我有一个项目,我需要ssh到大量服务器来频繁调用命令。我认为这可以在python脚本中实现,但是我的要求似乎消除了所有潜在的解决方案。我只能从中间堡垒服务器访问服务器,并且只能使用ssh代理转发的ssh公钥。因此我的要求是:

  • 并行ssh,这样我就不会等待数小时在所有服务器上运行命令
  • ssh公钥支持,因为我无法使用密码验证
  • ssh代理支持,因为我无法通过ssh代理服务器直接ssh到服务器
  • ssh代理支持,因为我需要通过代理服务器将我的(预加载的)ssh公钥发送到服务器
除了第一个要求(并行ssh支持)之外,paramiko似乎提供了上述所有内容。我发现了一个parallel-ssh模块(https://github.com/pkittenis/parallel-ssh),它充当了paramiko的一个薄包装器,但是,除了并行ssh和公钥认证之外,它似乎缺少API支持。

这就是我现在所拥有的,它适用于几个不需要代理或ssh-agent访问的本地服务器:

#!/usr/bin/python2.7

import sys
if 'threading' in sys.modules:
        raise Exception('threading module loaded before patching!')
import gevent.monkey; gevent.monkey.patch_thread()
import paramiko
from pssh import ParallelSSHClient

paramiko.util.log_to_file("filename.log")
hosts = ['ocb100','netllama']
client_key = paramiko.DSSKey.from_private_key_file('/home/netllama/.ssh/id_dsa')
client = ParallelSSHClient(hosts, pkey=client_key)

cmds = client.exec_command('uptime')

1 个答案:

答案 0 :(得分:0)

您之前提到的parallel-ssh模块可以满足您的要求。专门用于代理和代理转发:

  • SSH代理支持 - 本机代理和隧道支持,也是异步的
  • SSH代理转发 - 默认启用。 forward_ssh_agent=True创建ParallelSSH对象。

使用ParallelSSH的示例:

from pssh import ParallelSSHClient
hosts = ['ocb100','netllama']
client = ParallelSSHClient(hosts, proxy_host='bastion')
output = client.run_command('uptime')
for host in output:
    for line in output[host]['stdout']:
        print(line)

执行上述操作的用户的SSH密钥是从正在运行的SSH代理自动加载的,您无需指定pkey参数。

如果您需要更改登录用户,可以设置user参数,例如ParallelSSHClient(hosts, user='netllama')

根据this issue,9月4日在ParallelSSH中添加了SSH代理转发支持。

ParallelSSH已经使用gevent按文档异步执行所有网络请求,它不使用线程或多处理,例如,不像fabric。因此,你也不需要那些gevent导入。

ParallelSSH的文档是here

编辑:更新了最新的库API