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安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Opencv求取连通区域重心实例
Jun 04 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
python实现简单遗传算法
Sep 18 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 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
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
python引用DLL文件的方法
2015/05/11 Python
详解Python字符串对象的实现
2015/12/24 Python
Python 查看文件的读写权限方法
2018/01/23 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
对Python中plt的画图函数详解
2018/11/07 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
介绍一下如何优化MySql
2016/12/20 面试题
大专生的学习自我评价
2013/12/04 职场文书
社区活动邀请函范文
2014/01/29 职场文书
解除租房协议书
2014/12/03 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
政协工作总结2015
2015/05/20 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
企业团队精神心得体会
2016/01/19 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书