#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/1/22 23:18 # @Author : xuxuedong # @Site : # @File : sys.py # @Software: PyCharm import os, sys,platform #for linux # if platform.system() == "windows": # Base_DIR = '\\'.join(os.path.abspath(os.path.dirname(__file__)).split('\\')[:-1]) # print(Base_DIR) # else: # Base_DIR = '/'.join(os.path.abspath(os.path.dirname(__file__)).split('/')[:-1]) BASE_DIR =os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) print(BASE_DIR) sys.path.append(BASE_DIR) from salt.core import Handler if __name__ == '__main__': print(sys.argv) t = Handler.ArgvHandler(sys.argv) # c = t.val # print("t",c)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/1/23 9:34 # @Author : xuxuedong # @Site : # @File : ArgvHandler.py # @Software: PyCharm import os, sys,datetime,paramiko,time,traceback,threading,logging import commands,subprocess from logging import handlers class ArgvHandler(object): def __init__(self,argv_list): self.argvs = argv_list self.parse_argv() def parse_argv(self): if len(self.argvs)>5: # if hasattr(self,str(self.argvs[1])): # func = getattr(self,str(self.argvs[1])) # func() self.argv_ckeck() print("get_status",self.servers_file,self.local,self.remote,self.cmd) self.server_get() # else: # self.help_msg() elif len(self.argvs)== 4: self.argv_ckeck() print("cmd",self.cmd ) self.cmd = self.cmd.strip().split(',') print("cmd_list",self.cmd) self.server_get() # else: else: self.help_msg() def server_get(self): self.get_servers(self.servers_file) print("self.SERVERS",self.SERVERS) # self.ssh_connect(self.SERVERS) self.val = [] for server in self.SERVERS: print("server_list",server['host']) self.ip = server['host'] user = server['user'] passwd = server['passwd'] port = server['port'] print("val",self.ip,user,passwd,port) t1 = threading.Thread(target=self.ssh_connect,args=[self.ip,port,user,passwd,self.cmd]) t1.start() t1.join() # print("getname:",t1.getName()) # self.val.append(t1) # for i in self.val: # print("i",i) # i.join() # print("---main---") # print("self.val",self.val) # return self.val def logger(self,log_message): self.log = logging.getLogger(__name__) self.log.setLevel(logging.INFO) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.INFO) ti = time.strftime('%Y-%m-%d',time.localtime(time.time())) log_file = os.getcwd()+"/"+"logs/"+ti+"-"+"access.log" # create file handler an"d set level to warning if log_file: self.fh = logging.FileHandler(log_file) self.fh.setLevel(logging.WARNING) else: self.fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) self.fh.setLevel(logging.WARNING) # create formatter self.formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s') self.fh.setFormatter(self.formatter) self.log.addHandler(self.fh) self.log.error(log_message) self.log.warning(log_message) self.log.info(log_message) def help_msg(self): msg = ''' -f 1.upload file use "up" example: python cmd.py -f server.txt upload_file_name remote_file_name up 2.download file use "get" example: python cmd.py -f server.txt download_file_name remote_file_name up 3.remote_file_name must path example : python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh get python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh up -c 1.Host batch execution command example: python cmd.py -c server.txt "ls -l /service/script,uname -a" server.text format:lists_format:192.168.223.128,root,123456,22,1(ip,user,passwd,port,status) ''' print(msg) def argv_ckeck(self): logs_path = os.getcwd() + u'/logs' if os.path.exists(logs_path): if os.path.isfile(logs_path): print u"日志目录" + logs_path + u"存在,但是文件,终止" sys.exit(1) else: os.mkdir(logs_path) if sys.argv[1] == "-f": self.servers_file = sys.argv[2] self.local = sys.argv[3] self.remote = sys.argv[4] self.cmd = sys.argv[5] if sys.argv[1] == "-c": self.servers_file = sys.argv[2] self.cmd = sys.argv[3] print(self.cmd) # except: # pass # # self.help_msg() # def get_servers(self,file): print("file:",file) self.SERVERS = [] try: with open(file, 'r') as file: while True: line = file.readline() if not line: break try: res = line.strip().split(',') server = { 'host': res[0], 'user': res[1], 'passwd': res[2], 'port': int(res[3]), # 'status': int(res[4]) } self.SERVERS.append(server) except: self.logger(self.SERVERS) return self.SERVERS except: pass # out_log = u"failed to read server lists file:{0}\n{1}".format(file, traceback.format_exc()) # self.logger(out_log, 'error') # sys.exit(1) def upload__callback(self,trans, total): # sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a, a*100/int(b))) # sys.stdout.flush() print 'Data upload %10d [%3.2f%%]\r' % (trans, trans*100/int(total)),; if trans >= total: self.logger('Data Transmission %10d [100.00%%]' % trans, 'info', False) # 和上面一样:作用始终保持同一行,即新打印出来的一行,替换掉之前的那行,保持同一行,不换行。 def download__callback(self,trans, total): # sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a, a*100/int(b))) # sys.stdout.flush() print 'Data download %10d [%3.2f%%]\r' % (trans, trans*100/int(total)),; if trans >= total: self.logger('Data Transmission %10d [100.00%%]' % trans, 'info', False) # 和上面一样:作用始终保持同一行,即新打印出来的一行,替换掉之前的那行,保持同一行,不换行。 def ssh_connect(self,host, port, user, passwd,status): self.ssh = paramiko.SSHClient() try: #paramiko.util.log_to_file('logs/params.log') self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 # ssh.connect(host, port, user, passwd, timeout=5, banner_timeout=5, auth_timeout=5) self.ssh.connect(host, port, user, passwd, timeout=3, banner_timeout=3) # print("self.ssh",self.ssh) if status=='up': obj = getattr(self,'up'+ '_file') obj(self.ssh,self.local,self.remote) print("obj",obj) print("status",status) elif status=='get': obj = getattr(self,'get'+ '_file') obj(self.ssh,self.ip,self.remote) print("obj",obj) print("status",status) else: print("command is:",status) for item in status: print("item",item) stdin, stdout, stderr = self.ssh.exec_command(item) self.err_list = stderr.readlines() for item in stdout.readlines(): # print item, print item if len( self.err_list ) > 0: print 'ERROR:' + self.err_list[0] exit() except Exception as e: out_log = u'ip: {0}\tuser:{1}\ttimeout'.format(host,user) err_log = traceback.format_exc() out_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log) # exit() # self.ssh.close() # return self.ssh # def ssh_exec_cmd(self,ssh,cmd ): # return self.ssh.exec_command(self,cmd) def up_file(self,ssh, localfile, remotefile): try: print("obj is up") sftp = ssh.open_sftp() print("localfile",localfile) print("remotefile",remotefile) sftp.put(localfile, remotefile) sftp.close() except: out_log = u'ip: {0}\tuser:{1}\ttimeout'.format(ssh,remotefile) err_log = traceback.format_exc() out_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log) # self.ssh.close() def get_file(self,ssh, ip, remotefile): if len(remotefile.split('/', 10 )) > 2: self.File = remotefile.split('/', 10 )[len(remotefile.split('/', 10 ))-1] print("FILE",self.File) try: sftp = ssh.open_sftp() sftp.get(remotefile,self.ip + self.File) sftp.close() except: out_log = u'local: {0}\tremot:{1}\ttimeout'.format(self.ip,remotefile) err_log = traceback.format_exc() ut_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log) # self.ssh.clos
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/1/23 9:34 # @Author : xuxuedong # @Site : # @File : ArgvHandler.py # @Software: PyCharm import os, sys,datetime,paramiko,time,traceback,threading,logging import commands,subprocess from logging import handlers class ArgvHandler(object): def __init__(self,argv_list): self.argvs = argv_list self.parse_argv() def parse_argv(self): if len(self.argvs)>5: # if hasattr(self,str(self.argvs[1])): # func = getattr(self,str(self.argvs[1])) # func() self.argv_ckeck() print("get_status",self.servers_file,self.local,self.remote,self.cmd) self.server_get() # else: # self.help_msg() elif len(self.argvs)== 4: self.argv_ckeck() print("cmd",self.cmd ) self.cmd = self.cmd.strip().split(',') print("cmd_list",self.cmd) self.server_get() # else: else: self.help_msg() def server_get(self): self.get_servers(self.servers_file) print("self.SERVERS",self.SERVERS) # self.ssh_connect(self.SERVERS) self.val = [] for server in self.SERVERS: print("server_list",server['host']) self.ip = server['host'] user = server['user'] passwd = server['passwd'] port = server['port'] print("val",self.ip,user,passwd,port) t1 = threading.Thread(target=self.ssh_connect,args=[self.ip,port,user,passwd,self.cmd]) t1.start() # t1.join() print("getname:",t1.getName()) self.val.append(t1) for list in self.val: print("i",list) list.join() print("---main---") print("self.val",self.val) return self.val def logger(self,log_message): self.log = logging.getLogger(__name__) self.log.setLevel(logging.INFO) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.INFO) ti = time.strftime('%Y-%m-%d',time.localtime(time.time())) log_file = os.getcwd()+"/"+"logs/"+ti+"-"+"access.log" # create file handler an"d set level to warning if log_file: self.fh = logging.FileHandler(log_file) self.fh.setLevel(logging.WARNING) else: self.fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) self.fh.setLevel(logging.WARNING) # create formatter self.formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s') self.fh.setFormatter(self.formatter) self.log.addHandler(self.fh) self.log.error(log_message) self.log.warning(log_message) self.log.info(log_message) def help_msg(self): msg = ''' -f 1.upload file use "up" example: python cmd.py -f server.txt upload_file_name remote_file_name up 2.download file use "get" example: python cmd.py -f server.txt download_file_name remote_file_name up 3.remote_file_name must path example : python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh get python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh up -c 1.Host batch execution command example: python cmd.py -c server.txt "ls -l /service/script,uname -a" server.text format:lists_format:192.168.223.128,root,123456,22,1(ip,user,passwd,port,status) ''' print(msg) def argv_ckeck(self): logs_path = os.getcwd() + u'/logs' if os.path.exists(logs_path): if os.path.isfile(logs_path): print u"日志目录" + logs_path + u"存在,但是文件,终止" sys.exit(1) else: os.mkdir(logs_path) if sys.argv[1] == "-f": self.servers_file = sys.argv[2] self.local = sys.argv[3] self.remote = sys.argv[4] self.cmd = sys.argv[5] if sys.argv[1] == "-c": self.servers_file = sys.argv[2] self.cmd = sys.argv[3] print(self.cmd) # except: # pass # # self.help_msg() # def get_servers(self,file): print("file:",file) self.SERVERS = [] try: with open(file, 'r') as file: while True: line = file.readline() if not line: break try: res = line.strip().split(',') server = { 'host': res[0], 'user': res[1], 'passwd': res[2], 'port': int(res[3]), # 'status': int(res[4]) } self.SERVERS.append(server) except: self.logger(self.SERVERS) return self.SERVERS except: pass # out_log = u"failed to read server lists file:{0}\n{1}".format(file, traceback.format_exc()) # self.logger(out_log, 'error') # sys.exit(1) def upload__callback(self,trans, total): # sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a, a*100/int(b))) # sys.stdout.flush() print 'Data upload %10d [%3.2f%%]\r' % (trans, trans*100/int(total)),; if trans >= total: self.logger('Data Transmission %10d [100.00%%]' % trans, 'info', False) # 和上面一样:作用始终保持同一行,即新打印出来的一行,替换掉之前的那行,保持同一行,不换行。 def download__callback(self,trans, total): # sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a, a*100/int(b))) # sys.stdout.flush() print 'Data download %10d [%3.2f%%]\r' % (trans, trans*100/int(total)),; if trans >= total: self.logger('Data Transmission %10d [100.00%%]' % trans, 'info', False) # 和上面一样:作用始终保持同一行,即新打印出来的一行,替换掉之前的那行,保持同一行,不换行。 def ssh_connect(self,host, port, user, passwd,status): ssh = paramiko.SSHClient() try: #paramiko.util.log_to_file('logs/params.log') ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 # ssh.connect(host, port, user, passwd, timeout=5, banner_timeout=5, auth_timeout=5) ssh.connect(host, port, user, passwd, timeout=3, banner_timeout=3) # print("ssh",ssh) if status=='up': obj = getattr(self,'up'+ '_file') obj(ssh,self.local,self.remote) print("obj",obj) print("status",status) elif status=='get': obj = getattr(self,'get'+ '_file') obj(ssh,self.ip,self.remote) print("obj",obj) print("status",status) else: print("command is:",status) for item in status: print("item",item) stdin, stdout, stderr = ssh.exec_command(item) self.err_list = stderr.readlines() for item in stdout.readlines(): # print item, print item if len( self.err_list ) > 0: print 'ERROR:' + self.err_list[0] exit() except Exception as e: out_log = u'ip: {0}\tuser:{1}\ttimeout'.format(host,user) err_log = traceback.format_exc() out_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log) # exit() time.sleep(10) def up_file(self,ssh, localfile, remotefile): try: print("obj is up") sftp = ssh.open_sftp() print("localfile",localfile) print("remotefile",remotefile) sftp.put(localfile, remotefile) sftp.close() except: out_log = u'ip: {0}\tuser:{1}\ttimeout'.format(ssh,remotefile) err_log = traceback.format_exc() out_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log) def get_file(self,ssh, ip, remotefile): if len(remotefile.split('/', 10 )) > 2: self.File = remotefile.split('/', 10 )[len(remotefile.split('/', 10 ))-1] print("FILE",self.File) try: sftp = ssh.open_sftp() sftp.get(remotefile,self.ip + self.File) sftp.close() except: out_log = u'local: {0}\tremot:{1}\ttimeout'.format(self.ip,remotefile) err_log = traceback.format_exc() ut_log = u'{0}\n{1}'.format(out_log, err_log) self.logger(out_log)
server.txt文件:
172.22.0.60,root,P@ssw0rd,22 (主机、用户名、密码、端口) 172.22.0.225,root,P@ssw0rd,22
执行命令:查看主机名以及主机ip为例:
python cmd.py -c server.txt "hostname , ifconfig eth0 | grep 'inet addr' | awk '{ print $2}' | awk -F: '{print $2}'"
上传下载命令:
python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh get
python cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh up