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

简介

实现一个在配置文件设置信息,一运行就可以自动执行设定指令的软件。
这次实现的是 :
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.mzph.cn/bicheng/3472.shtml

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

相关文章

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…

【信安评估】2024年全国职业院校技能大赛高职组“信息安全管理与评估”安徽省选拔赛赛项规程

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

ChatGPT API - 笔记

1 新手如何用Python玩转ChatGPT API,详细讲解 新手如何用Python玩转ChatGPT API,详细讲解-Django社区,Django中文网,django教程,Django! import time import requestsOPENAI_API_KEY = "****" proxy = "127.0.0.1:7890" # 你需要添加你的代理,懂得都…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版&#xff0c;它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的&#xff0c;因此它与RHEL具有非常类似的特性和功能&#xff0c;包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型.检索增强的大语言模型输入优化策略.指令微调策略.预训练策略.总结应用建议未来方向大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径上具…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

HttpURLConnection 接收长字符串时出现中文乱码出现问号��

HttpURLConnection 接收长字符串的时候随机位置出现中文乱码&#xff0c;显示问号&#xff0c;究其原因是utf8解码长度问题&#xff0c;程序上写法需要注意&#xff0c;要把字节全部读进来一起转码&#xff0c;不能边读取边转码&#xff0c;会截断中文的字节码&#xff0c;导致…

卡巴斯基plus(kaspersky plus) 21.16主界面出不来

请选择下载x86版本的dotnet 6.0 x86版本的dotnet 6.0 https://download.visualstudio.microsoft.com/download/pr/4aded178-a52a-4fcc-a779-59bb444df048/67924e3556a3a69da09528bd74dca9ef/dotnet-sdk-6.0.421-win-x86.exe

企业微信hook接口协议,ipad协议http,发送大视频文件

发送大视频文件 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1688853790xxx", //uuid 默认随机生成如果初始化传了id则用初始…

软考-论文写作-论架构风格论文

题目 素材 框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员线上开展各项工作以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合实践,以委员履职系统为例,主要讨论软件…

12.6.1 实验5:IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

密码学系列0-总述

通过这一系列文章&#xff0c;帮助读者能快速入门密码学安全性证明。 这一系列文章主要包括以下内容&#xff1a; 1.可证明安全的概念 2.密码学常用困难性问题&#xff1a;CDH,DDH,DLP,BDH等。然后讨论问非对称&#xff0c;对称双线性配对上困难性问题。讨论为什么对称双线性DD…

问答机器人学习资料

longchain 5 分钟内搭建一个免费问答机器人&#xff1a;Milvus LangChain-腾讯云开发者社区-腾讯云 chatglm大模型 基于本地知识的问答机器人langchain-ChatGLM 大语言模型实现方法详解_python_脚本之家 探索QRobot&#xff1a;智能对话与聊天机器人的开源奇缘-CSDN博客 如何…

推荐一个带java环境的tomcat镜像,使用jdk 1.8.0_312

镜像名称和版本&#xff1a;tomcat:10.0-jdk8拉取命令&#xff1a;docker pull tomcat:10.0-jdk8镜像tar包&#xff08;百度网盘&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1TM8k7Z97NYhahCrrTh3vBw?pwdrq93 提取码&#xff1a;rq93docker启动命令&am…

请编写一个函数void fun(char*ss),其功能是:将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

制作一个RISC-V的操作系统十三-抢占式多任务和兼容协作式多任务

文章目录 强占式多任务流程代码具体流程兼容协作式多任务&#xff08;软中断&#xff09;寄存器 msip流程代码结果 强占式多任务 流程 抢占式多任务由计时器中断触发&#xff0c;最后在处理程序中切换到下一个进程 代码具体流程 上下文中增加pc寄存器 寄存器保留上下文和切…

A39 STM32_HAL库函数 之 Rcc通用驱动 所有函数的介绍及使用

A39 STM32_HAL库函数 之 Rcc通用驱动 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_RCC_DeInit1.2 HAL_RCC_OscConfig1.3 HAL_RCC_ClockConfig1.4 HAL_RCC_MCOConfig1.5 HAL_RCC_EnableCSS1.6 HAL_RCC_DisableCSS1.7 HAL_RCC_GetSysClockFreq1.8 HAL_RCC_GetHCLKFreq1.9 HAL_…

C++笔记打卡第23天(STL常用算法)

1.常用排序算法 sort&#xff1a;对容器内元素进行排序 class Myprint { public:void operator()(int val){cout << val << " ";} };// 查自定义数据类型 void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(15);v.push_b…

Qt :Ordered Map

在项目中&#xff0c;有时候对数据结构有这样的需求&#xff0c;既需要具备Map的高效读写&#xff0c;又要兼具插入数据成员的有序性&#xff0c;这时候你就需要使用Ordered Map了。 关于Ordered Map,相关资源比较多&#xff0c;实现思路比较简单&#xff0c;基本上都是通过lis…