python ssh一括ログイン実行コマンド、配布ファイルの実装


作業中に複数のサーバを同じ構成にすると、同じ作業を何度も繰り返し、エラーが発生しやすくなります.次にpythonのparamikoモジュールを用いて,マルチスレッドのssh接続を用いて一括操作を実現する.
まずparamikoモジュールをインストールします.
ダウンロード:pycrypto-2.6.tar.gz、paramiko-1.7.7.1.zip
pycrypto解凍をインストール後python setupを実行します.py install、paramikoインストールも同様です.
私のコードを参考にしてみましょう.
 
#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
import sys
#ssh      
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
logs=[]
for m in cmd:
stdin, stdout, stderr = ssh.exec_command(m)
#stdin.write("Y")   #    ,   ‘Y’
out = stdout.readlines()
#    
for o in out:
logs.append(o.rstrip())
log = ' '.join(logs)
print '%s %sOK'%(log,ip)
ssh.close()
except Exception,e:
print '%s\t%s'%(ip,e)
#      
def sftp(ip,username,password,cmd):
try :
t = paramiko.Transport((ip, 22))
t.connect(username=username, password=password)
sftp =paramiko.SFTPClient.from_transport(t)
sftp.put(cmd[0], cmd[1]) #  
#sftp.get("cmd[1]",cmd[0])
t.close();
print '%s\tOK'%(ip)
except Exception,e:
print '%s\t%s'%(ip,e)
if __name__=='__main__':
print "Begin......"
filename=sys.argv[1]
key=sys.argv[2]
num=10
# SN 
order={
'sn'    :[
"dmidecode -s system-serial-number",
],
'file' : [
"/root/a.pl",
"/root/a.pl"
]
}
username = "root"  #   
threads = []   #   
j=0
for line in open(filename):
#print line,
if '#' not in line:
(ip,pwd)=line.split("\t")
passwd=pwd.rstrip()
if key=='sn':
a=threading.Thread(target=ssh2,args=(ip,username,passwd,order[key]))
else:
a=threading.Thread(target=sftp,args=(ip,username,passwd,order[key]))
a.start()
threads.append(a)
j=j+1
if(j==num):
for t in threads:
t.join()
j=0
threads=[]
#print "Wait......"
for t in threads:
t.join()

実行コマンドはpython luozです.py 1.log fileまたはsn
            1.logファイルの中でIPにTABの分格のパスワードをプラスします