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_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

最终实现的功能如下:

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

(0)

相关推荐

  • python rsync服务器之间文件夹同步脚本

    本文实例为大家分享了python rsync服务器之间文件夹同步的具体代码,供大家参考,具体内容如下 About  rsync 配置两台服务器之间3ssh-key后,可以实现自动化无需手动输入密码,脚本如下: import argparse import datetime from functools import partial import multiprocessing as mp import os import paramiko as pmk import time def check

  • python实现两个文件夹的同步

    其实无论windows还是Linux,简单地去实现两个两个文件夹的同步只需系统自带的复制命令加参数就可以了. WINDOWS : xcopy 源文件夹\* 目标文件夹 /s /e /y Linux : cp -r 源文件夹/* 目标文件夹 这里使用python来实现这些基本功能,并增加一些去重之类的增强功能. 1.复制源文件夹中文件至目标文件夹 要想同步两个文件夹中的数据,基本思路首先需要遍历源文件夹中的信息,将源文件夹中的文件复制到目标文件夹. 遍历文件夹采用os中的listdir函数就可以了

  • python多线程同步之文件读写控制

    本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res = [] if os.path.exists('schedule_times.txt'): fp = open('schedule_times.txt', 'r') else: os.system('to

  • python实现的文件同步服务器实例

    本文实例讲述了python实现的文件同步服务器.分享给大家供大家参考.具体实现方法如下: 服务端使用asyncore, 收到文件后保存到本地. 客户端使用pyinotify监视目录的变化 ,把变动的文件发送到服务端. 重点: 1. 使用structs打包发送文件的信息,服务端收到后,根据文件信息来接收客户端传送过来的文件. 2. 客户端使用多线程,pyinotify监视到文件变化,放到队列中,由另外一个线程发送. 上代码: 服务端: # receive file from client and

  • Python FTP两个文件夹间的同步实例代码

    具体代码如下所示: # -*- coding: utf-8 -*- ''''''' ftp自动检测源文件夹的更新,将源文件夹更新的内容拷贝到目标文件夹中 使用树的层序遍历算法,支持深度目录拷贝 ''' import os from ftplib import FTP import os,sys,string,datetime,time import shutil import socket class MyUpdateMonitor(object): def __init__(self, hos

  • Python使用文件锁实现进程间同步功能【基于fcntl模块】

    本文实例讲述了Python使用文件锁实现进程间同步功能.分享给大家供大家参考,具体如下: 简介 在实际应用中,会出现这种应用场景:希望shell下执行的脚本对某些竞争资源提供保护,避免出现冲突.本文将通过fcntl模块的文件整体上锁机制来实现这种进程间同步功能. fcntl系统函数介绍 Linux系统提供了文件整体上锁(flock)和更细粒度的记录上锁(fcntl)功能,底层功能均可由fcntl函数实现. 首先来了解记录上锁.记录上锁是读写锁的一种扩展类型,它可用于有亲缘关系或无亲缘关系的进程间

  • python scp 批量同步文件的实现方法

    该脚本用于将源主机列表路径下的所有文件同步于目标主机的/tmp下面 #!/usr/bin/python # -*- coding:utf-8 -*- import pexpect import os import os.path src_path = ['/tmp/', '/opt/', '/root/'] dest_host = "192.168.143.201" dest_path = "/tmp" for path in src_path: file_list

  • Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res = [] if os.path.exists('schedule_times.txt'): fp = open('schedule_times.txt', 'r') else: os.system('touch schedule_times.txt') fp = open('schedule_ti

  • python+rsync精确同步指定格式文件

    本文实例为大家分享了python+rsync精确同步指定格式文件的具体代码,供大家参考,具体内容如下 # coding: utf-8 #!/usr/bin/env python ''' updatedb更新本地服务器指定目录/home/upload/de locate.dbz数据库 然后locate命令正则查找符合条件的文件并将文件名输出到locate.src 通过paramiko模块得到远程服务器符合条件的文件并将文件名输出到locate.dst 比较这两个文件得到locate.diff,最好

  • python同步windows和linux文件

    写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的md5,如果md5不一致,则备份服务器上的文件,将本地的给上传上去 代码分为windows端和服务器端,有些东西,都让python一个做了,写着有点累,就想着,能否服务端提供一个端口,windows去调用这个接口,来完成一部分工作 python代码如下: 需要额外安装的包为是paramiko,安装方

  • Python实现Windows和Linux之间互相传输文件(文件夹)的方法

    项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件.所以就需要实现如何把文件从Windows系统传输到Linux系统中. 在项目中使用了pscp.exe这个工具,只要按照pscp.exe的使用说明操作即可.只要进入pscp.exe的安装位置,然后输入pscp即可查看pscp的使用说明. 下面是我机器上的: 使用Python实现也挺简单的,下面的code主要介绍4中情况: 1. windows传输文件到Linux 2. windows传输

  • python中windows链接linux执行命令并获取执行状态的问题小结

    目录 前言 环境 工具 库 内容汇总 创建SSHClient 设置链接主机后的策略 链接远程主机 发送命令 获取linux的输出内容 问题总结 解决方式 演示 推送 前言 最新需要做一个小工具,让协作部门能够获取到服务器上的一些资源讯息,因为工具是pyqt写的所以牵扯到用python链接linux的问题,这里记录一下一些碰到的问题 环境 工具 pycharm qt designer 库 python3.7 pyqt5.15.4 paramiko2.12.0 上网搜了很多,发现paramiko实现

  • python在windows和linux下获得本机本地ip地址方法小结

    本文实例总结了python在windows和linux下获得本机本地ip地址方法.分享给大家供大家参考.具体分析如下: python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过socket.gethostbyname方法获得 import socket localIP = socket.gethos

  • 详谈python在windows中的文件路径问题

    在使用python通过open()函数来打开文件的时候,传递绝对路径给open()的时候,发现路径参数的内容与想象中的有所出入: 由于windows的路径分隔符使用的是反斜杠\,它刚刚好是转义字符,故可能发生冲突 # 错误示范:反斜杠似乎被解释为转义字符而不是分隔字符 path = '''F:\Python\test.txt''' path = '''F:\\Python\test.txt''' """以下三种方式都是可行的""" path =

  • Python调用Windows命令打印文件

    1.Python调用Windows命令打印文件 Windows命令行打印文件使用print 命令,具体用法可使用help print查看.下面是使用Python调用print指令执行打印文件功能的代码: import os def printer(filename): printername = r"/D:\\A340\hpLaser" cmd = "print " + printername + " " + filename print &qu

  • Python获取Windows或Linux主机名称通用函数分享

    通过python的os模块获取windows或者linux主机名的通用函数. 复制代码 代码如下: #!/usr/bin/env python  #coding=utf-8    import os    def hostname():          sys = os.name            if sys == 'nt':                  hostname = os.getenv('computername')                  return hos

  • 用rsync实现windows与linux文件同步的方法

    windows做为文件服务器,使用rsync的windows服务版本:cwRsyncServer 下载地址:http://rsync.samba.org 安装过程要设置用于系统服务的帐号和密码,可以默认. 注:此帐号用于启用crsync server服务,需要分配给帐号对要同步文件的相应权限,否则无法操作被同步的文件. 安装完成后修改配置文件 rsyncd.conf, 配置文件内容如下: 复制代码 代码如下: port = 52326 use chroot = false strict mode

  • 使用Python实现windows下的抓包与解析

    系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量比较感兴趣 python环境:python2.7 ,这里不选择python3的原因,是因为接下来要用到的scapy包在python3中安装较于python2要麻烦得多.如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程. 需要的python包:scapy和dpkt 抓包代码: from scapy.sendrecv import sniff from scapy.u

  • xshell上传下载文件(Windows、Linux)

    经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法嘛: 我是怎么操作的: 1.打开一台本地Linux虚拟机,使用mount 挂载Windows的共享文件夹到Linux上,然后拷贝数据到Linux虚拟机里面:(经常第一步都不顺利,无法挂载Windows的文件夹) 2.在本地Linux虚拟机使用rsync同步拷贝的数据到远程Linux主机上,需要双方都

随机推荐