

#!/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 getpython cmd.py -f server.txt auto.mysql.sh /service/script/aouto.mysql.sh up
来源:https://www.cnblogs.com/Steward-Xu/p/8603333.html
