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

简介

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

环境描述

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

实现

接口定义

go 复制代码
/* SFTPClient接口,整合Downloader和Uploader */
type ISFTPClient interface {
	IDownloader
	IUploader

	Cancel() error
	Destroy() error
}

/* 整合所有ssh的基本操作模块 */
type ISSHUtil interface {
	Commander() ICommander
	SFTFClient() ISFTPClient
	Cancel() error
	Destroy() error
}

接口实现

sftpclient.go

go 复制代码
package sshutil

import (
	"fmt"
	"github.com/pkg/sftp"
	"golang.org/x/crypto/ssh"
)

type SFTPClient struct {
	IDownloader
	IUploader
	sftpClient *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 = nil
	return
}

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 = nil
	return
}

sshutil.go

go 复制代码
package sshutil

import (
	"fmt"
	"golang.org/x/crypto/ssh"
	"net"
	"time"
)

type SSHUtil struct {
	commander  *Commander
	sftpClient *SFTPClient

	cfg SSHConfig
}

func NewSSHUtil(cfg SSHConfig) (*SSHUtil, error) {
	var (
		sshUtil = &SSHUtil{}
		err     error
	)
	sshUtil.cfg = cfg
	sshUtil.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 = nil
	return
}

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 = nil
	return
}

测试用例

代码源

https://gitee.com/grayhsu/ssh_remote_access

其他

参考

相关推荐
慕城南风27 分钟前
Go语言中的defer,panic,recover 与错误处理
golang·go
资源补给站1 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
m0_748247551 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.941 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
PieroPc2 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
FF在路上2 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
VinciYan2 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发
众拾达人2 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
皓木.3 小时前
Mybatis-Plus
java·开发语言
不良人天码星3 小时前
lombok插件不生效
java·开发语言·intellij-idea