利用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
    

最终实现的功能如下:

原文地址:https://www.cnblogs.com/wang-li/p/9434210.html

时间: 2024-10-13 12:53:36

利用python同步windows和linux文件的相关文章

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系统时间

import os com1 = 'net use \\\\192.168.0.90\\ipc$ PPss01!123/user:administrator' os.system(com1) com2='net time \\\\192.168.0.90 /set /yes ' os.system(com2) com3='pause' os.system(com3) python同步windows系统时间

windows和linux文件互相复制粘贴软件

windows和linux文件互相复制粘贴软件用WinSCP! WinSCP是一个支持SSH的SCP文件传输软件.操作简单,只需要连接相应的服务器就可以进行下载和传输文件.重要的是WinSCP中文版软件还有着很多特色的功能,有着内置的文本编辑器,可以支持文件的复制.移动.更名文件等操作,为你带来高效便捷的使用体验. 直接运行软件---登录linux ssh账户密码----之后即可两边互相ctrl C 和ctrl V了! 原文地址:https://blog.51cto.com/8189171/24

Python 一键同步windows和linux数据(基于pscp.exe)

outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows server 上装有 pscp.exe . 下载地址: 可去PuTTY官方的下载页中,找到PSCP,下载. 也可以直接下载 PuTTY 内置的就有 PSCP 了. 安装之后进到 pscp.exe 所在目录下,查看使用帮助: # 基本用法: -p 拷贝文件的时候保留源文件建立的时间. -q 执行文件拷贝时,不

pscp实现Windows 和Linux 文件互相传输

pscp 能够实现Windows 和Linux 间相互传输文件.下文将详细描述如何使用: 一.pscp 简要描述: PSCP (PuTTY Secure Copy client)是PuTTY 提供的文件传输工具 ,通过 SSH 连接,在两台机器之间安全的传输文件,可以用于任何 SSH(包括 SSH v1.SSH v2) 服务器. 二.下载及使用 1.下载: 可以从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载ps

Windows 与 linux文件相互传输的方法

公司里面办公机器大部分都是 windows 但是现在随着云计算.docker.linux等的越来越兴起,需要大量的操作linux服务器. 最重要和最直接的需要将windows 上面的文件上传到 linux服务器上面去. 这里面想了下 主要的办法: 1. sftp 使用工具直接进行传输. 2. linux下面mount windows 的共享目录. 3. linux 使用 samba的方式创建共享目录让 windows机器进行方位. 4. 创建vsftpd 的服务进行提供ftp的协议服务. 如下逐

利用Python将多个PDF文件合并

from PyPDF2 import PdfFileMerger import os files = os.listdir()#列出目录中的所有文件 merger = PdfFileMerger() for file in files: #从所有文件中选出pdf文件合并 if file[-4:] == ".pdf": merger.append(open(pdf, 'rb')) with open('newfile.pdf', 'wb') as fout: #输出文件为newfile.

利用Xshell从windows上传文件到linux

1.首先,打开你的xshell客户端. 2.我用的是ubuntu 所以用 apt-get install lrzsz 命令来安装这个上传软件. 安装成功以后,可以使用rz上传,sz下载. 然后等待上传下载完成即可. 有相关问题欢迎交流.

learn python the hard way—Python在Windows与Linux下的安装

1.Windows下安装https://www.python.org/downloads/下载相应版本,进行安装注意:将python的安装路径添加到系统环境变量的PATH路径下,这样才能在命令行窗口下输入python进入python环境 2.Linux下安装a.下载源码包 https://www.python.org/downloads/release/python-2710/b.解压 .tgz形式     tar -zxvf 压缩包 .tar.bz形式 tar -zjvf 压缩包c.进入解压后