寫python腳本的初衷,每次在windows編輯完文件后,想同步到linux上去,只能夠登錄服務器,然后再利用網(wǎng)絡copy,重復性很大,就想著能不能寫一個小腳本幫我同步。
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)元寶免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了數(shù)千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。邏輯:比對本地和服務器文件的md5,如果md5不一致,則備份服務器上的文件,將本地的給上傳上去。
代碼分為windows端和服務器端,有些東西,都讓python一個做了,寫著有點累,就想著,能否服務端提供一個端口,windows去調(diào)用這個接口,來完成一部分工作。
python代碼如下:
需要額外安裝的包為是paramiko,安裝方法:pip install paramiko即可,代碼如下,利用paramiko的SSHClient來調(diào)用服務器自己編寫的API(嘿嘿,姑且叫做API)吧,Transport來實現(xiàn)sftp文件的上傳,
#!/usr/bin/env python import os import hashlib import paramiko import time import sys def getmd5(filename): filehash = hashlib.md5() f = open(filename,'rb') while True: b=f.read(8096) if not b: break filehash.update(b) f.close() return filehash.hexdigest() def send_files(sftp,ssh,filename,abspathfile,server_dir): try: print ("刪除文件",end=" ") print (filename) ssh.exec_command('bash /root/put_api.sh %s move' % filename) print ("刪除文件成功") print ("開始上傳文件") server_file=server_dir + filename sftp.put(abspathfile,server_file) print ("文件上傳成功") except: print ("文件上傳失敗") def search_file(dir,path,ssh,server_dir): #定義排除以md結(jié)尾的字符串 suffix='md' #定義循環(huán) print ("開啟sftp") t = paramiko.Transport(('myhostname',22)) t.connect(username='root',password='mypassword') sftp = paramiko.SFTPClient.from_transport(t) for filename in os.listdir(path): print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) print ("開始處理 %s" %(filename)) #如果以md結(jié)尾,就continue if filename.endswith(suffix): print ("不處理以md結(jié)尾") continue #定義絕對路徑 abspathfile=dir + '\\' + filename #獲取文件的md5 localfilemd5=getmd5(abspathfile)+'\n' byte_localfilemd5=localfilemd5.encode(encoding="gb2312") print ("%s md5值 %s" %(filename,byte_localfilemd5)) serverfilemd5=get_server_md5(ssh,filename) print ("%s 服務器md5值 %s" %(filename,serverfilemd5)) if byte_localfilemd5 == serverfilemd5 : print ("md5值一致,不需要上傳") else: print ("md5值不一致,上傳文件") # send_files(sftp,ssh,filename,abspathfile,server_dir) try: # send_files(ssh,filename,abspathfile,server_dir) send_files(sftp,ssh,filename,abspathfile,server_dir) except: print ("上傳失敗...") print ("關閉sftp") t.close() def get_server_md5(ssh,filename): stdin,stdout,stderr = ssh.exec_command('bash /root/put_api.sh %s' % filename) result = stdout.read() return result def main(): starttime=time.time() print ("腳本開始同步") print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='myhostname',port='22',username='root',password='mypassword') except: print ("服務器連接失敗,異常退出") sys.exit(-1) #定義路徑 local_dir = 'E:\\TEMP\\note_html' server_dir= '/root/nginx_02/' #利用函數(shù)排除文件 search_file(local_dir,local_dir,ssh,server_dir) # print (get_server_md5(ssh,'d0180727_install_rabbitmt_png_06.png')) ssh.close() endtime=time.time() print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) print ("服務器斷開連接,本次文件更新成功") print ("本次更新時間為:%.2f s" %(endtime - starttime)) print ("更精確的時間:",end=" ") usedtime = endtime - starttime print (usedtime,end=" ") print ("s") if __name__ == "__main__" : main()
本文名稱:python同步windows和linux文件-創(chuàng)新互聯(lián)
文章位置:http://redsoil1982.com.cn/article2/dihjic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、品牌網(wǎng)站建設、移動網(wǎng)站建設、網(wǎng)站策劃、面包屑導航、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容