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实现360的字符显示界面
Feb 21 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
Python探索之ModelForm代码详解
Oct 26 Python
django之session与分页(实例讲解)
Nov 13 Python
python使用suds调用webservice接口的方法
Jan 03 Python
详解python中的hashlib模块的使用
Apr 22 Python
python实现点击按钮修改数据的方法
Jul 17 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python生成xml时规定dtd实例方法
Sep 21 Python
python利用opencv实现颜色检测
Feb 23 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
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
可以将word转成html的js代码
2010/04/11 Javascript
javascript 节点排序 2
2011/01/31 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
JavaScript实现简单随机点名器
2019/11/21 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python 自动批量打开网页的示例
2019/02/21 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
init进程的作用
2012/04/12 面试题
法学毕业生自荐信
2013/11/13 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
党建工作先进材料
2014/05/02 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
自我检讨书范文
2015/01/28 职场文书
荆州古城导游词
2015/02/06 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python