写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=',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
 ];then

    #定义文件夹
    root_dir="/root/nginx_02/"
    backdir="/root/.backup/"
    abs_filename=$root_dir$

    #判断是否有这个文件
    if [ -f $abs_filename ];then

        #利用md5sum工具获取文件的md5值
        getfilemd5=`md5sum $abs_filename | awk '{print $1}'`
        echo "$getfilemd5"

        #判断第二个参数是否是move
         ];then
            #判断是否存在备份目录,没有则存在,有则挪至备份目录
            if [ -d $backdir ];then
                nowtime=`date +"%F_%H:%M:%S"`

                mv $abs_filename $backdir$1_$nowtime

                 -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文件的更多相关文章

  1. 如何利用Xshell在windows与linux之间互传文件

    如何利用Xshell在windows与linux之间互传文件 第一步: 安装Xshell. 第二步: 打开Xshell,若出现默认的对话框,则选择关闭,因为下面将演示如何将本地文件传输至远程linux ...

  2. 【转帖】Linux上搭建Samba,实现windows与Linux文件数据同步

    Linux上搭建Samba,实现windows与Linux文件数据同步 2018年06月09日 :: m_nanle_xiaobudiu 阅读数 15812更多 分类专栏: Linux Samba 版 ...

  3. pscp使用详解 Windows与Linux文件互传工具

    pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...

  4. 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!

    本文主要展示的是通过使用python和PyInstaller来构建恶意软件的一些poc. 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!众所周知的,恶意软件如果影响到了他人的生 ...

  5. 利用Rsync在windows和linux之间同步数据

    使用Rsync从windows同步文件到linux 1.windows服务端的安装与配置: 免费软件下载地址:http://linux.linuxidc.com/,用户名密码为:www.linuxid ...

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

    outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows serv ...

  7. 利用xshell从windows上传文件到虚拟机

    Xshell实现Windows上传文件到Linux主机 经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我 ...

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

    pscp 能够实现Windows 和Linux 间相互传输文件.下文将详细描述如何使用: 一.pscp 简要描述: PSCP (PuTTY Secure Copy client)是PuTTY 提供的文 ...

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

    公司里面办公机器大部分都是 windows 但是现在随着云计算.docker.linux等的越来越兴起,需要大量的操作linux服务器. 最重要和最直接的需要将windows 上面的文件上传到 lin ...

随机推荐

  1. Sql server 编写99乘法表

    Sql 组织编写语句 declare @one int,@tow int,@str varchar(100),@num intselect @one=1while(@one<=9)beginse ...

  2. Ubutu16.04+Cuda9.2/9.0+Cudnn7.12/7.05+TensorFlow-gpu-1.8/1.6

    目录 Ubuntu16.04 Installl 1. 安装环节 2. 安装卡死 3. NVIDIA显卡安装 2. CUDA Install 3.Cudnn7.05 Install 4.Tensorfl ...

  3. Redis 主从集群搭建及哨兵模式配置

    最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 Redis集群不用安装多个Redis,只 ...

  4. ssh服务器配置

    使用如下终端命令可以在 Linux 主机中安装 ssh服务器sudo apt-get install openssh-server lin@lin-machine:~$ sudo apt-get in ...

  5. Junit介绍以及使用

    在介绍junit之前,把一些知识点提前了解一下 单元测试是一个对单一实体(类或方法)的测试. 测试用例(Test Case)是为某个特殊目标而编制的一组测试输入.执行条件以及预期结果,以便测试某个程序 ...

  6. Object.assign()怎么用?

    用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). 1.以对象为参数的合并1)Object.assign方法的第一个参数是目标对象,后面的参数都是源对象 con ...

  7. Metasploit用法大全

    Metasploit用户接口msfconsoleArmitage:  KaliGUI启动:armitage命令启动 Metasploit功能程序msfvenom集成了载荷生成器.载荷编码器.空指令生成 ...

  8. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  9. 牛客练习赛42(A,B)

    A:链接:https://ac.nowcoder.com/acm/contest/393/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 6 ...

  10. spring 自定义标签的实现

    在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的 ...