python实现批量远程执行命令及批量上传下载文件
#!/usr/bin/env python
# -*- coding: utf- -*-
# @Time : // :
# @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('\\')[:-])
# print(Base_DIR)
# else:
# Base_DIR = '/'.join(os.path.abspath(os.path.dirname(__file__)).split('/')[:-])
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)
bin/cmd.py
#!/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)
core/Handler.py
server.txt文件:
172.22.0.60,root,P@ssw0rd,22 (主机、用户名、密码、端口)
172.22.0.225,root,P@ssw0rd,
执行命令:查看主机名以及主机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
python实现批量远程执行命令及批量上传下载文件的更多相关文章
- 远程登录Linux系统及上传下载文件
目录 1. 远程登录Linux系统 1.1 为什么要远程登录 1.2 Xshell6安装 1.3 连接登录 1.3.1 连接前提 1.3.2 Xshell连接配置 2. 远程上传下载文件 2.1 Xf ...
- paramiko远程连接linux服务器进行上传下载文件
花了不少时间来研究paramiko中sftpclient的文件传输,一顿操作猛如虎,最后就一直卡在了路径报错问题,疯狂查阅资料借鉴大佬们的心得,还是搞不好,睡了个午觉醒来,仔细一看原来是指定路径的文件 ...
- expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、批量远程执行命令
7月20日任务 20.31 expect脚本同步文件20.32 expect脚本指定host和要同步的文件20.33 构建文件分发系统20.34 批量远程执行命令扩展:shell多线程 http:// ...
- 【liunx命令】上传下载文件的方法
scp 帮助命令: man scp scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择. 从远程主机 下载东西到 本地电脑 ...
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令
自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- linux使用命令上传下载文件 -- lrzsz
之前都是用Xftp工具在本地和linux系统之间上传下载文件,最近觉得麻烦,因为平时用Xshell连接,要传输文件的时候还要额外使用别的工具,下面是lrzsz的安装和简单的使用过程: 详细的使用可以s ...
随机推荐
- oracle中导出sql的几个常见词语的意思
set feedback off不显示反馈信息 “1行已插入”,大量数据装入时,显示这个也是很浪费资源和时间的. set define off 如果你某个字段里面有&字符,插入数据会出错,设 ...
- ajax异步上传文件FormDate方式,html支持才可使用
今天需要做一个头像的预览功能,所以我想到了异步上传文件. 总结几点: 异步上传难点: 文件二进制流如何获取 是否需要设置表单的头,就是content-Type那里.异步,所以无所谓了吧. 其他就差不多 ...
- linux网络编程 ntohs, ntohl, htons,htonl inet_aton等详解
ntohs =net to host short int 16位 htons=host to net short int 16位 ntohs =net to host long int 32位 hto ...
- 在Asterisk CLI里面采用originate发起一个呼叫
Asterisk cli下面可以执行很多命令,originate的用途是发起一个呼叫然后连接到指定的应用或上下文. 跟.call呼叫文件和AMI管理接口里的外呼功能一样,有两种语法格式: 呼叫成功转应 ...
- jQuery bootstrap框架下重置下拉框选择
前端页面中下拉选择框采用bootstrap-select美化,如下图:
- python之django入门
一.搭建开发环境 使用virualenv创建虚拟python环境 pip install virtualenv [root@master djiango]# find / -name virtuale ...
- 1066 Bash 游戏
传送门 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1 ...
- BZOJ2006:[NOI2010]超级钢琴
浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- poj2392磊石头——排序后背包
题目: 首先按限制高度从小到大排序,不会影响可行解,而不排序可能卡掉正确的情况: 用%2滚动数组时一定注意每次复制上一种情况,因为这个WA了好几次. 代码如下: #include<iostrea ...
- python UnicodeEncodeError: 'ascii' codec can't encode characters 解决办法
程序直接运行没有问题,一旦用nohup python test.py 执行遇中文就报python UnicodeEncodeError错误: 最终测试出的解决方法为,在开头添加红色的三句: #!/us ...