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提取html文件中的特定数据的实现代码
Mar 24 Python
跟老齐学Python之一个免费的实验室
Sep 14 Python
在Python中使用dict和set方法的教程
Apr 27 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python+OpenCV让电脑帮你玩微信跳一跳
Jan 04 Python
python:接口间数据传递与调用方法
Dec 17 Python
Python中的枚举类型示例介绍
Jan 09 Python
python pandas模块基础学习详解
Jul 03 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
详解anaconda安装步骤
Nov 23 Python
在python中实现导入一个需要传参的模块
May 12 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php at(@)符号的用法简介
2009/07/11 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
简单的php文件上传(实例)
2013/10/27 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JS 去除Array中的null值示例代码
2013/11/20 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
python中正则表达式的使用详解
2014/10/17 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
python3访问字典里的值实例方法
2020/11/18 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
九年级历史教学反思
2014/01/27 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
主办会计岗位职责
2014/03/13 职场文书
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android