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

简介

基于上篇 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.mzph.cn/news/830082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s pod使用sriov

之前的文章中讲了k8s multus的使用,本章节来讲述下如何使用multus来实现sriov的使用。 一、sriov 简介 SR-IOV在2010年左右由Intel提出,但是随着容器技术的推广,intel官方也给出了SR-IOV技术在容器中使用的开源组件,例如&#…

3MF体积设计扩展

3MF 联盟最近宣布了他们最新的体积设计扩展(volumetric design extension),用于通过基于体积的描述来编码几何形状和空间多样性属性。 该组织致力于推进 3D 打印的通用规范,目前正在新扩展达到 1.0 之前征求公众反馈。 NSDT工具推…

OpenCV 实现重新映射

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 实现霍夫圆变换 下一篇 :OpenCV实现仿射变换 目标 在本教程中,您将学习如何: 一个。使用 OpenCV 函数 cv::remap 实现简单的重新…

20240428如何利用IDM下载磁链视频

缘起: https://weibo.com/tv/show/1034:4864336909500449 中国获奖独立纪录片《阿辉》揭秘红灯区“教父”的生存法则 5,751次观看 1年前 发布于 陕西 身为里中横 67.7万粉丝 互联网科技博主 微博原创视频博主 头条文章作者 https://weibo.com/tv/show/1034:4864…

数据通信-A

数据通信 一、数据通信网络基础二、VRP系统三、eNSP配置命令 不是从零开始,有一些基础,主要记录配置命令。一、数据通信网络基础 图标:主要是认识第一行。 常见术语:数据通信网络最基本的功能是实现数据互通。 数据载荷&#…

解决IDEA下springboot项目打包没有主清单属性

1.问题出现在SpringBoot学习中 , 运行maven打包后无法运行 报错为spring_boot01_Demo-0.0.1-SNAPSHOT.jar中没有主清单属性 SpringBoot版本为 2.6.13 Java 版本用的8 解决方法 1.执行clean 删除之前的打包 2.进行打包规范设置 2.1 3.进行问题解决 (借鉴了阿里开发社区) 使用…

[嵌入式系统-53]:嵌入式系统集成开发环境大全

目录 一、嵌入式系统集成开发环境分类 二、由MCU芯片厂家提供的集成开发工具 三、由嵌入式操作提供的集成开发工具 四、由第三方工具厂家提供的集成开发工具 一、嵌入式系统集成开发环境分类 嵌入式系统集成开发工具和集成开发环境可以按照不同的分类方式进行划分&#xff…

【LAMMPS学习】八、基础知识(5.2)粒度模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

将针孔模型相机 应用到3DGS

Motivation 3DGS 的 投影采用的是 CG系的投影矩阵 P P P, 默认相机的 principal point (相机光心) 位于图像的中点处。但是 实际应用的 绝大多数的 相机 并不满足这样一个设定, 因此我们 需要根据 f , c x , c y {f,c_x, c_y} f,cx​,cy​ 这几个参数重新构建3D …

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名:…

vue学习的预备知识为学好vue打好基础

目录 Vue是什么 ?如何使用Vue ?Vue ApiVue入口apiVue实例apiVue函数api 无构建过程的渐进式增强静态HTMLVue模块化构建工具npmyarnWebpackvue-cliVite Vue是什么 ? 文章基于Vue3叙述。 Vue (发音为 /vjuː/,类似 view) 是一款用于…

十大USDT交易平台大全XEX交易所

USDT是一种基于比特币区块链网络的加密代币,主要运用于数字货币交易平台,以稳定币为主。USDT的核心价值在于其与真实货币的固定兑换比率1:1,所以被称为Tether。随着加密货币市场的不断壮大,越来越多的交易平台开始支持USDT&#x…

2024深圳杯(东北三省)数学建模C题完整论文讲解(含完整python代码及所有残骸音爆位置求解结果)

大家好呀,从发布赛题一直到现在,总算完成了2024深圳杯(东北三省数学建模联赛)A题多个火箭残骸的准确定位完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊…

【vscode环境配置系列】vscode远程debug配置

VSCODE debug环境配置 插件安装配置文件debug 插件安装 安装C/C, C/C Runner 配置文件 在项目下建立.vscode文件夹,然后分别建立c_cpp_properties.json, launch.json,tasks.json,内容如下: c_cpp_properties.json:…

如何解决pycharm创建项目报错 Error occurred when installing package ‘requests‘. Details.

🐯 如何解决PyCharm创建项目时的包安装错误:‘requests’ 🛠️ 文章目录 🐯 如何解决PyCharm创建项目时的包安装错误:requests 🛠️摘要引言正文📘 **问题分析**🚀 **更换Python版本…

如何利用快解析软件搭建映射端口

端口映射,就是将内网中主机的一个端口映射到外网主机的一个端口,提供相应的服务,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。如何才能实现端口映射?今天小编给大家介绍两种方法&…

fetch请求后端返回文件流,并下载。

前端&#xff1a; <script src"~/layui/layui.js"></script> <script src"~/Content/js/common/js/vue.min.js"></script> <script src"~/Content/js/common/js/jquery-1.10.2.min.js"></script><styl…

QT学习篇—qt软件安装

qt下载网址http://download.qt.io/new_archive/qt/ QT官网Qt | Tools for Each Stage of Software Development LifecycleAll the essential Qt tools for all stages of Software Development Lifecycle: planning, design, development, testing, and deployment.https:…

虚拟机扩容-根目录挂载sda1的空间不足

提醒&#xff01;不管成不成功&#xff0c;一定要先备份一份虚拟机&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 走过路过点个关注吧&#xff0c;想到500粉丝&#xff0c;哭。一、查看分区情况 df -h可以看到/dev/sda1已经被占满了 2.关闭虚拟机&#xff…

TinyShell后门通信模型剖析

TinyShell后门通信模型剖析 通过对TinyShell后门的外联通信函数进行剖析&#xff0c;梳理其通信过程如下&#xff1a; 调用gettimeofday函数及getpid函数获取当前时间tv及进程pid&#xff0c;将tv和pid作为SHA1算法的输入&#xff0c;生成得到20字节的IV1数据调用gettimeofda…