python利用ssh做文件传输

	`在这里插入代码片`# -*- coding: utf-8 -*-
import os,time
import os.path 
import paramiko
import datetime
import re
 
# 配置属性
config = {
	#本地项目路径
	'local_path' : '',
	# 服务器项目路径
	'ssh_path' : '',
	# 项目名
	'project_name' : '',
	# 忽视列表
	'ignore_list' : [],
	# ssh地址、端口、用户名、密码
	'hostname' : '',
	'port' : 22,
	'username' : '',
	'password' : '',
	# 是否强制更新
	'mandatory_update' : False,
	# 更新完成后是否重启tomcat
	'restart_tomcat' : False,
	# tomcat bin地址
	'tomcat_path' : '',
	# 被忽略的文件类型
	'ignore_file_type_list' : []
}

# ssh控制台
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=config['hostname'], port=config['port'], username=config['username'], password=config['password'])
print("ssh连接成功")
# ssh传输
transport = paramiko.Transport((config['hostname'],config['port']))
transport.connect(username=config['username'],password=config['password'])
sftp = paramiko.SFTPClient.from_transport(transport)
print('sftp传输已建立')

#path_to_watch = "."
#before = os.listdir (path_to_watch)

# 检查文件夹是否存在,不存在则创建
def check_folder(path):
	stdin, stdout, stderr = ssh.exec_command('find ' + path)
	result = stdout.read().decode('utf-8')
      
	if len(result) == 0 :
		print('目录 %s 不存在,创建目录' % path)
		ssh.exec_command('mkdir ' + path)
		print('%s 创建成功' % path)
		return 1
	else:
		print('目录 %s 已存在' % path)
		return 0


# 检查文件是否存在,不存在直接上传,存在检查大小是否一样,不一样则上传
def check_file(local_path, ssh_path):
	# 检查文件是否存在,不存在直接上传
	path = '\'' + ssh_path + '\''
	stdin, stdout, stderr = ssh.exec_command('find ' + path)
	result = stdout.read().decode('utf-8')
	if len(result) == 0 :
		sftp.put(local_path,ssh_path)
		print('%s 上传成功' % (ssh_path))
		os.remove(local_path)
		return 1
	else:
		# 存在则比较文件大小
		# 本地文件大小
		lf_size = os.path.getsize(local_path)
		# 目标文件大小
		stdin, stdout, stderr = ssh.exec_command('du -b ' + path)
		result = stdout.read().decode('utf-8')
		tf_size = int(result.split('\t')[0])
		print('本地文件大小为:%s,远程文件大小为:%s' % (lf_size, tf_size))
		if lf_size == tf_size:
			print('%s 大小与本地文件相同,不更新' % (ssh_path))
			os.remove(local_path)
			return 0
		else:
			sftp.put(local_path,ssh_path)
			print('%s 更新成功' % (ssh_path))
			os.remove(local_path)
			return 1

def find_file(local_path,ignore_list):
	file_list = []
	folder_list = []
	for parent,dirnames,filenames in os.walk(local_path):  
		#文件夹列表
		for dirname in dirnames:
			p = os.path.join(parent,dirname)
			p = p[len(local_path):]
			p = p.replace('\\','/')
			folder_list.append(p)

		#文件列表
		for filename in filenames:
			if ignore_list.count(filename) == 0:
				p = os.path.join(parent,filename)
				p = p[len(local_path):]
				p = p.replace('\\','/')
				file_list.append(p)
	print(file_list,folder_list)
	return file_list,folder_list
      

# 上传流程开始
print('上传开始')
before = os.listdir (config["local_path"])
index = 1
# 初始化文件列表和文件夹列表
file_list_initialize,folder_list_initialize = find_file(config["local_path"],config['ignore_list'])
print('共有文件夹%s个,文件%s个' % (len(file_list_initialize),len(folder_list_initialize)))
################变量初始化
file_list = []
folder_list = []
ssh_file_list = []
root_path = config['ssh_path']
create_folder_num = 0
target_folder_path = ''
update_file_num = 0
#######################################
begin = datetime.datetime.now()
while True:
	#time.sleep (10)
	begin = datetime.datetime.now()
	# 文件列表
	file_list,folder_list = find_file(config["local_path"],config['ignore_list'])
	index += 1
	# ssh上文件列表
	
	print('文件夹变为%s个,文件变为%s个' % (len(folder_list),len(file_list)))

	# 检查根目录是否存在
	    # + config['project_name']
	stdin, stdout, stderr = ssh.exec_command('find ' + root_path)
	result = stdout.read().decode('utf-8')
	if len(result) == 0 :
		print('目录 %s 不存在,创建目录' % root_path)
		ssh.exec_command('mkdir ' + root_path)
		print('%s 创建成功' % root_path)
	else:
		print('目录 %s 已存在,获取所有文件' % root_path)
		ssh_file_list = re.split('\n',result)

	# 检查文件夹
	create_folder_num = 0
	for item in folder_list:
		target_folder_path = config['ssh_path'] + item
		create_folder_num = create_folder_num + check_folder(target_folder_path)

	# 检查文件
	update_file_num = 0
	for item in file_list:
		if config['ignore_file_type_list'].count(os.path.splitext(item)[1]) == 0 and file_list_initialize.count(item) == 0:
			local_file_path = config['local_path'] + item
			target_file_path = config['ssh_path'] + item
			if config['mandatory_update']:
				sftp.put(local_file_path,target_file_path)
				print('%s 强制更新成功' % (target_file_path))
				update_file_num = update_file_num + 1
			else:
				update_file_num = update_file_num + check_file(local_file_path, target_file_path)
		else:
			print('%s 在被忽略文件类型中,所以被忽略' % item)
 
# 检查ssh是否有需要删除的文件
#delete_file_num = 0
#for item in ssh_file_list:
#	temp = item[item.find(config['project_name']):]
#	if folder_list.count(temp) == 0 and file_list.count(temp) == 0 and temp != config['project_name'] and temp != '':
#		print('%s 在本地不存在,删除' % item)
#		ssh.exec_command('rm -rf ' + item)
#		delete_file_num = delete_file_num + 1
 
	end = datetime.datetime.now()
	print('本次上传结束:创建文件夹%s个,更新文件%s个,耗时:%s' % (create_folder_num, update_file_num, end-begin))
 
	if config['restart_tomcat']:
		print('关闭tomcat')
		ssh.exec_command('sh ' + config['tomcat_path'] + 'shutdown.sh')
		print('启动tomcat')
		ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh')
 
	# 关闭连接
sftp.close()
ssh.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值