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获取脚本所在目录的正确方法
Apr 15 Python
使用Python生成随机密码的示例分享
Feb 18 Python
Python内置函数delattr的具体用法
Nov 23 Python
Python yield与实现方法代码分析
Feb 06 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python生成一个迭代器的实操方法
Jun 18 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
python多线程与多进程及其区别详解
Aug 08 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
python关于变量名的基础知识点
Mar 03 Python
Python常见反爬虫机制解决方案
Jun 01 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/03/01 无线电
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
Python中的__slots__示例详解
2017/07/06 Python
python定向爬取淘宝商品价格
2018/02/27 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
python画图常规设置方式
2020/03/05 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
高中政治教学反思
2014/01/18 职场文书
测控技术自荐信
2014/06/05 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
建党伟业电影观后感
2015/06/01 职场文书
现实表现证明材料
2015/06/19 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android