python同步windows和linux文件


Posted in Python onAugust 29, 2019

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步。

逻辑:比对本地和服务器文件的md5,如果md5不一致,则备份服务器上的文件,将本地的给上传上去。

代码分为windows端和服务器端,有些东西,都让python一个做了,写着有点累,就想着,能否服务端提供一个端口,windows去调用这个接口,来完成一部分工作。

python代码如下:

需要额外安装的包为是paramiko,安装方法:pip install paramiko即可,代码如下,利用paramiko的SSHClient来调用服务器自己编写的API(嘿嘿,姑且叫做API)吧,Transport来实现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结尾的字符串
 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结尾,就continue
  if filename.endswith(suffix):
   print ("不处理以md结尾")
   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/'

 #利用函数排除文件
 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()

Linux 自己编写的API:

#!/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"

  #判断第二个参数是否是move
  if [ 'move' == $2 ];then
   #判断是否存在备份目录,没有则存在,有则挪至备份目录
   if [ -d $backdir ];then
    nowtime=`date +"%F_%H:%M:%S"`
    
    mv $abs_filename $backdir$1_$nowtime
    
    if [ 0 -eq $? ];then
     echo "move successful"
    else
     echo "move failed"
    fi
    
   else
    mkdir -p $backdir
   fi
  fi  

 else
  #报错,没有这个文件
  echo "$1 No such file or directory"
 fi

else
 #报错,参数错误
 echo "Parameter error"
fi

最终实现的功能如下:

python同步windows和linux文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python定时执行之Timer用法示例
May 27 Python
python实现稀疏矩阵示例代码
Jun 09 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
详解python中的 is 操作符
Dec 26 Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
Python高并发解决方案实现过程详解
Jul 31 Python
基于Python正确读取资源文件
Sep 14 Python
python中几种自动微分库解析
Aug 29 #Python
详解python中index()、find()方法
Aug 29 #Python
python同步两个文件夹下的内容
Aug 29 #Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 #Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 #Python
python rsync服务器之间文件夹同步脚本
Aug 29 #Python
python-tornado的接口用swagger进行包装的实例
Aug 29 #Python
You might like
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
jQuery之排序组件的深入解析
2013/06/19 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
Python的Django框架中的表单处理示例
2015/07/17 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
TensorFlow的权值更新方法
2018/06/14 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
详解Python IO口多路复用
2020/06/17 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
一些.net面试题
2014/10/06 面试题
大学生创业计划书的用途
2014/01/08 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
2014年党小组工作总结
2014/12/20 职场文书
迟到检讨书
2015/01/26 职场文书
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA