`

golang与shell交互

 
阅读更多

项目需要,需要一个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有区别,小心使用

 

分享到:
评论
1 楼 sugongp 2013-12-18  

相关推荐

    友好的交互式Shell和富有表现力的编程语言-Golang开发

    Elvish:友好的交互式Shell和表达性编程语言Elvish是友好的交互式Shell和表达性编程语言。 它可以在Linux,BSD,macOS和Windows上运行。 尽管Elvish处于1.0之前的状态,它还是一种友好的交互式Shell和表达性编程语言...

    glisp-shell-demo:golang程序中运行的交互式glisp shell示例

    glsp-shell-演示这是演示如何通过在 golang 程序中嵌入来创建交互式 lispy shell 的基本示例代码。用法 $ make$ ./glisp-shell-demo glisp&gt; (+ 1 1)&gt; 2glisp&gt; (defn add [a] (+ a 1))&gt; ()glisp&gt; (add 5)&gt; 6glisp&gt;...

    自动生成适用于Linux或Windows受害者的完全交互的反向外壳-Golang开发

    Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以将反向外壳升级为完整的交互式反向器Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以进行升级将反向shell转换为完全交互式反向shell(tty生成,stty大小....

    BoltDB的交互式Shell-Golang开发

    Thunder BoltDB的交互式Shell安装确保您具有正常的Go环境(需要Go 1.6或更高版本)。 请参阅安装说明。 要安装Thunder,只需运行:go get github.com/muesli/thun Thunder BoltDB的Interactive Shell安装确保您具有...

    docker-shell:docker的简单交互式提示

    Docker的简单交互式提示。 从启发使用 。 目录 产品特点 建议docker命令 在docker exec / start / stop命令后列出容器ID和名称 根据键入的命令建议命令参数 在docker pull命令之后列出来自docker hub的图像 在...

    go语言邮件反弹shell(windows+linux版,windows版用go1.7编译运行不报毒

    go语言邮件反弹shell(windows+linux版,windows版用go1.7编译运行不报毒 此版本为后续改进debug版本,windows下可以编译去掉显示窗口 添加linux版本

    Go:使用golang的leetcode && go练习:rocket:

    走 以下为相关问题记录的目录:(可以复制相关问题关键字... golang shell工具(golang实现的交互式shell,实现一个简易版的交互终端) golang实现一个正向后门(backdoor,基于go的正向后门) golang实现一个反向后

    基于独角兽和梯形失真的汇编语言(X86 / X64)的交互式外壳-Golang开发

    因为rasm2仅支持32/64位操作码到机器代码的转换发布Sna概述基于unicorn的ASM shell目前仅支持x86和x64架构,发布https://github.com/cch123/asm-cli/releases快照X64模式:X86模式:依赖项keystone-engine / ...

    Girsh:自动生成适用于Linux或Windows受害者的完全交互的反向外壳

    Girsh(Golang交互式反向外壳) 谁不厌倦手动键入几行代码即可将反向shell升级为完整的交互式反向shell(tty生成,stty大小...,stty raw-echo)或键入使用的命令。 描述 使用Girsh,只需运行它,它将检测操作系统...

    抱怨:强大的现代CLI和SHELL

    该库提供了一个简单的API,用于创建功能强大的CLI应用程序,并且如果在没有任何命令参数的情况下启动该应用程序,则会自动启动一个集成的交互式Shell 。 提示:我们不保证次要版本(1.x)之间100%向后兼容。 但是...

    Docker CLI-Golang开发

    docker / cli该存储库是Docker CE和Docker EE产品中使用的cli的宿主。 开发docker / cli是使用Docker开发的。 构建Linux二进制文件:$ make -f docker.Makefile binary Build bin ...$ make -f docker.Makefile shell

    Yaegi是另一位优雅的Go口译员-Golang开发

    它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供了动力。 功能完全支持Go规范Yaegi是另一个优雅的Go解释器。 它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供...

    juusprime:用golang编写的Prime Sextuplet Tuplet生成器

    juusprime:用golang编写的Prime Tuplet生成2021年3月: 这是juusprime的软件包代码,juusprime是生成Prime Tuplet(Sextuplets和/或Quintuplet和/或Quadruplet)的引擎。 文件列表中提供了一个pdf文件,其中详细...

    CSV的类似SQL的查询语言-Golang开发

    您还可以通过传递过程或使用交互式Shell在托管事务中顺序执行多个操作。 在多个操作中,您可以使用变量,游标,临时表和其他功能。 功能CSV文件操作选择查询插入查询更新查询替换查询删除查询创建表查询

    只是另一个方案解释器。-Golang开发

    用法#只需运行goscheme进入交互式shell goscheme#运行方案文件goscheme test.scm示例计算第n个斐波那契数; 计算第n个斐波那契数(定义(fib n)(如果(&lt;= n 2)1(+(fib(-n 1))(fib(-n 2)))))...

    gosh:Gosh-用于构建命令外壳程序的可插入框架

    Gosh (或Go shell)是一个使用Go的插件系统创建的框架,用于构建基于控制台的交互式shell程序。 一个gosh shell由执行一个或多个命令的Go插件集合组成。 当gosh启动时,它将在目录./plugins搜索实现命令插件的可用...

    [已弃用]参见https://github.com/src-d/gitbase-Golang开发

    GitQuery安装检查Releases页面...shell启动一个交互式会话。 版本显示版本信息。 例如:$ cd my_git_repo $ gitquery查询'SELECT哈希,author_email,author_name FROM提交限制2;' SELECT散列,author_email,author_

    eZmax-SDK-go:官方eZmax和eZsign Go SDK,用于与REST API进行交互

    用于eZmaxinc / eZmax-SDK-go的Go API客户端该API公开... API版本:1.0.37套件版本:1.0.37构建程序包:org.openapitools.codegen.languages.GoClientCodegen有关更多信息,请访问安装安装以下依赖项: go get github....

    yaegi:Yaegi是另一个优雅的Go解释器

    它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供动力。 产品特点 完全支持 仅使用标准库,以纯Go语言编写 简单的解释器API: New() , Eval&#40;&#41; , Use() 到处都可以工作 可从...

    gocriu:在用户空间中为 Linux 绑定检查点恢复功能。 (http

    Golang CRIU ( ) 这个包不是官方的,只是一个与 rpc/protobuf criu 服务交互的实验包。如何使用这个库首先你需要一个正在运行的 criu 服务器$ sudo criu service -vvv -W criu -o service.log -b -x --address /tmp/...

Global site tag (gtag.js) - Google Analytics