利用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=',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文件的更多相关文章
- 如何利用Xshell在windows与linux之间互传文件
如何利用Xshell在windows与linux之间互传文件 第一步: 安装Xshell. 第二步: 打开Xshell,若出现默认的对话框,则选择关闭,因为下面将演示如何将本地文件传输至远程linux ...
- 【转帖】Linux上搭建Samba,实现windows与Linux文件数据同步
Linux上搭建Samba,实现windows与Linux文件数据同步 2018年06月09日 :: m_nanle_xiaobudiu 阅读数 15812更多 分类专栏: Linux Samba 版 ...
- pscp使用详解 Windows与Linux文件互传工具
pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...
- 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!
本文主要展示的是通过使用python和PyInstaller来构建恶意软件的一些poc. 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!众所周知的,恶意软件如果影响到了他人的生 ...
- 利用Rsync在windows和linux之间同步数据
使用Rsync从windows同步文件到linux 1.windows服务端的安装与配置: 免费软件下载地址:http://linux.linuxidc.com/,用户名密码为:www.linuxid ...
- Python 一键同步windows和linux数据(基于pscp.exe)
outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows serv ...
- 利用xshell从windows上传文件到虚拟机
Xshell实现Windows上传文件到Linux主机 经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我 ...
- pscp实现Windows 和Linux 文件互相传输
pscp 能够实现Windows 和Linux 间相互传输文件.下文将详细描述如何使用: 一.pscp 简要描述: PSCP (PuTTY Secure Copy client)是PuTTY 提供的文 ...
- Windows 与 linux文件相互传输的方法
公司里面办公机器大部分都是 windows 但是现在随着云计算.docker.linux等的越来越兴起,需要大量的操作linux服务器. 最重要和最直接的需要将windows 上面的文件上传到 lin ...
随机推荐
- Python 快速排序 算法
基本的快排算法,二分法 #!/usr/bin/env python # encoding: utf-8 l1=[1,4,2,6,3] def path_sort(l,start_index,end_i ...
- centos7在vmware上安装后不能连接网络的问题。注意虚拟机向导时选择的操作系统...........
在虚拟机上安装时发现网络不可用 在网上查找解决方案一整理天,各种命令代码偿试 无效. 在贴上发现说 Centos7镜像是64位 ,虚拟机操作系统一定要选择centos64位也是必须的. 最后选择重 ...
- Linux配置Supervisor 配置遇到的坑
在linux中web 应用部署到线上后之后发现退出终端后网站就无法访问了 所以需要用Supervisor来守护进程,它可以保证应用一直处于运行状态,在遇到程序异常.报错等情况,导致 web 应用终止时 ...
- canal 结合 kafka 入门
1.kafka的安装: 略 2.cannal 配置 使用卡夫卡: 修改 /home/admin/canal-server/conf/canal.properties 2.1 修改canal.ser ...
- ---dd io测试
下面是一个简单测试,虽然不够准确但是简单立即可行, 当前目录的IO写读测试: (写) dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync ( ...
- shell脚本运行java程序jar
在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本: #!/b ...
- web和app的简单测试区别和工具介绍
首先说一下我对Web自动化测试与CS自动化测试的认识.从宏观对比都是通过脚本自动化完成功能的验证,区别不大.Web测试更为显著的浏览器兼容性.安全,以及与Web技术相关的表单测试.链接测试等,其实都是 ...
- openwrt从18.0.1降级回到17.0.6遇到的问题
因为觉得openwrt的18的配置检查功能很费时,特别是遇到ar93xx慢的真可以,所以决定从18.0.1降回到17.0.6上 先把18.0.1的配置backup出来,然后刷17.0.6,再把back ...
- [PHP]误读支付宝接口可能引发的乌龙
------------------------------------------------------------------------------------ 之所以发现这个坑,源起项目中的 ...
- Unity与安卓IOS交互
记录下 安卓与Unity交互中 跳坑 找到的资料. <1>建立交互 http://blog.csdn.net/lizhengwei1989/article/details/54631 ...