利用python同步windows和linux文件
生活随笔
收集整理的這篇文章主要介紹了
利用python同步windows和linux文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫python腳本的初衷,每次在windows編輯完文件后,想同步到linux上去,只能夠登錄服務器,然后再利用網絡copy,重復性很大,就想著能不能寫一個小腳本幫我同步
邏輯:比對本地和服務器文件的md5,如果md5不一致,則備份服務器上的文件,將本地的給上傳上去
代碼分為windows端和服務器端,有些東西,都讓python一個做了,寫著有點累,就想著,能否服務端提供一個端口,windows去調用這個接口,來完成一部分工作
python代碼如下:
需要額外安裝的包為是paramiko,安裝方法:pip install paramiko即可,代碼如下,利用paramiko的SSHClient來調用服務器自己編寫的API(嘿嘿,姑且叫做API)吧,Transport來實現sftp文件的上傳,
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #!/usr/bin/env pythonimport os import hashlib import paramiko import time import sysdef getmd5(filename):filehash = hashlib.md5()f = open(filename,'rb')while True:b=f.read(8096)if not b:breakfilehash.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 + filenamesftp.put(abspathfile,server_file)print ("文件上傳成功")except:print ("文件上傳失敗")def search_file(dir,path,ssh,server_dir):#定義排除以md結尾的字符串suffix='md'#定義循環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結尾,就continueif filename.endswith(suffix):print ("不處理以md結尾")continue#定義絕對路徑abspathfile=dir + '\\' + filename#獲取文件的md5localfilemd5=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 resultdef 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/'#利用函數排除文件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 - starttimeprint (usedtime,end=" ")print ("s")if __name__ == "__main__" :main()Linux 自己編寫的API:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #!/bin/bash #判斷參數的個數是否大于等于1 if [ $# -ge 1 ];then#定義文件夾root_dir="/root/nginx_02/"backdir="/root/.backup/"abs_filename=$root_dir$1#判斷是否有這個文件if [ -f $abs_filename ];then#利用md5sum工具獲取文件的md5值getfilemd5=`md5sum $abs_filename | awk '{print $1}'`echo "$getfilemd5"#判斷第二個參數是否是moveif [ 'move' == $2 ];then#判斷是否存在備份目錄,沒有則存在,有則挪至備份目錄if [ -d $backdir ];thennowtime=`date +"%F_%H:%M:%S"`mv $abs_filename $backdir$1_$nowtimeif [ 0 -eq $? ];thenecho "move successful"elseecho "move failed"fielsemkdir -p $backdirfifi else#報錯,沒有這個文件echo "$1 No such file or directory"fielse#報錯,參數錯誤echo "Parameter error" fi最終實現的功能如下:
總結
以上是生活随笔為你收集整理的利用python同步windows和linux文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyCharm中目录directory与
- 下一篇: Django 函数和方法的区别