热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3上传文件保存到本地_python3写的简单本地文件上传服务器

#!usrbinenvpython3#-*-coding:utf-8-*-importosimportos.pathimportparamikoimportdatetimeimpo

#!/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()



推荐阅读
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • Nginx作为前端服务器时,Tomcat与Apache作为后端,War包应部署在何处? ... [详细]
author-avatar
miss文女1977
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有