您的位置:首页 > 运维架构 > Linux

linux下远程服务器批量执行命令及SFTP上传文件 -- python实现

2016-02-29 15:20 1231 查看
之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能。之前脚本地址:http://www.cnblogs.com/landhu/p/4961##coding:utf-8

#------------------
#Author:Hu
#Created:2016-02-29
#------------------
import paramiko,os,time,sys
from optparse import OptionParser

#使用optparse做命令行解析
parser = OptionParser(usage="usage:%prog [optinos] dest",version='Hu 3.0_20160229')
parser.add_option('-f','--filename',dest='filename',default='ip.txt',help='The Servers info TXT')
parser.add_option('-c','--command',dest='cmd',help='You want execute command')
parser.add_option('-u','--upload',dest='upload',help='You want to upload file')
#parser.add_option('-d','--download',dest='download',help='You want to download file')
#parser.add_option('')

(options,args)=parser.parse_args()

#上传中显示进度,使用的是paramiko put中的callback选项

def callback(a=10,b=10):

sys.stdout.write('Data Transmission %10f M [%3.2f%%]\r') % (a/1024./1024,a*100./int(b)))
sys.stdout.flush()

'''
将功能封装
'''
class bat(object):
def __init__(self,ip,pt,pw,us):
self.ip=ip
self.pt=pt
self.pw=pw
self.us=us
print self.ip

def command(self,comm):
self.comm=comm
try:
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(self.ip,port=self.pt,username=self.us,password=self.pw)
for COMM in self.comm:
stdin,stdout,stderr = ssh.exec_command(COMM)
print "%s The command %s result is:\n" % (time.strftime("%Y%m%d %H:%M:%S"),COMM)
read = stdout.read()
print read
print '-'*70
ssh.close()
except Exception,e:
print e
print '-'*70

def upload(self,filename):
self.ufilename=filename
try:
#print self.ip,self.pt
client = paramiko.Transport((self.ip, self.pt))
client.connect(username = self.us, password = self.pw)

sftp = paramiko.SFTPClient.from_transport(client)

sftp.put(localpath=self.ufilename,remotepath=self.ufilename,callback=callback)
client.close()
except Exception,e:
print e

#本想写个从服务器批量下载的功能能,但实际上用不上,先不添加,后期再丰富
def download(self,filename):
self.dfilename=filename
try:
client = paramiko.Transport((self.ip, self.pt))
client.connect(username = self.us, password = self.pw)
sftp = paramiko.SFTPClient.from_transport(client)

sftp.get(self.dfilename, self.dfilename)
client.close()
except:
print 'Error'

if __name__ == '__main__':
if os.path.exists(options.filename):
filename=options.filename
else:
print 'Please check %s and ip.txt is exits' % options.server
exit(-1)

print "-"*70
#批量执行命令与上传不能同时存在
if options.cmd and options.upload:
parser.error("options -c and -u are mutually exclusive")

elif options.cmd:
open_ip = open(filename)
command=[]
command=options.cmd.split(',')
for line in open_ip.readlines():
ip,user,passwd,port=line.strip().split()
port=int(port)
dd=bat(ip=ip,pt=port,pw=passwd,us=user)
dd.command(command)

elif options.upload:
fullpwd=os.path.abspath(options.upload)
open_ip = open(filename)
for line in open_ip.readlines():
ip,user,passwd,port=line.strip().split()
port=int(port)
dd=bat(ip=ip,pt=port,pw=passwd,us=user)
print "You want upload file is : %s " % fullpwd
dd.upload(options.upload)
print 'Data Transmission :'
print '-'*70
else:
print 'Arg is error,Use "-h" to help!'
'''
elif options.download:
fullpwd=os.path.abspath(options.download)
open_ip = open(filename)
for line in open_ip.readlines():
ip,user,passwd,port=line.strip().split()
port=int(port)
dd=bat(ip=ip,pt=port,pw=passwd,us=user)
print "You want download file is : %s " % fullpwd
dd.download(options.download)
print 'Data Transmission :'
print '-'*60
'''


默认读取ip.txt中的服务器信息,信息的格式:

IP 用户 密码 端口

192.168.3.200 root  rr@#$zlb 36003
192.168.3.250 root rr@#250 22
192.168.14.31 root rr@#31 22
192.168.10.3 root 111 22
192.168.10.3 root 111 22


运行如下:

[root@localhost tools]# python remote.py -h
Usage: usage:remote.py [optinos] dest

Options:
--version             show program's version number and exit
-h, --help            show this help message and exit
-f FILENAME, --filename=FILENAME
The Servers info TXT
-c CMD, --command=CMD
You want execute command
-u UPLOAD, --upload=UPLOAD
You want to upload file


[root@localhost tools]# python remote.py -c pwd
------------------------------------------------------------
192.168.3.200
20160229 15:07:39 The command pwd result is:

/root

----------------------------------------------------------------------
192.168.3.3
[Errno 111] Connection refused
----------------------------------------------------------------------
192.168.3.250
20160229 15:07:50 The command pwd result is:

/root

----------------------------------------------------------------------
192.168.14.31
[Errno 111] Connection refused
----------------------------------------------------------------------
192.168.3.3
[Errno 111] Connection refused
----------------------------------------------------------------------
192.168.10.3
[Errno 110] Connection timed out
----------------------------------------------------------------------
192.168.10.3
[Errno 110] Connection timed out
----------------------------------------------------------------------


两个命令不能冲突:

[root@localhost tools]# python remote.py -c pwd -u ip.txt
------------------------------------------------------------
Usage: usage:remote.py [optinos] dest

remote.py: error: options -c and -u are mutually exclusive


上传时有一个特别的功能,上传时的进度显示,这里使用的是paramiko put中的callback参数

效果如下:



结果如下:

[root@localhost tools]# python remote.py -u bms.war
------------------------------------------------------------
192.168.3.200
You want upload file is : /tools/bms.war
Data Transmission :77.198704 M [100.00%]
----------------------------------------------------------------------
192.168.3.3
You want upload file is : /tools/bms.war
Unable to connect to 192.168.3.3: [Errno 111] Connection refused
Data Transmission :
----------------------------------------------------------------------
192.168.3.250
You want upload file is : /tools/bms.war
Data Transmission :77.198704 M [100.00%]
----------------------------------------------------------------------
192.168.14.31
You want upload file is : /tools/bms.war
Unable to connect to 192.168.14.31: [Errno 111] Connection refused
Data Transmission :
----------------------------------------------------------------------
192.168.3.3
You want upload file is : /tools/bms.war
Unable to connect to 192.168.3.3: [Errno 111] Connection refused
Data Transmission :
----------------------------------------------------------------------
192.168.10.3
You want upload file is : /tools/bms.war
Unable to connect to 192.168.10.3: [Errno 110] Connection timed out
Data Transmission :
----------------------------------------------------------------------
192.168.10.3
You want upload file is : /tools/bms.war
Unable to connect to 192.168.10.3: [Errno 110] Connection timed out
Data Transmission :
----------------------------------------------------------------------


参考文档:

paramiko SFTP:http://paramiko-docs.readthedocs.org/en/latest/api/sftp.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: