python 批量创建线程_原创python多线程批量管理工具batch(不断完善)

#!/usr/bin/env python

import threading

import time

import paramiko

import os,sys

from ip import ip_list,web_server,ip_msg

from optparse import OptionParser

from ssh_co.cfg.config import host_msg

def opts():

parser = OptionParser(usage="usage %prog options")

parser.add_option("-i","--item",

dest="item",

default="",

action="store",

)

parser.add_option("-p","--host",

dest="host",

default="",

action="store",

)

parser.add_option("-f","--file",

dest="file",

default="",

action="store",

)

parser.add_option("-s","--sfile",

dest="sfile",

default="",

action="store",

)

parser.add_option("-d","--dfile",

dest="dfile",

default="",

action="store",

)

parser.add_option("-c","--cmd",

dest="cmd",

default="",

action="store",

)

return parser.parse_args()

class Get_date(object):

def ssh_cmd(self,number,user,ip,port,cmd):

for i in xrange(number):

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(ip,port,user,"")

stdin1, stdout1, stderr1 = ssh.exec_command("hostname")

stdin2, stdout2, stderr2 = ssh.exec_command(cmd)

out1 = stdout1.read()

#in2 = stdin2.read()

out2 = stdout2.read()

err2 = stderr2.read()

print "\033[32;1m%s-%s:\n\033[0m%s %s" %(out1.strip(),ip,out2.strip(),err2.strip())

print "\033[33;1m-\033[0m"*120

ssh.close()

def cmd(self,user,ip,port,cmd):

for i in xrange(len(ip)):

a=threading.Thread(target=self.ssh_cmd,args=(1,user,ip[i],port,cmd))

a.start()

def ssh_file(self,number,user,ip,port,path_ssh_key,sfile,dfile):

key = paramiko.DSSKey.from_private_key_file(path_ssh_key)

for i in xrange(number):

ssh = paramiko.Transport((ip,port))

ssh_f=ssh.connect(username = user, pkey = key)

sftp = paramiko.SFTPClient.from_transport(ssh)

path=os.path.split(dfile)[0]

try:

ssh_result=sftp.put(sfile,dfile)

except Exception as e:

for i in xrange(1,len(path.split(‘/‘))+1):

try:

a=path.split(‘/‘)[0:i]

new_path=‘/‘.join(a)

sftp.mkdir(new_path)

except Exception as e:

continue

ssh_result=sftp.put(sfile,dfile)

print "\033[31;1m%s\033[0m"%(ip)

print "\033[32;1m%s:---------->%s\n\033[0m%s"%(sfile,dfile,ssh_result)

print "\033[33;1m-\033[0m"*120

ssh.close()

def file(self,user,ip,port,path_ssh_key,sfile,dfile):

for i in xrange(len(ip)):

a=threading.Thread(target=self.ssh_file,args=(1,user,ip[i],port,path_ssh_key,sfile,dfile))

a.start()

def main():

user=host_msg["user"]

port=host_msg["port"]

path_ssh_key=host_msg["ssh_key"]

get_host_date=Get_date()

opt,args=opts()

ssh_item=opt.item

ssh_file=opt.file

ssh_sfile=opt.sfile

ssh_dfile=opt.dfile

ssh_cmd=opt.cmd

ssh_ip=opt.host

if ssh_cmd:

if ssh_ip:

if args:

args.append(ssh_ip)

get_host_date.cmd(user,args,port,ssh_cmd)

else:

get_host_date.cmd(user,[ssh_ip],port,ssh_cmd)

if ssh_item and ssh_item in ip_msg.keys():

get_host_date.cmd(user,ip_msg[ssh_item],port,ssh_cmd)

#print ssh_item,ssh_cmd,args,ssh_file

if ssh_file:

if ssh_ip:

if args:

args.append(ssh_ip)

get_host_date.file(user,args,port,path_ssh_key,ssh_file,ssh_file)

else:

get_host_date.file(user,[ssh_ip],port,path_ssh_key,ssh_file,ssh_file)

if ssh_item and ssh_item in ip_msg.keys():

get_host_date.file(user,ip_msg[ssh_item],port,path_ssh_key,ssh_file,ssh_file)

if ssh_sfile and ssh_dfile:

if ssh_ip:

if args:

args.append(ssh_ip)

get_host_date.file(user,args,port,path_ssh_key,ssh_sfile,ssh_dfile)

else:

get_host_date.file(user,[ssh_ip],port,path_ssh_key,ssh_sfile,ssh_dfile)

if ssh_item and ssh_item in ip_msg.keys():

get_host_date.file(user,ip_msg[ssh_item],port,path_ssh_key,ssh_sfile,ssh_dfile)

if __name__=="__main__":

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# batch_ops **跨平台(win/linux)批量运维小工具:执行远程命令/上传下载文件** ### 特点: - 完善的命令行提示,比较优雅的输出 - 基于yaml的配置文件,实现灵活的对主机或主机组的操作 - 支持多线程并发执行 - 批量执行支持忽略某个(些)节点的错误 - 传输文件实现了类似rsync的机制 - 跨平台,支持Linux和Windows ### 依赖和实现思路: - 包依赖:docopt(0.6.2),paramiko(2.4.0),pyyaml(3.12) - 将主机组以及主机(格式 name:ip:port)信息写进yaml配置文件,以便灵活选取操作目标 - paramiko 模块实现远程命令和sftp客户端功能。 - 要同时支持并行和串行:抽象出多线程模型,将串行视为多线程中只有一个线程的特例,解决多线程输出乱序问题 - 文件传输功能:由于ssh的sftp子系统只支持单个文件传输,所以需要以递归思想传输目录;尽量减少无谓通信;基于两端文件的mtime和size判断是否需要传输 - 当过程遇到错误时,发送信号给主线程,对于还未开启的线程,则不再开启;对于以开启的线程,等待其完成(这里以任何一种方式将其杀死,都不好阻止其在远程已经开使的命令) ### 使用说明 #### 帮助信息: -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值