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爬虫框架Scrapy安装使用步骤
Apr 01 Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
python 生成器协程运算实例
Sep 04 Python
zookeeper python接口实例详解
Jan 18 Python
使用tensorflow实现线性svm
Sep 07 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
python DataFrame 取差集实例
Jan 30 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
法压式咖啡之制作法
2021/03/03 冲泡冲煮
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
图解JS原型和原型链实现原理
2020/09/15 Javascript
Python 3.x 新特性及10大变化
2015/06/12 Python
详解python中的文件与目录操作
2017/07/11 Python
Python编程求质数实例代码
2018/01/31 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
应届毕业生自我鉴定范文
2013/12/27 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
《海底世界》教学反思
2014/04/16 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
三方股东合作协议书
2014/10/28 职场文书
离婚协议书范文2015
2015/01/26 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers
Hive导入csv文件示例
2022/06/25 数据库