Golang实现一个批量自动化执行树莓派指令的软件(5)模块整合

ops/2025/1/15 23:56:52/

简介

基于上篇 Golang实现一个批量自动化执行树莓派指令的软件(4)上传 已经实现了ssh的基本操作模块了,这里我们将这些模块进行整合。

环境描述

运行环境: Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS
目标终端树莓派DebianOS(主要做用它测试)

实现

接口定义

/* SFTPClient接口,整合Downloader和Uploader */
type ISFTPClient interface {IDownloaderIUploaderCancel() errorDestroy() error
}/* 整合所有ssh的基本操作模块 */
type ISSHUtil interface {Commander() ICommanderSFTFClient() ISFTPClientCancel() errorDestroy() error
}

接口实现

sftpclient.go

package sshutilimport ("fmt""github.com/pkg/sftp""golang.org/x/crypto/ssh"
)type SFTPClient struct {IDownloaderIUploadersftpClient *sftp.Client
}func NewSFTPClient(sshClient *ssh.Client) (*SFTPClient, error) {var (sftpClient = &SFTPClient{}err        error)sftpClient.sftpClient, err = sftp.NewClient(sshClient)if nil != err {return nil, err}if sftpClient.IDownloader, err = newDownloader(sftpClient.sftpClient); nil != err {sftpClient.Destroy()return nil, err}if sftpClient.IUploader, err = newUploader(sftpClient.sftpClient); nil != err {sftpClient.Destroy()return nil, err}return sftpClient, nil
}func (s *SFTPClient) Cancel() (err error) {if nil != s.IDownloader {if err = s.IDownloader.(*downloader).Cancel(); nil != err {fmt.Println("downloader cancel fail, ", err.Error())}}if nil != s.IUploader {if err = s.IUploader.(*uploader).Cancel(); nil != err {fmt.Println("uploader cancel fail, ", err.Error())}}err = nilreturn
}func (s *SFTPClient) Destroy() (err error) {if nil != s.IDownloader {if err = s.IDownloader.(*downloader).Destroy(); nil != err {fmt.Println("downloader cancel fail, ", err.Error())}s.IDownloader = nil}if nil != s.IUploader {if err = s.IUploader.(*uploader).Destroy(); nil != err {fmt.Println("uploader destroy fail, ", err.Error())}s.IUploader = nil}if nil != s.sftpClient {if err = s.sftpClient.Close(); nil != err {fmt.Println("sftp client destroy fail, ", err.Error())}s.sftpClient = nil}err = nilreturn
}

sshutil.go

package sshutilimport ("fmt""golang.org/x/crypto/ssh""net""time"
)type SSHUtil struct {commander  *CommandersftpClient *SFTPClientcfg SSHConfig
}func NewSSHUtil(cfg SSHConfig) (*SSHUtil, error) {var (sshUtil = &SSHUtil{}err     error)sshUtil.cfg = cfgsshUtil.cfg.sshClientConfig = &ssh.ClientConfig{User: cfg.User,Auth: []ssh.AuthMethod{ssh.Password(cfg.Password)}, // 密码HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {return nil},Timeout: time.Duration(cfg.Timeout) * time.Second,}sshUtil.commander, err = NewCommander(sshUtil.cfg)if nil != err {sshUtil.Destroy()return nil, err}sshUtil.sftpClient, err = NewSFTPClient(sshUtil.commander.sshClient)if nil != err {sshUtil.Destroy()return nil, err}return sshUtil, err
}func (s *SSHUtil) Commander() ICommander {return s.commander
}func (s *SSHUtil) SFTFClient() ISFTPClient {return s.sftpClient
}func (s *SSHUtil) Cancel() (err error) {if nil != s.commander {if err = s.commander.Cancel(); nil != err {fmt.Println("commander cancel fail, ", err.Error())}}if nil != s.sftpClient {if err = s.sftpClient.Cancel(); nil != err {fmt.Println("sftp client cancel fail, ", err.Error())}}err = nilreturn
}func (s *SSHUtil) Destroy() (err error) {if nil != s.sftpClient {if err = s.sftpClient.Destroy(); nil != err {fmt.Println("sftp client destroy fail, ", err.Error())}s.sftpClient = nil}if nil != s.commander {if err = s.commander.Destroy(); nil != err {fmt.Println("commander destroy fail, ", err.Error())}s.commander = nil}err = nilreturn
}

测试用例

代码源

https://gitee.com/grayhsu/ssh_remote_access

其他

参考


http://www.ppmy.cn/ops/16513.html

相关文章

Cache缓存

在计算机架构中,缓存(Cache)是一种高速数据存储层,它存储了一部分从原始数据源(如主内存)频繁访问的数据副本。通过将数据暂时存储在物理上更接近处理器的位置,缓存能够减少数据访问的延迟&…

牛客NC199 字符串解码【中等 递归,栈的思想 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/4e008fd863bb4681b54fb438bb859b92 相同题目: https://www.lintcode.com/problem/575 思路 解法和基础计算器1,2,3类似,递归参考答案C struct Info {string str;int stopindex;Info(str…

4.25日学习记录

[HZNUCTF 2023 preliminary]ppppop 对于php反序列化,在之前的学习中有过了解,但是对于序列化字符串的格式不是很了解,刚好接触这题,可以了解一下 序列化字符串的格式: 布尔型(bool)b&#xf…

计算机毕业设计Flask+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点 协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取:爬取歌曲、歌手…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了,这边的项目设计完全按照作者自己的喜好来进行定义和设置的,所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart,因为quickstart生成的api名字是greet,改起来…

Git操作与异常处理

文章目录 常用操作1、代码拉取2、代码提交3、暂存区状态4、提交代码5、推送远程仓库 异常处理【1】报错信息:Cannot pull into a repository with state: MERGING【2】报错信息:You have not concluded your merge (MERGE_HEAD exists)【3】报错信息&…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法,会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …

每天学习一个Linux命令之awk

每天学习一个Linux命令之awk 在Linux系统中,awk是一个功能强大的命令行工具,用于文本处理和数据提取。它可以读取文本文件的每一行,根据指定的模式进行匹配,并对满足条件的行进行处理和操作。本文将介绍awk命令的用法和常用选项。…