圆月山庄资源网 Design By www.vgjia.com
python是个很好玩的东西?好吧我随口说的,反正因为各种原因(其实到底是啥我也不知道),简单的学习了下python,然后写了一个上传文件上服务器的小玩具练手。
大概功能是这样:
1、获取本地文件列表(包括文件夹)
2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除
3、之后增加了忽略列表,忽略文件类型
4、然后增加了重启tomcat,但是这个功能未进行测试
大概就是这个样子,哦了,丢代码丢代码
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os 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' : [] } # 检查文件夹是否存在,不存在则创建 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): # 检查文件是否存在,不存在直接上传 stdin, stdout, stderr = ssh.exec_command('find ' + ssh_path) result = stdout.read().decode('utf-8') if len(result) == 0 : sftp.put(local_path,ssh_path) print('%s 上传成功' % (ssh_path)) return 1 else: # 存在则比较文件大小 # 本地文件大小 lf_size = os.path.getsize(local_path) # 目标文件大小 stdin, stdout, stderr = ssh.exec_command('du -b ' + ssh_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)) return 0 else: sftp.put(local_path,ssh_path) print('%s 更新成功' % (ssh_path)) return 1 # 上传流程开始 print('上传开始') begin = datetime.datetime.now() # 文件夹列表 folder_list = [] # 文件列表 file_list = [] # ssh上文件列表 ssh_file_list = [] for parent,dirnames,filenames in os.walk(config['local_path']+config['project_name']): #初始化文件夹列表 for dirname in dirnames: p = os.path.join(parent,dirname) folder_list.append(p[p.find(config['project_name']):]) #初始化文件列表 for filename in filenames: if config['ignore_list'].count(filename) == 0: p = os.path.join(parent,filename) file_list.append(p[p.find(config['project_name']):]) print('共有文件夹%s个,文件%s个' % (len(folder_list),len(file_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']) # ssh传输 transport = paramiko.Transport((config['hostname'],config['port'])) transport.connect(username=config['username'],password=config['password']) sftp = paramiko.SFTPClient.from_transport(transport) # 检查根目录是否存在 root_path = config['ssh_path'] + 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: 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个,耗时:%s' % (create_folder_num, update_file_num, delete_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()
最后加了个强制更新,即不管三七二十一只要不在忽略列表中直接上传覆盖,毕竟通过比较大小来更新文件有概率出问题,比如我把1改成2那么通过文件大小是无法对比出来的,如果之后有时间的话会琢磨下拉取git更新记录或者别的方案。
以上这篇python3写的简单本地文件上传服务器实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
标签:
python3,文件上传服务器
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月07日
2024年11月07日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]