python3寫的簡單本地文件上傳服務(wù)器實例
python是個很好玩的東西?好吧我隨口說的,反正因為各種原因(其實到底是啥我也不知道),簡單的學(xué)習(xí)了下python,然后寫了一個上傳文件上服務(wù)器的小玩具練手。
大概功能是這樣:
1、獲取本地文件列表(包括文件夾)
2、檢查服務(wù)器上是否存在,不存在直接上傳,存在的話,文件夾無視,文件比較大小,大小不一致則覆蓋,最后檢查服務(wù)器上是否存在本地沒有的文件,存在則刪除
3、之后增加了忽略列表,忽略文件類型
4、然后增加了重啟tomcat,但是這個功能未進(jìn)行測試
大概就是這個樣子,哦了,丟代碼丟代碼
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import os.path
import paramiko
import datetime
import re
# 配置屬性
config = {
#本地項目路徑
'local_path' : '',
# 服務(wù)器項目路徑
'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' : []
}
# 檢查文件夾是否存在,不存在則創(chuàng)建
def check_folder(path):
stdin, stdout, stderr = ssh.exec_command('find ' + path)
result = stdout.read().decode('utf-8')
if len(result) == 0 :
print('目錄 %s 不存在,創(chuàng)建目錄' % path)
ssh.exec_command('mkdir ' + path)
print('%s 創(chuàng)建成功' % 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)
# 目標(biāo)文件大小
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,遠(yuǎn)程文件大小為:%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 不存在,創(chuàng)建目錄' % root_path)
ssh.exec_command('mkdir ' + root_path)
print('%s 創(chuàng)建成功' % 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('本次上傳結(jié)束:創(chuàng)建文件夾%s個,更新文件%s個,刪除文件%s個,耗時:%s' % (create_folder_num, update_file_num, delete_file_num, end-begin))
if config['restart_tomcat']:
print('關(guān)閉tomcat')
ssh.exec_command('sh ' + config['tomcat_path'] + 'shutdown.sh')
print('啟動tomcat')
ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh')
# 關(guān)閉連接
sftp.close()
ssh.close()
最后加了個強制更新,即不管三七二十一只要不在忽略列表中直接上傳覆蓋,畢竟通過比較大小來更新文件有概率出問題,比如我把1改成2那么通過文件大小是無法對比出來的,如果之后有時間的話會琢磨下拉取git更新記錄或者別的方案。
以上這篇python3寫的簡單本地文件上傳服務(wù)器實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 中對 XML 文件的編碼轉(zhuǎn)換問題
這篇文章主要介紹了Python 中對 XML 文件的編碼轉(zhuǎn)換問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內(nèi)容)
Excel文件中可能包含合并單元格的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas讀取excel合并單元格的正確方式,主要介紹的openpyxl合并單元格拆分并填充內(nèi)容,需要的朋友可以參考下2023-06-06
在Python中使用PIL模塊對圖片進(jìn)行高斯模糊處理的教程
這篇文章主要介紹了在Python中使用PIL模塊對圖片進(jìn)行高斯模糊處理的教程,這個無圖形界面的腳本代碼非常簡單,需要的朋友可以參考下2015-05-05
Python使用PyPDF2庫實現(xiàn)向PDF文件中插入內(nèi)容
Python的PyPDF2庫是一個強大的工具,它允許我們方便地操作PDF文件,包括合并、拆分、旋轉(zhuǎn)頁面等操作,下面我們就來看看如何使用PyPDF2庫實現(xiàn)向PDF文件中插入內(nèi)容吧2024-04-04

