我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python同步windows和linux文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python同步windows和linux文件

写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_installNtIntazhgC_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

最终实现的功能如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python同步windows和linux文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的md5,如果md5不一致,则备份服务器上
2022-06-04

Python同步文件

最近在做Python开发,研究了技术大牛写的脚本,在他的脚本上做了优化。优化脚本已在做过测试还是挺好用的,如果你觉得不错就直接拿到生产用吧。先直接放代码出来:-----------------------------------------
2023-01-31

Linux文件同步rsync是怎样的

这篇文章将为大家详细讲解有关Linux文件同步rsync是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,
2023-06-28

在Linux下怎么使用rsync对比和同步文件

本篇内容主要讲解“在Linux下怎么使用rsync对比和同步文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在Linux下怎么使用rsync对比和同步文件”吧!排除文件和目录列表有时候,当我们
2023-06-13

Linux系统怎么实现文件同步

Linux系统怎么实现文件同步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Linux系统实现文件同步的方法一、准备源文件地址:192.168.0.143目标文
2023-06-28

python同步windows系统时间

import oscom1 = 'net use \\\\192.168.0.90\\ipc$ PPss01!123/user:administrator'os.system(com1)com2='net time \\\\192.168.
2023-01-31

python windows系统时间同步

#!/usr/bin/env python# coding: utf8# Usage: 指定ntpserver域名到ntpserver_domains变量即可import socketimport structimport timeimpo
2023-01-31

软件解决Linux和Windows双启动带来的时间同步问题

这篇文章给大家分享的是有关软件解决Linux和Windows双启动带来的时间同步问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。想在保留 Windows 系统的前提下尝试其他 Linux 发行版,双启动是个常用
2023-06-16

Linux文件同步到本地怎么实现

要将Linux系统中的文件同步到本地,可以通过以下几种方式实现:使用rsync命令:rsync命令是一种高效的文件同步工具,可以在本地和远程系统之间同步文件和目录。使用rsync命令可以方便地将Linux系统中的文件同步到本地。例如,要将远
2023-10-27

Windows8系统设置同步(Windows设置同步、应用同步等)图文教程

Windows设置同步 在Windows8中要想登录到系统中默认需要一个账户,账户类型有两种,一种是本地新创建的账户,另一种就是新的Microsoft帐户了。如果用本地账户登录的话不会将设置在你使用的电脑之间同步的,而如果用Microsof
2022-06-04

如何实现rsync同步隐藏文件和排除文件

本篇内容主要讲解“如何实现rsync同步隐藏文件和排除文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现rsync同步隐藏文件和排除文件”吧!rsync同步命令的基本写法rsync 命令
2023-06-10

linux文件夹如何与远程系统同步

这篇文章主要介绍linux文件夹如何与远程系统同步,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!方法如下1、第一首先打开linux系统。再用su -命令进入root模式。2、第二然后创建一个目标目录。再同步服务器的日
2023-06-10

编程热搜

目录