在工作中要对多台服务器做相同配置,会重复很多次想同的工作,而且容易出错。下面用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分格密码