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 ...
随机推荐
- 剑指offer12 打印从1到N位的所有数字,处理大整数情况
/** * */ package jianzhioffer; /** * @Description 输入n位数,输出0-N的所有数 * @author liutao * @data 2016年4月22 ...
- python下setuptools安装
python下的setuptools带有一个easy_install的工具,在安装python的每三方模块.工具时很有用,也很方便.安装setuptools前先安装pip,请参见<pytho ...
- CentOS 性能监控之nmon
工具集: Nmon 性能数据收集分析工具Nmon analyser 性能数据分析工具,excel文件nmon_x86_sles10 Nmon在x86_sles10下二进制执行文件 nmon概述 n ...
- windwos 10 谷歌浏览器出现彩色闪条
应该是上个星期五开始,发现电脑从别的地方切换到谷歌浏览器就会出现闪条,开始也没太注意,但是到周一还是这样,所以再网上查了下, 说什么的都有,什么你按脑屏幕坏了,内存条不行什么是的.后来才发现原来是谷歌 ...
- 主库报 Error 12154 received logging on to the standby PING[ARC2]
主备网络配置存在问题 一系列报错 [root@node1 bin]# ./srvctl start database -d devdbPRCR-1079 : Failed to start reso ...
- SQL Server 将查询的结果生成insert语句
1.将查询的结果插入到一张新表(yangTest 表系统会自动生成)select Area, District, RoadName, StationName, PathDirection, Stati ...
- Oracle数据库获取一行记录中某几个字段的最大值/最小值函数
在数据库的开发过程中,我们可能会遇到这样的需求,获取一行记录中某几个字段的最大值或者是最小值,oracle给我们提供了解决这种需求的函数,如下所示: greatest(col1, col2, co ...
- git简单获取远程某个分支代码命令
git clone resource.git git branch -a list all the local and remote branches git checkout [remote bra ...
- asp.net mvc 注册中的邮箱激活功能实现
基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Gu ...
- InetAddress 类简介
package javanet; import java.net.InetAddress; import java.net.UnknownHostException; public class dem ...