2014-08-29 42 views
0

我有一個項目,我需要ssh到大量的服務器頻繁地調用一個命令。我認爲這是可能的從一個python腳本,但我的要求似乎消除所有潛在的解決方案。我只能從中間堡壘服務器訪問服務器,並且只能使用與ssh代理一起轉發的ssh公鑰。因此,我的要求是:如何通過ssh代理與ssh代理並行執行ssh代理以在python中進行身份驗證?

  • 並行的ssh,所以我不是等待數小時到所有服務器上運行命令完成
  • SSH公鑰的支持,我無法使用密碼認證
  • SSH進行代理的支持,我不能沒有通過SSH代理服務器去
  • SSH代理支持直接ssh到服務器,因爲我需要讓我的(預加載)SSH公鑰通過代理服務器發送到服務器

paramiko似乎提供了以上所有的第一個要求(並行ssh支持)的例外。我發現了一個parallel-ssh模塊(https://github.com/pkittenis/parallel-ssh),它可以作爲paramiko的一個薄包裝器,但是,它似乎缺少對並行ssh和公鑰驗證以外的其他任何API的支持。

這裏是我已經有了,現在,這幾個地方的服務器不需要代理或ssh代理訪問的工作原理:

#!/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

考慮Fabric - 它專門設計用於在許多ssh'd服務器上運行命令。 HTTP://www.fabfile。org/ – johntellsall 2014-08-29 21:16:04

+0

您可以在不同線程中同時運行多個paramiko客戶端。那是你需要的嗎? – tdelaney 2014-08-29 21:51:07

+0

我希望避免管理線程的開銷,但如果這是唯一的方法來獲得我需要去的地方,我會試試看。 – netllama 2014-08-30 01:08:29

回答

0

你前面提到的能滿足並行-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按照文檔異步執行所有網絡請求,它不使用線程或多處理,例如結構。你爲此不需要那些gevent進口。

ParallelSSH的文檔是here

編輯:更新了最新庫API