python同步windows和linux文件
作者:王李 发布时间:2023-12-11 11:44:35
标签: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


猜你喜欢
- 本文给大家介绍Python文件处理相关知识,具体内容如下所示:1.文件的常见操作文件是日常编程中常用的操作,通常用于存储数据或应用系统的参数
- title: Python 装饰器装饰类中的方法comments: truedate: 2017-04-17 20:44:31tags: [
- 目录1.变量的引用的底层原理2.变量的分类Python的变量,简单来说有数值型,布尔型,字符串类型,列表,元组,字典等6大类。那么不同变量类
- 经典程序设计问题:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数。例如,P=5,M=2P-1=31,5和
- 在pycharm中,可以通过venv来建立工程,运行等等。但是一旦把这个工程文件夹拿到其他地方运行,而且不是在venv环境中运行,就有可能遇
- 背景:用python画AR模型的时序图。结果:代码:import numpy as npimport matplotlib.pyplot a
- 去年中秋开始,小编一直在忙旅游公司的30多个网站,在网站项目中,网站客服需要在网站中添加某个客服交谈工具代码,还需要对PC和手机添加不一样的
- 引言在 Golang 中,将 URL 打包用于从服务器获取数据非常重要。只需了解您是否正在处理任何应用程序并且您想从任何外部位置或服务器获取
- 实现思路需求需要将本数据库的数据进行处理(添加前缀),然后导入主数据库。但是当前数据库记录的create_time、update_time
- 今天终于抽出时间瞟了一眼JavaScript的新标准ECMA262v5,让我欣喜的是,不像是因为过于激进而被废除的v4,这个新标准对Java
- 1、jieba库基本介绍(1)、jieba库概述jieba是优秀的中文分词第三方库- 中文文本需要通过分词获得单个的词语- jieba是优秀
- 一:关于MySQL5 MySQL5系列数据库是MySQL的最新版本的数据库,比较流行的发行版是mysql-5.0.18。MySQL 英文官方
- 1、准备工作1.1 库介绍只有登录微信才能获取到微信好友的信息,本文采用wxpy该第三方库进行微信的登录以及信息的获取。wxpy 在 itc
- 前言本文主要给大家介绍了关于Golang实现字符串倒序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:字符串倒置如
- 导读前面几章我们以经介绍了怎么批量对excel和ppt操作今天我们说说对word文档的批量操作应用python-docx允许您创建新文档以及
- 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集函数的作用,使用函数可以加强代码的复用性,提高程序编写的效
- 1.原生js操作domconst dom = getElementById(‘box')2.vue官方方法:refvue中的ref是
- 本文实例为大家分享了Python实现简单猜数字游戏的具体代码,供大家参考,具体内容如下一、需求分析编写一个猜数字游戏,游戏规则:计算机给出一
- 前言Tkinter(即 tk interface) 是 Python 标准 GUI 库,简称 “Tk&rdquo
- 下面这段代码是兼容IE的图片切换代码,请问各位老鸟如何兼容FF,或者有相类似无按钮无数字兼容FF的图片切换代码?<!DOCTYPE h