Golang实现一个批量自动化执行树莓派指令的软件(1)文本加密配置命令行交互实现

server/2024/9/23 6:32:45/

简介

实现一个在配置文件设置信息,一运行就可以自动执行设定指令的软件。
这次实现的是 :
1. 加密解密模块, 用于加密密码, 在配置时配置已加密的密码就可以;
2. 需要配置,自然也就有配置文件的序列化反序列化;
3. 这么多操作如果都放到一个文件执行就需要命令行指令知道当前该执行的动作, 所以还有个命令行交互

环境描述

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

实现

加密解密

package utilsimport ("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""io"
)type Encryption struct {Key []byte
}func NewEncryption(key string) *Encryption {return &Encryption{Key: []byte(key)}
}func (e *Encryption) Encrypt(text string) (string, error) {block, err := aes.NewCipher(e.Key)if err != nil {return "", err}textBytes := []byte(text)// 对于CBC模式,需要使用PKCS#7填充plaintext到blocksize的整数倍textBytes = e.pad(textBytes, aes.BlockSize)ciphertext := make([]byte, aes.BlockSize+len(textBytes))iv := ciphertext[:aes.BlockSize]if _, err := io.ReadFull(rand.Reader, iv); err != nil {return "", err}mode := cipher.NewCBCEncrypter(block, iv)mode.CryptBlocks(ciphertext[aes.BlockSize:], textBytes)return base64.StdEncoding.EncodeToString(ciphertext), nil
}func (e *Encryption) Decrypt(text string) (string, error) {data, err := base64.StdEncoding.DecodeString(text)if err != nil {return "", err}block, err := aes.NewCipher(e.Key)if err != nil {return "", err}if len(data) < aes.BlockSize {return "", err}iv := data[:aes.BlockSize]data = data[aes.BlockSize:]mode := cipher.NewCBCDecrypter(block, iv)mode.CryptBlocks(data, data)data = e.unpad(data, aes.BlockSize)return string(data), nil
}// pad 使用PKCS#7标准填充数据
func (e *Encryption) pad(buf []byte, blockSize int) []byte {padding := blockSize - (len(buf) % blockSize)padtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(buf, padtext...)
}// unpad 移除PKCS#7标准填充的数据
func (e *Encryption) unpad(buf []byte, blockSize int) []byte {if len(buf)%blockSize != 0 {return nil}padding := int(buf[len(buf)-1])return buf[:len(buf)-padding]
}

配置

isettings.go

package utilsimport ("errors"
)type SettingsType intconst (SETTINGS_JSON SettingsType = 0
)type ISettings interface {FromBytes(src []byte) errorToBytes() ([]byte, error)FromFile(filepath string) errorToFile(filepath string) errorData() interface{}
}func NewSettings(typ SettingsType, model interface{}) (ISettings, error) {if nil == model {return nil, errors.New("model == nil")}switch typ {case SETTINGS_JSON:return NewJsonSettings(model)default:return nil, errors.New("wrong setting type")}
}

jsonsettings.go

package utilsimport ("encoding/json""os"
)type JsonSettings struct {dat interface{}
}func NewJsonSettings(v interface{}) (ISettings, error) {cfg := &JsonSettings{dat: v}return cfg, nil
}func (c *JsonSettings) FromBytes(src []byte) error {return json.Unmarshal(src, c.dat)
}func (c *JsonSettings) ToBytes() ([]byte, error) {return json.MarshalIndent(c.dat, "", "  ")
}func (c *JsonSettings) FromFile(filepath string) error {bs, err := os.ReadFile(filepath)if nil != err {return err}err = c.FromBytes(bs)return err
}func (c *JsonSettings) ToFile(filepath string) error {bs, err := c.ToBytes()if nil != err {return err}err = os.WriteFile(filepath, bs, 0666)return err
}func (c *JsonSettings) Data() interface{} {return c.dat
}

命令行交互

package cmdimport ("github.com/spf13/cobra""os"
)var rootCommand = rootCmd()/*
所有指令初始化
*/
func init() {rootCommand.AddCommand(runCmd())rootCommand.AddCommand(versionCmd())rootCommand.AddCommand(initCmd())rootCommand.AddCommand(encryptCmd())
}func rootCmd() *cobra.Command {var cmd = &cobra.Command{Use:   "ssh_remote_access",Short: "SSH Remote Access Tool",Long:  "SSH Remote Access Tool, get help from https://listentome.blog.csdn.net/",Run:   rootRun,}cmd.Flags().BoolP("run", "r", false, "run job list")cmd.Flags().BoolP("init", "i", false, "initialize the tool")cmd.Flags().BoolP("version", "v", false, "get version")cmd.Flags().StringP("encrypt", "e", "", "encrypt the string")return cmd
}func rootRun(cmd *cobra.Command, args []string) {var cmdStrings = []string{"run", "init", "version", "encrypt"}var matchCmd stringfor _, v := range cmdStrings {var flag = cmd.Flag(v)if flag != nil && flag.Changed {matchCmd = vbreak}}if matchCmd == "" {matchCmd = "help"cmd.Help()return}for _, v := range cmd.Commands() {if v.Name() == matchCmd {v.Run(cmd, args)return}}
}func Execute() error {rootCommand.SetArgs(os.Args[1:])return rootCommand.Execute()
}

代码源

https://gitee.com/grayhsu/ssh_remote_access

其他

参考


http://www.ppmy.cn/server/22553.html

相关文章

C#身份查验接口、身份证文字识别接口、金融身份验证

针对金融领域远程自主开户的实名认证&#xff0c;翔云人工智能开放平台提出了有针对性的解决方案。翔云实名认证API其中包含了身份证实名认证、人脸识别、人证合一和银行卡实名认证&#xff0c;可快速识别提取用户身份信息&#xff0c;实时联网权威数据源进行用户身份的验证&am…

分布式系统事务一致性解决方案(基于事务消息)

参考&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一&#xff1a;业务方自己实现方案二&#xff1a;RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …

数海启航:数学与人工智能的深度交织

在人类文明的长河中&#xff0c;数学始终扮演着探秘未知、构建理论框架的基石角色。随着科技的飞速发展&#xff0c;尤其是人工智能&#xff08;AI&#xff09;的兴起&#xff0c;数学与这一前沿领域的结合愈发紧密&#xff0c;成为推动AI进步的最强引擎。 一、数学&#xff1a…

Linux深入理解内核 - 内存寻址

目录 引论&#xff0c;三个地址 硬件中的分段 段描述符 快速访问段描述符 分段单元 Linux GDT Linux LDT 硬件中的分页 PAE 硬件高速缓存 TLB Linux中的分页 页表类型定义pgd_t、pmd_t、pud_t和pte_t pteval_t&#xff0c;pmdval_t&#xff0c;pudval_t&#xff0…

WeFeShare |联邦SQL-畅享分布式数据的无缝连接和查询

WeFeShare &#xff1a;天冕科技独家策划的「隐私计算」分享栏目&#xff0c;内容主要围绕技术原理探讨、系统架构分析、应用场景介绍以及实例部署讲解等&#xff0c;和用户共同玩转联邦学习。 *本文约2600字&#xff0c;阅读约需6分钟 天冕联邦学习平台&#xff08;WeFe&#…

深入解析Python中的索引用法:掌握列表、字符串和元组的索引方式

在Python编程中&#xff0c;索引是一种重要的操作方式&#xff0c;用于快速定位和访问数据结构中的元素。索引操作可以应用于列表、字符串和元组等多种数据类型&#xff0c;具有广泛的应用场景。 本文将详细介绍Python中索引的用法&#xff0c;帮助读者深入理解和熟练运用索引…

Java-字符集-Unicode字符集

1 需求 Unicode 字符集UTF-8、UTF-16、UTF-32字符编码 2 接口 3 示例 4 参考资料

天冕科技亮相第十七届深圳国际金融博览会!

第十七届深圳国际金融博览会在深圳会展中心正式开幕&#xff0c;天冕科技跟随南山区组团集体亮相&#xff0c;充分展现金融活力。此次金博会&#xff0c;南山区政府共遴选了包括天冕科技在内的三家优秀金融科技企业组团参展&#xff0c;以特色与创新的案例展示了辖区金融业发展…