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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python写的一个squid访问日志分析的小程序
Sep 17 Python
python 文件操作api(文件操作函数)
Aug 28 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
Python装饰器结合递归原理解析
Jul 02 Python
python常见的占位符总结及用法
Jul 02 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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简单统计中文个数的方法
2016/09/30 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
FCK调用方法..
2006/12/21 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
python模块之time模块(实例讲解)
2017/09/13 Python
python实现多线程网页下载器
2018/04/15 Python
python保存网页图片到本地的方法
2018/07/24 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
升职自荐书范文
2013/11/28 职场文书
计算机求职信
2013/12/01 职场文书
会计助理岗位职责
2014/02/17 职场文书
知识竞赛活动方案
2014/02/18 职场文书
文体活动总结范文
2014/05/05 职场文书
白岩松演讲
2014/05/21 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
《确定位置》教学反思
2016/02/18 职场文书
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server