fabric同步文件

Python简化远程部署和系统管理的工具库之fabric使用详解 Python Fabric库是一个用于简化远程部署和系统管理的工具库。它提供了一组简洁而强大的函数和工具,可以帮助开发者轻松地在多台远程主机上执行命令、上传文件、下载文件等操作,从而实现自动化部署和管理。 阅读详情

原始

之前编写了一个工具,用于从windows里面根据svn修改状态,筛选一系列的文件;计算本地文件和远程linux文件的md5差异,上传有差异的文件到远程。

#!/usr/bin/python
# encoding: utf-8
# pip install svn
# pip install fabric
#
import logging
import os
import svn.local
from fabric import Connection
import hashlib

logging.basicConfig(level=logging.INFO,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S')

# 指定远程的服务器目录地址
path_remoate = "/home/cq/work/server/"

# 计算本地文件md5码
def GetFileMd5(filename):
    if not os.path.isfile(filename):
        return
    myhash = hashlib.md5()
    f = open(filename,'rb')
    while True:
        b = f.read(8096)
        if not b :
            break
        myhash.update(b)
    f.close()
    return myhash.hexdigest()


def main():
    # 链接远程服务器的配置
    c = Connection(host="xxx.xxx.xxx.xxx",
        user="username",
        connect_kwargs={"key_filename": "E:/software/keyfile/id_rsa_abel",})
    c.open()
    logging.info(c.is_connected)
    # 测试执行执行指令
    c.run("pwd")
    # 获取本地svn文件状态
    l = svn.local.LocalClient('./')
    entries = l.status()
    for filename in entries:
        # 选择“修改”、“添加”状态的文件
        if filename.type_raw_name=='modified' or 'added' == filename.type_raw_name:
            name = filename.name
            name = name.replace("\\","/")
            logging.info("put name: {0}".format(name))
            # 通过Linux指令计算出远程的文件md5,并且赋值给retstr
            cmd = "md5sum {0}{1}".format(path_remoate,name) + "|awk '{print $1}'"
            retstr = c.run(cmd)
            # 计算本地m5,并且匹配
            selfmd5 = GetFileMd5(name)
            print(selfmd5)
            # 命令行返回的md5将会带一个\n,需要去除
            if retstr.stdout[:-1] == selfmd5:
                print("match")
            else:
                print("not match")
                # 不匹配的情况下,将会开始使用fabric的put命令上传文件
                c.put(name,"{0}{1}".format(path_remoate,name))
    c.close()

if __name__ == '__main__':
    main()

改造

修改的版本主要是将其中的配置信息抽出来,写成一个json配置文件,接受输入参数。
配置文件内容

{
    "r_ip" : "xxxxxxxxxxxxx",
    "r_usr" : "root",
    "r_path": "/root/upload",
    "keyfile" : "C:/Users/abel/Documents/keyfile/id_rsa",
    "l_path" : "C:/main/code/"
}

上传脚本

#!/usr/bin/python
# encoding: utf-8
# 
# 先安装这些插件
# pip install fabric==2.5.0
# pip install pypiwin32
#
import logging
import os
from fabric import Connection
import hashlib
import json
import sys
import glob

logging.basicConfig(level=logging.INFO,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S')

class r_sync(object):
    def __init__(self,_cfg_file):
        super().__init__()
        self.cfg_file_ = _cfg_file
        self.load_cfg()

    def work(self):
        self.open_conn()
        self.check_sync()
        self.close_conn()
        pass
    
    def load_cfg(self):
        self.j_obj_ = None
        with open(self.cfg_file_, 'r') as jsonFile:
            self.j_obj_ = json.load(jsonFile)
        self.r_ip_ = self.j_obj_["r_ip"]
        self.r_usr_ = self.j_obj_["r_usr"]
        self.r_path_ = self.j_obj_["r_path"]
        self.keyfile_ = self.j_obj_["keyfile"]
        self.l_path_ = self.j_obj_["l_path"]
    
    def open_conn(self):
        # 链接远程服务器的配置
        self.conn_ = Connection(host=self.r_ip_,
            user=self.r_usr_,
            connect_kwargs={"key_filename": self.keyfile_,})
        self.conn_.open()
        logging.info(self.conn_.is_connected)
    def check_sync(self):
        old_cwd = os.getcwd()
        os.chdir(self.l_path_)
        self.recursion_path("./")
        os.chdir(old_cwd)
    def recursion_path(self,_path):
        logging.info("dir: {0}".format(_path))
        for root,dirs,files in os.walk(_path):
            for dn in dirs:
                sub_d = self.win2linux(str(_path) +"/"+ str(dn))
                if os.path.exists(sub_d) and os.listdir(sub_d):
                    self.recursion_path(sub_d)
            for fn in files:
                fn = self.win2linux(str(_path) +"/"+ str(fn))
                if os.path.exists(fn):
                    self.check_single_file(fn)
    def check_single_file(self,_filename):
        lmd5 = self.get_l_md5(_filename)
        rmd5 = self.get_r_md5(_filename)
        logging.info("local file: {0}, \nlmd5: {1}".format(_filename,lmd5))
        logging.info("rmd5: {0}".format(rmd5))
        if lmd5 != rmd5:
            self.put_file(_filename)
    def close_conn(self):
        self.conn_.close()
    def win2linux(self, _path):
        _path = _path.replace("\\","/")
        _path = _path.replace("/./","/")
        _path = _path.replace("//","/")
        return _path
    def get_r_md5(self,_name):
        r_p = self.win2linux("{0}/{1}".format(self.r_path_,_name))
        cmd="mkdir -p {0}".format(os.path.dirname(r_p))
        self.conn_.run(cmd)
        cmd = "md5sum {0}".format(r_p) + "| awk '{print $1}'"
        retstr = self.conn_.run(cmd)
        return retstr.stdout[:-1]
    def get_l_md5(self, _name):
        if not os.path.isfile(_name):
            return None
        myhash = hashlib.md5()
        f = open(_name,'rb')
        while True:
            b = f.read(8096)
            if not b :
                break
            myhash.update(b)
        f.close()
        return myhash.hexdigest()
    def put_file(self, _name):
        self.conn_.put(_name,self.win2linux("{0}/{1}".format(self.r_path_,_name)))

def main():
    if len(sys.argv) == 1:
        r = r_sync("./config.json")
        r.work()
        pass
    else:
        for cfg_name in sys.argv[1:]:
            r = r_sync(cfg_name)
            r.work()

if __name__ == '__main__':
    main()
使用fabric 2.5.0 上传文件 python3.6使用fabric2.5.0。最近开发东西都是在windows里面使用vs编写,然后传送到远端服务器上做编译。为了方便及时同步代码,编写了一个脚本来处理这个事情。 处理步骤: 检查本地文件目录下,svn状态列表中被修改、添加的文件; 对比本地文件和远程文件是否md5码匹配; 通过fabric2.5.0上传到远程服务; #!/usr/bin/python # encoding: ... 阅读详情

相关推荐

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 321

python如何实现自动化运维_python使用Fabric模块实现自动化运维

fab -H localhost host_type#结果:[localhost] Executing task 'host_type'[localhost] run: uname-s[localhost] Login passwordfor 'root':[localhost] out: Linux[localhost] out:Done.Disconnectingfrom localhost....

weixin_39672011的博客 275

DeepSeek-V4-Pro 正式版突袭上线:Agent 能力暴涨,DeepSWE 直接干翻 Claude Opus 4.8

8 月 12 日深夜,DeepSeek 悄悄在 API 文档里上架了一个新版本号——DeepSeek-V4-Pro-0813。第二天(13 日),这个版本被确认为 V4 Pro 正式版。没有发布会,没有预热,只改了版本号,就把整个 AI 圈的注意力又抢了过去。

2601_96613114的博客 838

使用Fabric模块编写的批量同步文件的python脚本

在进行运维管理时,经常会遇到批量同步文件的场景,有关这个场景我们可以使用fabric模块编写python脚本来实现。 有关fabric的安装与介绍,我前面的头条文章都有讲,大家有兴趣可以想前看看。运维工具之轻量级自动化运维工具Fabric源码安装 ,还有:Linux轻量级自动化运维工具Fabric命令行入口fab基本使用。脚本模拟的是同步多台服务器的/etc/hosts文件的内容。首先,先查看该服务

海渊_haiyuan的博客 1309

提示词注入攻击全面解析与防御策略

提示词注入(Prompt Injection)是指攻击者通过精心构造的输入内容,操纵或欺骗AI系统执行非预期行为的技术手段。这种攻击类似于传统的SQL注入或XSS攻击,但其目标是AI模型的提示词处理机制而非数据库或网页。提示词注入利用了大语言模型的一个基本特性:它们被设计为遵循指令。攻击者通过在用户输入中嵌入特定指令,试图覆盖或绕过系统原有的安全限制和行为规则,让模型执行本不应该执行的操作。深度防御:实施多层次防御策略,不依赖单一安全措施持续更新:随着攻击技术的发展不断更新防御措施安全设计优先。

免责声明:本资料部分整理自合法网络公开渠道,部分为个人学习积累成果,仅作学习参考、学术交流使用。所收费用仅为资料搜集整理的时间劳务酬劳。版权归原作者及出版方所有,本人不承担相关版权及内容法律责任,若有侵权请告知,即刻删除处理。 4206

Visio 2013安装遇阻?手把手教你搞定注册表权限错误1402(附64位系统特殊处理)

本文详细解析了Visio 2013安装过程中常见的注册表权限错误1402问题,特别是在64位系统下的特殊处理方法。通过分步指导如何修改注册表权限、处理Wow6432Node分支以及使用高级工具如subinacl,帮助用户顺利完成安装并避免常见连带问题。

t8u9v0w1x的博客 543

Fabric实现文件打包、上传与校验

一点睛 我们时常做一些文件包分发的工作,实施步骤一般是先压缩打包,再批量上传至目标服务器,最后做一致性校验。 本实战通过put()方法实现文件的上传,通过对比本地与远程主机文件的md5,最终实现文件一致性校验。 二代码 #coding=utf-8 #!/usr/bin/env python from fabric.api import * from fabric.context_ma...

实践求真知 2313

机器人控制入门

机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位

彼岸花 1万+

告别繁琐文件同步:Fabric本地与远程目录映射全攻略

Fabric是一款简单而强大的Python库,专注于远程执行和部署任务,让开发者告别繁琐的手动文件传输,轻松实现本地与远程服务器之间的目录映射与同步。无论是网站部署、日志同步还是代码分发,Fabric都能提供高效可靠的解决方案。 ## 📋 核心功能概览:为什么选择Fabric? Fabric的核心优势在于其简洁的API设计和强大的文件传输能力。通过封装SSH协议,它允许开发者通过几行Pyth

gitblog_01127的博客 673

cdk&java | 绘制含有丰富信息的化学反应(适合论文、网页、PPT)

package org.example; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.depict.DepictionGenerator; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.interfaces.IReaction; import org.openscience.cdk.

ASKCOS博客 897

QT自制TCP服务器

TCP服务器 网络调试助手

大脑曝光 3626

3分钟上手Fabric批量文件分发:告别多服务器配置同步烦恼

Fabric是一个简单易用的Python库,专为远程执行和部署任务设计,让开发者能够轻松实现多服务器间的文件分发与配置同步。无论是管理多台服务器的配置文件,还是批量部署应用程序,Fabric都能帮你告别繁琐的手动操作,显著提升工作效率。 ## 🚀 为什么选择Fabric进行批量文件分发? 在多服务器环境中,手动同步配置文件或部署应用往往耗时且容易出错。Fabric通过简洁的Python AP

gitblog_00583的博客 753

Plecs电力电子仿真专业教程-第一季 第一节 Plecs简介

Plces 电力电子仿真专业教程系列依托专业的电力电子仿真软件Plecs对各种电力电子常用的拓扑及实际设计的方案进行系统及仿真与软件代码仿真实践。通过对各种电路仿真原理的讲解及专业C语言代码程序的编写,提升学员的系统设计能力,软件编程能力与理论分析能力。

3640

使用Fabric的过程中遇到的若干bug

Fabric版本:1.6.1 文件中含有$等特殊字符时,按文件夹同步时可能导致这类文件丢失。解决方式:打包后再上传 Fabric put文件时是先同步到目标服务器当前登录账号的home下再mv到目标目录,如果在mv过程中出问题,导致home下得文件没有删除,下次同步还会报错。解决方式:在目标服务器用户的home目录下删除该文件 Fatal

关东人的专栏 3187

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

基于windows使用fabric将gitlab的文件远程同步到服务器(本地)

# -*- coding: utf-8 -*- from fabric.api import env, run, local, put from fabric.operations import sudo import tarfile import os import string # GIT_REPO = "git地址" env.user = '账号' en...

weixin_30266829的博客 159

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)

觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活。 2019/01/17基于windows使用fabric将gitlab的文件远程同步到服务器 # -*- coding: utf-8 -*- from fabric.api import env, run from fabric....

weixin_30423977的博客 125

工业级电源路径设计:TPS259483AYWPR与STM32L073RZ协同保护实战

电源路径是嵌入式系统可靠性的物理基石,其本质是电流、电压、温度与时间多维耦合的动态过程。理解电子保险丝(如TPS259483AYWPR)的四重保护机制——过流动态阈值、窗口式欠压/过压迟滞、结温折返及I²C故障快照——是构建工业韧性的前提;而MCU(如STM32L073RZ)的价值在于将硬件保护信号升维为可编程的供电健康模型(PHI)与分级降级策略。这种‘硬件感知+软件决策’闭环,显著提升系统在高温、浪涌、热插拔及人为误操作等真实工况下的失效预测与持续运行能力,广泛应用于PLC、传感器终端、防爆设备及智能网

weixin_33866037的博客 665

Fabric 实践:local 并发执行

环境: fabric 服务器:10.10.1.1 目标服务器组:test.com (10.10.1.2-21)一共 20 台服务器 需求: 我需要把我 fabric 服务器上的某些文件同步到 test.com 集群,但是我又需要并发执行,而不是通过 for 循环或者是串行的方式。 先直接上代码再针对性的解释: #!/usr/bin/python env #-*- coding: ut

cfang2005的专栏 748

Fabric管理组件的使用

Fabric的官方网站: http://www.fabfile.org 帮助文档: https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html Fabric的安装 yum install -y make gcc gcc++ python-devel python-pip $ pip install fabric==1.14.0 ...

banzhan2888的博客 334

fabric发布引起的bug

为什么80%的码农都做不了架构师?>>> ...

weixin_34185320的博客 162

python fabric 部署代码

from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.user='root' env.hosts=['192.168.1.1'] env.passwords = { 'root@192.168.1.1:22': 'pa...

不知火猪 378

Fabric 批量安装ZeroMQ

Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。在部署ZeroMQ的时候,写了一个脚本,用来实现多机统一部署,可以通过该脚本实现zeromq的统一部署

紫云清霄 922

Fabric solo源码之单元测试部分(1)

这里分析TestHaltBeforeTimeout(t *testing.T)的数据流,主要包括三个部分: 启动solo算法,Test调用goWithWait启动solo算法 调用syncQueueMessage小消息加入到处理队列中,其角色类似客户端 模拟执行,solo算法中,调用 chain.support.BlockCutter().Ordered(msg.normalMsg)模拟执...

longtails的博客 869

PYTHON FABRIC实现远程操作和部署

Python fabric实现远程操作和部署 fabric 作用环境配置hello world执行本机操作混搭整合远端操作多服务器混搭扩展 fabric title是开发,但是同时要干开发测试还有运维的活 (o(╯□╰)o) 近期接手越来越多的东西,发布和运维的工作相当机械,加上频率还蛮高,导致时间浪费还是优点多。 修复bug什么的,测试,提

sisiair的博客 1088

mysql fabric 部署_MySQL: Fabric 搭建 HA

搭建好Fabric之后,就可以在它的基础上创建HA Group、 Shard Group、HA+Shard Group等。这里来说明一下如何快速的搭建HA环境。Fabric192.168.2.234:33060Master192.168.2.234:33061Slave1192.168.2.234:33062Slave2192.168.2.234:330631、搭建Fabric环境如果已搭建好,可...

weixin_31556371的博客 879
上一篇: docker笔记
下一篇: go-pprof笔记
erlang_hell
博客等级 码龄14年 57粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值