【问题标题】:how to parallel ssh over ssh proxy with ssh-agent for authentication in python?如何在 ssh 代理上并行 ssh 与 ssh-agent 以在 python 中进行身份验证?
【发布时间】:2014-10-23 22:30:10
【问题描述】:

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

  • 并行 ssh,这样我就不用等几个小时才能在所有服务器上运行命令完成
  • ssh 公钥支持,因为我不能使用密码认证
  • ssh 代理支持,因为我无法在不通过 ssh 代理服务器的情况下直接 ssh 到服务器
  • ssh 代理支持,因为我需要将我的(预加载的)ssh 公钥通过代理服务器发送到服务器

paramiko 似乎提供了上述所有内容,但第一个要求(并行 ssh 支持)除外。我发现了一个并行 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')

【问题讨论】:

  • 考虑 Fabric——它是专门为在大量 ssh 的服务器上运行命令而设计的。 fabfile.org
  • 您可以在不同的线程中同时运行多个 paramiko 客户端。这是你需要的吗?
  • 我希望避免管理线程的开销,但如果这是到达我需要去的地方的唯一方法,我会试一试。

标签: python linux python-2.7 ssh proxy


【解决方案1】:

您之前提到的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')

SSH 代理转发支持已于 9 月 4 日根据this issue 添加到 ParallelSSH。

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

ParallelSSH 的文档是here

编辑:针对最新的库 API 更新

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2012-11-11
    • 2014-08-04
    相关资源
    最近更新 更多