项目需要,需要一个agent客户端,调用shell脚本以实现自动化部署,写博客备忘
1.go语言开发客户端,调用本地指定脚本
package main
import (
. "agent"
"agent/conf"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"redis"
. "time"
)
var logfile, _ = os.OpenFile("agent.log", os.O_RDWR|os.O_CREATE, 0777)
var logger *log.Logger = log.New(logfile, "", log.LstdFlags|log.Lshortfile)
var latest_frequency int = Config.Heartbeat_frequency
type Task struct {
Taskid string
Script string
ScriptParam string
}
type Redis_Instance struct {
Port string
Password string
Path string
}
type Heart_message struct {
Frequency int
Tasks []Task
Instances []Redis_Instance
}
func main() {
for {
latest_frequency, tasks, instances := get_msg()
go handle_task(tasks)
go sync_config(instances)
Sleep(Duration(latest_frequency) * Minute)
}
}
func get_msg() (int, []Task, []Redis_Instance) {
var msg Heart_message
logger.Println("Config.Heartbeat_service=" + Config.Heartbeat_service)
if resp, err := http.Get(Config.Heartbeat_service + "/heartbeat"); err == nil && resp.StatusCode == http.StatusOK {
defer resp.Body.Close()
if data, err := ioutil.ReadAll(resp.Body); err == nil {
json.Unmarshal(data, &msg)
logger.Print(msg)
json.Unmarshal(data, &msg)
return msg.Frequency, msg.Tasks, msg.Instances
}
}else {
logger.Println("when get msg : do Nothing and return ..")
}
return latest_frequency, nil, nil
}
func handle_task(tasks []Task) {
for _, t := range tasks {
var success string = "0"
cmd := Command{
Cmd: t.Script + ".sh",
Args: t.ScriptParam,
}
if _, err := cmd.Execute(); err == nil { //result, err
success = "1"
logger.Println("task_id=" + t.Taskid + ",t.Script=" + t.Script + ",success=" + success)
}else {
logger.Println("task_id=" + t.Taskid + ",t.Script=" + t.Script + ",success=" + success)
}
i := 0
para := url.Values{
"taskId": {t.Taskid},
"status": {success},
}
for _, err := http.PostForm(Config.Heartbeat_service+"/callback", para); i < Config.Callback_retry && err != nil; i++ {
_, err = http.PostForm(Config.Heartbeat_service+"/callback", para)
}
}
}
func sync_config(instances []Redis_Instance) {
for _, instance := range instances {
if c, err := redis.Dial("tcp", "127.0.0.1:"+instance.Port); err != nil {
log.Println(err)
} else {
defer c.Close()
if configs, err := redis.Strings(c.Do("config", "get", "*")); err == nil {
if c, err := conf.ParseFile(instance.Path); err != nil {
log.Println(err)
} else {
for i := 0; i < len(configs); i += 2 {
if v, err := c.Get(configs[i]); v != configs[i+1] && err == nil {
c.Set(configs[i], configs[i+1])
}
}
}
}
}
}
}
2.主要是下面这个类
package agent
import (
"os/exec"
"strings"
)
type Command struct {
Cmd string
Args string
}
func (cmd *Command) Execute() ([]byte, error) {
var argArray []string
if cmd.Args != "" {
argArray = strings.Split(cmd.Cmd + " " + cmd.Args, " ")
} else {
argArray = make([]string, 0)
}
//如果是执行shell脚本 必须是这么写,如果是win下面执行bat文件,不指定/bin/sh,直接以cmd开头即可
//当然注意脚本的路径了
_cmd := exec.Command("/bin/sh", argArray...)
return _cmd.Output()
}
windows下面安装go和eclipse引入go插件比较简单,网上搜的
linux下也是一样的
go run agent.go直接编译后执行,没有生成可执行文件
go build -o goagent.sh 生成可执行文件
go build与go install有区别,小心使用
相关推荐
在IT领域,我们经常需要与命令行交互,Shell脚本成为自动化任务的重要工具。`Go-sh`是一个用Go语言编写的库,它提供了对Shell语法的解析和格式化功能,极大地帮助开发者在Go程序中集成Shell脚本处理能力。 **1. Go...
它通过与官方Golang发布服务器交互,获取最新的版本信息,然后下载相应的源代码包,编译,最后安装到系统中。这样,你无需手动执行复杂的命令序列,只需运行一个脚本就能完成全部操作。 在使用`update-golang`之前...
glsp-shell-演示这是演示如何通过在 golang 程序中嵌入来创建交互式 lispy shell 的基本示例代码。用法 $ make$ ./glisp-shell-demo glisp> (+ 1 1)> 2glisp> (defn add [a] (+ a 1))> ()glisp> (add 5)> 6glisp>...
Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以将反向外壳升级为完整的交互式反向器Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以进行升级将反向shell转换为完全交互式反向shell(tty生成,stty大小....
Thunder BoltDB的交互式Shell安装确保您具有正常的Go环境(需要Go 1.6或更高版本)。 请参阅安装说明。 要安装Thunder,只需运行:go get github.com/muesli/thun Thunder BoltDB的Interactive Shell安装确保您具有...
对于有经验的开发者来说,这是一个很好的学习和参考资源,可以深入理解如何利用shell脚本与Golang生态系统交互。 总的来说,`update-golang` 是一个实用的工具,它通过自动化的方式帮助用户轻松管理Golang的版本...
Elvish:友好的交互式Shell和表达性编程语言Elvish是友好的交互式Shell和表达性编程语言。 它可以在Linux,BSD,macOS和Windows上运行。 尽管Elvish处于1.0之前的状态,它还是一种友好的交互式Shell和表达性编程语言...
在本文中,我们将深入探讨如何使用Golang通过SSH(Secure Shell)协议来执行交换机操作。SSH是一种网络协议,用于安全地远程登录到其他系统,执行命令和传输数据。Golang提供了一个名为`golang.org/x/crypto/ssh`的...
这个模块的主要目的是解决在不同操作系统上执行命令时遇到的兼容性问题,使得Go程序可以更加方便地处理命令行参数和环境变量,同时保持与系统shell的交互一致性。 1. **shell命令执行的挑战**: 在不同的操作系统...
Docker的简单交互式提示。 从启发使用 。 目录 产品特点 建议docker命令 在docker exec / start / stop命令后列出容器ID和名称 根据键入的命令建议命令参数 在docker pull命令之后列出来自docker hub的图像 在...
Go-Readline是一个专为Go语言(golang)设计的纯Go实现的库,它旨在提供与GNU Readline相似的功能。GNU Readline是广泛用于Unix和Linux系统的命令行交互库,它提供了动态输入历史、补全功能以及方便的键盘快捷键,极...
go语言邮件反弹shell(windows+linux版,windows版用go1.7编译运行不报毒 此版本为后续改进debug版本,windows下可以编译去掉显示窗口 添加linux版本
走 以下为相关问题记录的目录:(可以复制相关问题关键字... golang shell工具(golang实现的交互式shell,实现一个简易版的交互终端) golang实现一个正向后门(backdoor,基于go的正向后门) golang实现一个反向后
因为rasm2仅支持32/64位操作码到机器代码的转换发布Sna概述基于unicorn的ASM shell目前仅支持x86和x64架构,发布https://github.com/cch123/asm-cli/releases快照X64模式:X86模式:依赖项keystone-engine / ...
Unix shell是操作系统中的一种命令行解释器,它为用户提供了一个与操作系统交互的界面,允许用户输入命令并执行各种系统操作。在计算机科学领域,Go语言(也称为Golang)因其高效、简洁和并发特性而受到欢迎,被广泛...
当需要进行复杂计算或者与硬件交互时,Go程序可以通过子进程调用Shell脚本来完成,然后利用Go的并发机制处理多个请求。这种结合方式可以充分利用Go的性能优势和Shell的灵活性。 **PHP、Shell与Go的协作** 在"master...
- **调用Linux命令**:Golang的`os/exec`包允许程序执行shell命令,实现与操作系统更深度的交互,如管理系统服务、监控系统状态等。 了解以上知识点后,开发者可以更有效地进行Golang项目的开发和部署,特别是在...
Go-Grumble是一个用Go语言开发的框架,用于构建高效、功能丰富的命令行界面(CLI)和交互式Shell应用。它为开发者提供了一套全面的工具,使得创建具有强大功能的命令行工具变得简单且直观。在Go语言的生态系统中,...
传统的Shell后门是攻击者在目标系统上打开一个命令执行通道,而反弹Shell则是目标系统主动连接到攻击者的服务器,提供一个交互式的Shell环境。这种设计使得攻击者可以绕过防火墙的出站规则,因为看起来是目标系统在...
SSH(Secure Shell)是一种广泛使用的网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。SSH蜜罐则模仿了SSH服务器,当攻击者尝试非法访问时,蜜罐会记录他们的活动,而不实际授予任何权限。 Go语言,...