GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html

内容提要:

  • 1.远程连接linux执行sftp文件下载
  • 2.window下文件解压缩(tar、gz、zip)
  • 3.window下文件解压缩及带密码解压(zip)
  • 4.window下调用阿里雲RDS api查询备份并下载
  • 5.GO语言命令行工具技巧
      首先,写这篇博文的一个出发点是:我无法在window的cmd命令行下实现日期的加减(還有其他問題),当然這不是没有实现的方法,而是实现起来很难维护难度较大,光插件都够我折腾了,另外window自带的powershell也可以实现,不过作为一个java渣来说真的难了点儿,因为又要熟悉powershell语法从零开始
      后来,我换了个思路,想用代码+第三方开源插件(依赖)实现以上功能;至于,目前我有对Python、java、js、Go、甚至Rust,这些都有或多或少的涉猎,分析了一遍,发现使用半静态或者脚本语言实现很easy,不过有一个问题:你每部署一台机器都要安装语言环境如Python、java,虽然可以跨平台,不过太臃肿了部署一个几兆的应用要安装一个几百兆的语言环境,实在太浪费了内存,js呢又太弱,需要自己造轮子,可以剔除,Rust速度快,不过编写的难度太大,很难考虑,
      最后我选用GO作为以上工具的语言,当然这里不得不说一下使用GO的好处:语法简单、跨平台、代码安全、静态打包:这个很重要,可以直接打windows下的可执行程序,也可以打linux可执行程序[交叉编译],这样就可以在部署的时候不用动手又动脚的安装语言环境,配置环境变量之类的乱七八糟的东西,同时安全度也很复合我的需求,例如打成一个可执行包后就自带破解难度,更牛掰的是还可以使用upx对可执行包进行加壳,加壳有三个好处:几乎无法破解、可执行应用体积大大缩小(比我的一个应用打包后有16MB,加壳后只有3MB左右)、易于分发(当然这个是建立在加壳之上在),一切准备就绪,这一篇我就简单的聊一聊我用GO如何实现这类Tools。

由于本章只是個人實現的工具分享,因為這些工具有一定的灵活性,(若需要改造或實現)这时就需要您有一定的GO语言基础。

1.远程连接 example: log_bak01.go

这里的我主要用到 github.com/pkg/sftpgolang.org/x/crypto/ssh,一个是执行sftp命令,一个是建立ssh连接的,因为sftp是建立在安全的ssh连接上的
样例中有我实现实现linux日志拉取的功能的完整代码,,这里就不展示具体实现代码(参考样例),就简单说说实现步骤吧:

  • 建立ssh配置

    • config := &ssh.ClientConfig{...
  • 建立建立ssh的TCP连接(ssh是建立在TCP连接上的)
    • client, err := ssh.Dial("tcp", "服务器地址:端口", config)
  • 使用ssh连接建立一个sftp连接J(sftp在使用完毕后必须close())
    • sftp, err := sftp.NewClient(client)
  • 打开一个Linux系统文件(在本地文件写入后远程文件必须close())
    • srcFile, err := sftp.Open("/路径/文件01.log." + time + ".zip")
  • 创建一个本地下载文件(本地文件写入完成后需要close())
    • dstFile, err := os.Create(targetPath + "/文件01.log." + time + ".zip")
  • 将链接的远程文件写入到本地下载文件
    • srcFile.WriteTo(dstFile)
  • 以上步骤的具体代码可以参考: log_bak01.go

2.window下文件解压缩(tar、gz、zip) example: gzip_util.go,unzip_util.go

由于在解决实际问题的时候面临的问题比较复杂,光一个压缩包就有zip、tar、gz还有tar+gz的方式,具体使用的时候用到的依赖有
archive/tarcompress/gziparchive/zippath/filepath及GO自带的基本依赖等等...

  • 对于zip就比较简单

    • 首先你得傳入一個zip文件全路徑,然後使用zip的读模式open这个zip文件

      • r, err := zip.OpenReader(fullZipFile)
    • 遍历这个读取的zip文件,并循环(循環完畢需要將這個zip文件close())
      • for _, f := range r.File {...
    • 每循环到一个目录的时候在local创建这个文件夹
      • os.MkdirAll(path, f.Mode())
    • 每循环到一个文件的时候先在local创建目录并以写模式open这个文件,然后将循环到的文件写入到这个local文件(寫入完成需要close())
      • os.MkdirAll(filepath.Dir(path), f.Mode())
      • f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
      • _, err = io.Copy(f, rc)
  • 對於tar+gz文件的處理方法
    • 首先您需要以讀模式Open這個文件(在這個壓縮文檔全部解壓後需要close())

      • fr, err := os.Open(srcFilePath)
    • 因為大多數這種組合的壓縮文檔都是先tar然後再gz,所以這裏我們就先使用gzip依賴讀取這個文檔
      • gr, err := gzip.NewReader(fr)
    • 讀取gzip成功後,這時候需要使用tar依賴讀取這個tar文檔
      • tr := tar.NewReader(gr)
    • 遍歷循環這個讀取到的tar文檔並寫入目錄及文件(注意local文檔在寫入完成之後需要close())
      • for {...

3.window下zip文件带密码解压 example: unpzip_util.go

其實官方給的example中並沒有帶秘密的解壓縮,這個問題困擾了我幾個小時,最終在我碰到有網友寫的這個依賴才得以解決:github.com/yeka/zip",再次表示十分
感謝,在此能將example共享出來也算是功德一件哈~

這裏的處理其實十分簡單,其實就是在每次循環zip文件的時候判斷一下IsEncrypted(),在true的時候SetPassword(password) ,後面使用io之後的文件就是
非加密文件了,so easy ~

  • 需要使用依賴的Open這個zip文件

    • r, err := zip.OpenReader(fullZipFile)
  • 遍歷循環這個zip文件
    • for _, f := range r.File {...
  • 在每循環到一個文件及目錄的時候設置一下password
    • f.SetPassword(password)
  • 將當前讀取到的文件及目錄寫入到local
    • func writeFile(filePath string, f *zip.File) error {...

4.window下调用阿里雲RDS api查询备份并下载 example: main1.go

其實這是對前幾個功能對一個綜合,我對目的是下載阿里雲的RDS的物理備份並解壓,當然你需要先參閱官方api文檔,在這裏DescribeBackups
其實一開始我並不知道,所有的備份文件都需要查詢到其下載連結後才可下載,獲取到下載連結後其他的事情就按部就班了~,以下是我實現的思路,可參閱~

  • 參閱官方文檔並使用api查詢備份文件(官方有api的調試代碼)

    • client, err := rds.NewClientWithAccessKey("cn-hangzhou", "您的accessKeyId", "您的accessKeySecret")
    • request := rds.CreateDescribeBackupsRequest()
    • respJsonStr, err := client.DescribeBackups(request)
  • 因為查詢到的數據為json的字符串形式,這時候需要將json轉換成struct
    • data := &BackupInfo{}
    • json.Unmarshal(respJsonStr.GetHttpContentBytes(), data)
  • 循環或直接調用這個結構體實例獲取到下載地址及相關參數
    • downloadUrl := data.Items.BackupItem[0].BackupDownloadURL
    • backupDate := data.Items.BackupItem[0].BackupStartTime[0:10]
  • 下載文件
    • err := util.DownloadFile(downloadUrl, filePath)
  • 解壓文件
    • err2 := util.UnTarGz(filePath, unTarGzFilePath)

5.GO语言命令行工具技巧 example main3.go

一開始我是想將打包好的tools部署後使用命令行調用,這樣會顯得靈活一些,後來覺得這樣使用太過與零碎了,而且window下的執行環境也是個問題,最後才做決定將一組
功能當堵打包,然後使用windows的計畫任務調用,不過既然作為一種可行的方式(linux下比較可行),所以就參閱了個簡單的Demo,讀者可以根據這個Demo改寫上述功能

這裏是結合著命令行實現了個文件下載功能

  • GO語言開發環境自帶os包,使用os.Args獲取調用的所有調用的參數,這個args\[0\]是你打包好的exe可執行程序本身(windows環境下)

    • 比如你的命令行是 main_exec.exe https://www.xxx.com/path/xx.zip D:/tmp
    • 使用os.Args獲取到的參數有仨 os.Args[0]:main_exec.exe,os.Args[1]:https://www.xxx.com/path/xx.zip,os.Args[2]:D:/tmp
  • 從命令行參數中獲取下載地址和目錄參數
    • url := os.Args[1] filename := os.Args[2]
  • 調用download工具下載這個網絡文件
    • err := util.DownloadFile(url, filename)

最後

本章的內容比較零散,望讀者諒解,另外,以上內容的所有代碼(包括已經打包好的exe程序)我已推送至github rds_backup
這些代碼全部使用GO語言實現,當然以上內容可能並不完整,全黨是拋磚引玉,一個解決問題的方式,如有需要改進或優化的地方請留言哈~

原文地址:https://www.cnblogs.com/funnyzpc/p/11721978.html

时间: 2024-10-06 21:11:29

GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载的相关文章

Python 命令行工具 argparse 模块使用详解

先来介绍一把最基本的用法 import argparse parser = argparse.ArgumentParser() parser.parse_args() 在执行 parse_args() 之前,所有追加到命令行的参数都不会生效,生效了之后的默认情况类似于这样: Reference: https://www.jianshu.com/p/fef2d215b91d  python argparse用法总结 原文地址:https://www.cnblogs.com/piperck/p/84

Scrapy命令行工具简介

Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 在最初使用Scrapy时,使用编辑器或IDE手动编写模块来创建爬虫(Spider)程序,然后使用scrapy crawl命令执行Spider. 这种方式很初级.繁琐,不适合更大型的项目. 很好的是,Scrapy提供了 命令行工具(Command line tool),通过这套工具,开发者可以轻松建立 Scrapy项目,而不仅仅是一个一个的Spider程序. 初见Scrapy命

ImageMagick命令行工具

[关于ImageMagick] [命令行工具] [源码安装] [二进位发布版本] [资源配置文件] [相关下载] ImageMagick命令行工具 [ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ] ImageMagick 包括一组命令行工具来操作图片.你大部份习惯每次编辑图片都提供图形用户接口 (GUI) 编辑图像就像GIMP和PhotoS

x264源代码简单分析:x264命令行工具(x264.exe)

本文简单分析x264项目中的命令行工具(x264.exe)的源代码.该命令行工具可以调用libx264将YUV格式像素数据编码为H.264码流. 函数调用关系图 X264命令行工具的源代码在x264中的位置如下图所示. 单击查看更清晰的图片 X264命令行工具的源代码的调用关系如下图所示. 单击查看更清晰的图片 从图中可以看出,X264命令行工具调用了libx264的几个API完成了H.264编码工作.使用libx264的API进行编码可以参考<最简单的视频编码器:基于libx264(编码YUV

FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没有一个人对FFmpeg这个名称感到陌生.FFmpeg是一套非常知名的音视频处理的开源工具,它包含了开发完成的工具软件.封装好的函数库以及源代码供我们按需使用.FFmpeg提供了非常强大的功能,可以完成音视频的编码.解码.转码.视频采集.后处理(抓图.水印.封装/解封装.格式转换等),还有流媒体服务等

ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作

问题导读1.ZooKeeper包含哪些常用命令?2.通过什么命令可以列出服务器 watch 的详细信息?3.ZooKeeper包含哪些操作?4.ZooKeeper如何创建zookeeper? 常用命令 ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令. ZooKeeper 常用四字命令见下表 1 所示: 表 1 : ZooKee

Scrapy 1.4 文档 05 命令行工具

在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scrapy tool).紧跟在 scrapy 命令之后的命令属于子命令(我们称之为"命令(commands)"或"Scrapy命令(Scrapy commands)",例如用于新建项目的 startproject 命令). Scrapy 工具包含许多命令,有各自的功能.参数

windows下的命令行工具babun

什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是A Windows shell you will love! babun的几个特点 使用babun无需管理员权限先进的安装包管理器(类似于linux上面的apt-get或yum)预先配置了Cygwin和很多插件拥有256色的兼容控制台HTTP(S)的代理支持面向插件的体系结构可以使用它来配置你的gi

dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)

dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid,att,attname) values(9,'d','症状') 2.添加archives表字段: alter table `dede_archives` modify `flag` set ('h','c','p','f','s','j','a','b','d') default NULL