初学python,网上找发些关于paramiko实现python多线程的功能,发现相互抄袭占多.别人的总归是别人的,也同时为了练习技术,就自己写了一个基于paramiko免密认证多线程并发脚本.与大家共勉.使用上的问题的同学也可以联系我.刚开始写基本上是纯shell脚本的思维方式.有经验的同学也欢迎指点一二
#脚本功能简介
1. 同时支持文件传输和命令执行功能
2. 部分代码增加异常判断功能
3. 支持空行和#注释功能
4. 支持多并发执行
#缺陷
1. 输出无颜色标识
2. 无执行结果汇总功能
3. 远程执行的部分命令需加绝对路径(有经验的同学指点下)
4. 用map实现的多线程,非多进程
!!!NOTE!!!
脚本没有线上应用经历,没有经过严格压测,纯属学习功用,使用前请通读自定义修改,如带来运营上损失,与作者无关,
#command内容
file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put
com:::ls /home/linuxlst/sftp_v2.py /home/linuxlst/datafile/songtaoli/paramiko_mabs4.txt
com:::/sbin/ifconfig > /home/linuxlst/ifconfig.log
#com:::/sbin/ifconfig > /home/linuxlst/ifconfig.log
#iplist内容
192.168.37.142 linuxlst redhat 22
192.168.37.144 linuxlst redhat 22
#192.168.37.144 linuxlst redhat 22
#代码内容
#!/bin/env python
#function: upload files throuth ssh protocal and excute command
#-*- conding = utf-8 -*-
import paramiko
import sys
import threading
import os
import re
from multiprocessing.dummy import Pool as ThreadPool
from time import sleep,ctime
MULTI_PROC = 2 #process
pool = ThreadPool(MULTI_PROC)
def Usage():
print '*' * 50
print '''
Usage:
mabs.py command iplist
*****cat command*****
com:::ls /home/linuxlst/datafile/songtaoli/
file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put
*****cat iplist*****
192.168.37.142 linuxlst redhat 22
'''
print '*' * 50
def FileUsage():
print "Usage:"
print " file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put"
def FileTran(comm,TranType,hostname,username,pwd,port):
try:
#print 'hostname:',hostname
#print 'port:',port
t = paramiko.Transport((hostname,int(port)))
t.connect(username=username,password=pwd)
sftp = paramiko.SFTPClient.from_transport(t)
filetran = comm.split(' ')
local = filetran[0].strip('\n')
remote = filetran[1].strip('\n')
if TranType == "put":
#print '***put file %s to remote %s' % (local,remote)
sftp.put(local,remote)
elif TranType == "get":
#print '***get remote file %s to local %s' % (remote,local)
sftp.get(remote,local)
else:
print "ERROR:lack of tran TranType."
sys.exit()
t.close()
except Exception, e:
traceback.print_exc()
try:
t.close()
except:
pass
def Execu(hostname,username,pwd,port,command):
try:
#print '***Run command {%s} on host {%s} by username {%s}' % (command,hostname,username)
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
#ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname,port=int(port),username=username,password=pwd)
stdin,stdout,stderr = ssh.exec_command(command)
#stdin,stdout,stderr = ssh.exec_command('hostname')
#print stdin.read()
print stdout.read()
print stderr.read()
except Exception,e:
print 'change file auth or excute file failed:',e
ssh.close()
def main(config):
ip = config[0]
username = config[1]
pwd = config[2]
port = config[3]
comm = config[4]
print ip,username,pwd,port,comm
maincomm = []
TranType = ''
sp = comm.split(':::')
if sp[0] == "com":
#maincomm = [sp[1].strip('\n'),'com']
commandline = sp[1].strip('\n')
Execu(ip,username,pwd,port,commandline)
elif sp[0] == "file":
m = sp[1].strip('\n')
if re.search('put',m):
TranType = 'put'
#maincomm = [sp[1].strip('\n'),TranType]
commandline = sp[1].strip('\n')
FileTran(commandline,TranType,ip,username,pwd,port)
elif re.search('get',m):
TranType = 'get'
#maincomm = [sp[1].strip('\n'),TranType]
commandline = sp[1].strip('\n')
FileTran(commandline,TranType,ip,username,pwd,port)
else:
print 'ERROR:lack of tran TranType'
FileUsage()
sys.exit()
else:
print 'ERROR:lack com or file mark'
FileUsage()
sys.exit()
def MyMul():
threads = []
com = open(sys.argv[1],'r') #command file
confs = open(sys.argv[2],'r') #config file
confs.seek(0)
config = []
for conf in confs:
com.seek(0)
#print ip,username,port
if not conf.startswith('#') and len(conf) > 1:
ip,username,pwd,port = conf.strip('\r\n').split(' ')
#lconf += 1
for comm in com:
if not comm.startswith('#') and len(comm) > 1:
config.append([ip,username,pwd,port,comm])
pool.map(main,config)
pool.close()
pool.join()
if len(sys.argv) != 3:
Usage()
os.sys.exit()
if __name__ == '__main__':
MyMul()