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中__str__和__repr__方法的区别
Apr 17 Python
使用python实现生成用户信息
Mar 20 Python
python编写Logistic逻辑回归
Dec 30 Python
详解Python装饰器
Mar 25 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
Python字符串中删除特定字符的方法
Jan 15 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
Django框架之路由用法
Jun 10 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与已存在的Java应用程序集成
2006/10/09 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
PHP实现变色验证码实例
2014/01/06 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
python分割和拼接字符串
2013/11/01 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
详解python UDP 编程
2020/08/24 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
护士进修自我鉴定
2014/02/07 职场文书
汇源肾宝广告词
2014/03/20 职场文书
大学生在校表现评语
2014/12/31 职场文书
二手车转让协议书
2015/01/29 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android