python3寫(xiě)的簡(jiǎn)單本地文件上傳服務(wù)器實(shí)例
python是個(gè)很好玩的東西?好吧我隨口說(shuō)的,反正因?yàn)楦鞣N原因(其實(shí)到底是啥我也不知道),簡(jiǎn)單的學(xué)習(xí)了下python,然后寫(xiě)了一個(gè)上傳文件上服務(wù)器的小玩具練手。
大概功能是這樣:
1、獲取本地文件列表(包括文件夾)
2、檢查服務(wù)器上是否存在,不存在直接上傳,存在的話,文件夾無(wú)視,文件比較大小,大小不一致則覆蓋,最后檢查服務(wù)器上是否存在本地沒(méi)有的文件,存在則刪除
3、之后增加了忽略列表,忽略文件類型
4、然后增加了重啟tomcat,但是這個(gè)功能未進(jìn)行測(cè)試
大概就是這個(gè)樣子,哦了,丟代碼丟代碼
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import os.path import paramiko import datetime import re # 配置屬性 config = { #本地項(xiàng)目路徑 'local_path' : '', # 服務(wù)器項(xiàng)目路徑 'ssh_path' : '', # 項(xiàng)目名 'project_name' : '', # 忽視列表 'ignore_list' : [], # ssh地址、端口、用戶名、密碼 'hostname' : '', 'port' : 22, 'username' : '', 'password' : '', # 是否強(qiáng)制更新 '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 # 上傳流程開(kāi)始 print('上傳開(kāi)始') 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個(gè),文件%s個(gè)' % (len(folder_list),len(file_list))) # ssh控制臺(tái) 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 強(qiáng)制更新成功' % (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是否有需要?jiǎng)h除的文件 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個(gè),更新文件%s個(gè),刪除文件%s個(gè),耗時(shí):%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('啟動(dòng)tomcat') ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh') # 關(guān)閉連接 sftp.close() ssh.close()
最后加了個(gè)強(qiáng)制更新,即不管三七二十一只要不在忽略列表中直接上傳覆蓋,畢竟通過(guò)比較大小來(lái)更新文件有概率出問(wèn)題,比如我把1改成2那么通過(guò)文件大小是無(wú)法對(duì)比出來(lái)的,如果之后有時(shí)間的話會(huì)琢磨下拉取git更新記錄或者別的方案。
以上這篇python3寫(xiě)的簡(jiǎn)單本地文件上傳服務(wù)器實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 中對(duì) XML 文件的編碼轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了Python 中對(duì) XML 文件的編碼轉(zhuǎn)換問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內(nèi)容)
Excel文件中可能包含合并單元格的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas讀取excel合并單元格的正確方式,主要介紹的openpyxl合并單元格拆分并填充內(nèi)容,需要的朋友可以參考下2023-06-06簡(jiǎn)單談?wù)刾ython基本數(shù)據(jù)類型
在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種:#整型 int,#浮點(diǎn)型 float,#布爾型 bool,#復(fù)數(shù)型 (在python中用小寫(xiě) j ,表示虛部,用其他的字母不行)complex2018-09-09在Python中使用PIL模塊對(duì)圖片進(jìn)行高斯模糊處理的教程
這篇文章主要介紹了在Python中使用PIL模塊對(duì)圖片進(jìn)行高斯模糊處理的教程,這個(gè)無(wú)圖形界面的腳本代碼非常簡(jiǎn)單,需要的朋友可以參考下2015-05-05對(duì)python中矩陣相加函數(shù)sum()的使用詳解
今天小編就為大家分享一篇對(duì)python中矩陣相加函數(shù)sum()的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python使用PyPDF2庫(kù)實(shí)現(xiàn)向PDF文件中插入內(nèi)容
Python的PyPDF2庫(kù)是一個(gè)強(qiáng)大的工具,它允許我們方便地操作PDF文件,包括合并、拆分、旋轉(zhuǎn)頁(yè)面等操作,下面我們就來(lái)看看如何使用PyPDF2庫(kù)實(shí)現(xiàn)向PDF文件中插入內(nèi)容吧2024-04-04