我有一个项目,我需要ssh到大量服务器来频繁调用命令。我认为这可以在python脚本中实现,但是我的要求似乎消除了所有潜在的解决方案。我只能从中间堡垒服务器访问服务器,并且只能使用ssh代理转发的ssh公钥。因此我的要求是:
这就是我现在所拥有的,它适用于几个不需要代理或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')
答案 0 :(得分:0)
您之前提到的parallel-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