时间:2021-05-22
python是个很好玩的东西?好吧我随口说的,反正因为各种原因(其实到底是啥我也不知道),简单的学习了下python,然后写了一个上传文件上服务器的小玩具练手。
大概功能是这样:
1、获取本地文件列表(包括文件夹)
2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除
3、之后增加了忽略列表,忽略文件类型
4、然后增加了重启tomcat,但是这个功能未进行测试
大概就是这个样子,哦了,丢代码丢代码
#!/usr/bin/env python3# -*- coding: utf-8 -*-import os import os.path import paramikoimport datetimeimport 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 = 0for 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 = 0for 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 = 0for 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 + 1end = 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写的简单本地文件上传服务器实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python通过安装使用paramiko模块,将本地文件上传到服务器上importparamikoimportdatetimeimportoshostname=
FTP是本地和网站服务器的联通工具,可以通过FTP工具链接服务器,上传和下载网站源文件,可以通过本地修改好网站文件,上传到服务器上,这样网站就修改好了。如果客户
Git如何删除远程服务器文件同时保留本地文件在上传工程到git上时,有时候会把本地的一些eclipse配置文件传到服务器上,这时你先删除本地,再同步服务器,显然
本文实例讲述了php文件上传原理与实现方法。分享给大家供大家参考,具体如下:文件上传实际上就是在前段使用一个form表单提交本地文件到服务器,然后在服务器端将文
WEB开发,我们先从搭建一个简单的服务器开始,Python自带服务模块,且python3相比于python2有很大不同,在Python2.6版本里,/usr/b