【发布时间】: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