golang轻量级SSH命令分发工具插件库grapes的使用

Golang轻量级SSH命令分发工具插件库grapes的使用

概述

grapes是一个轻量级工具,旨在轻松通过SSH分发命令。

安全更新(2019/04/25)

现已进行握手验证以修复CVE-2017-3204,验证将默认使用内置的指纹列表~/.ssh/known_hosts

要将SSH服务器指纹添加到known_hosts,请运行以下命令:

$ ssh-keyscan -H YOURHOST.COM >> ~/.ssh/known_hosts

Docker运行方式

docker run -v ~/.grapes.yml:/root/.grapes.yml -v ~/.ssh/id_rsa:/root/.ssh/id_rsa -it docker.pkg.github.com/yaronsumel/grapes/grapes:0.3.0

安装

运行以下命令(Golang v1.10+版本):

$ export GO111MODULE=on; go get -u github.com/yaronsumel/grapes

使用方法

示例:

$ grapes -c config.yml -i ~/.ssh/id_rsa -s prod -cmd whats_up --async

使用--help标志查看完整使用说明。

配置文件

配置文件结构(YAML格式):

version: 1
servers:
 prod :
     - name : "prod server #1"
       host : "prod.example.com:22"
       user : "ubuntu"
 staging :
     - name : "staging server #1"
       host : "staging.example.com:22"
       user : "ubuntu"
     - name : "staging server #2"
       host : "staging.example.com:23"
       user : "ubuntu"
commands:
 whats_up :
     - "ls -al /tmp"
     - "date"
 date :
     - "date"

完整示例代码

package main

import (
	"github.com/yaronsumel/grapes"
	"log"
)

func main() {
	// 初始化grapes客户端
	client := grapes.NewClient()
	
	// 加载配置文件
	err := client.LoadConfig("config.yml")
	if err != nil {
		log.Fatal(err)
	}
	
	// 设置SSH私钥路径
	client.SetPrivateKeyPath("~/.ssh/id_rsa")
	
	// 执行命令
	results, err := client.Run("prod", "whats_up", true) // 最后一个参数表示是否异步执行
	if err != nil {
		log.Fatal(err)
	}
	
	// 打印结果
	for server, output := range results {
		log.Printf("Server: %s\nOutput:\n%s\n", server, output)
	}
}

维护者

由YaronSumel编写和维护


更多关于golang轻量级SSH命令分发工具插件库grapes的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级SSH命令分发工具插件库grapes的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Grapes - Go语言轻量级SSH命令分发工具

Grapes是一个用Go语言编写的轻量级SSH命令分发工具插件库,它允许你轻松地在多台服务器上并行执行命令。下面我将详细介绍如何使用Grapes。

安装Grapes

首先,你需要安装Grapes库:

go get github.com/yaronsumel/grapes

基本使用示例

package main

import (
	"fmt"
	"github.com/yaronsumel/grapes"
)

func main() {
	// 创建新的Grapes实例
	g := grapes.New()

	// 添加主机
	g.AddHost("user@host1:22", "password")
	g.AddHost("user@host2:22", "password")
	g.AddHost("user@host3:22", "password")

	// 执行命令
	results, err := g.Run("uname -a")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	// 打印结果
	for host, result := range results {
		fmt.Printf("Host: %s\nOutput:\n%s\nError: %v\n\n", 
			host, result.Output, result.Error)
	}
}

高级功能

1. 使用SSH密钥认证

g.AddHostWithKey("user@host:22", "/path/to/private/key")

2. 设置并发限制

g.SetConcurrency(10) // 限制同时执行的SSH连接数为10

3. 超时设置

g.SetTimeout(30) // 设置超时为30秒

4. 自定义输出处理器

g.SetOutputHandler(func(host, output string) {
	fmt.Printf("[%s] %s\n", host, output)
})

完整示例

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/yaronsumel/grapes"
)

func main() {
	// 初始化
	g := grapes.New()
	g.SetConcurrency(5)
	g.SetTimeout(15)

	// 添加主机
	hosts := []struct {
		addr     string
		auth     string
		useKey   bool
	}{
		{"user@web1.example.com:22", "password123", false},
		{"user@web2.example.com:22", "/home/user/.ssh/id_rsa", true},
		{"user@db1.example.com:22", "dbpassword", false},
	}

	for _, h := range hosts {
		if h.useKey {
			g.AddHostWithKey(h.addr, h.auth)
		} else {
			g.AddHost(h.addr, h.auth)
		}
	}

	// 执行命令
	cmd := "df -h"
	fmt.Printf("Executing command: %s\n", cmd)

	results, err := g.Run(cmd)
	if err != nil {
		log.Fatalf("Failed to execute command: %v", err)
	}

	// 处理结果
	for host, result := range results {
		fmt.Printf("\n=== %s ===\n", host)
		if result.Error != nil {
			fmt.Printf("Error: %v\n", result.Error)
		} else {
			fmt.Println(result.Output)
		}
	}
}

最佳实践

  1. 错误处理:总是检查Run()返回的错误和每个主机的错误结果
  2. 并发控制:根据目标主机数量和网络条件调整并发数
  3. 超时设置:为长时间运行的命令设置合理的超时
  4. 敏感信息:避免在代码中硬编码密码,考虑使用环境变量或配置文件
  5. 日志记录:实现自定义输出处理器来记录执行结果

性能考虑

  • Grapes使用Go协程实现并行执行,非常高效
  • 默认并发无限制,但建议根据网络条件和目标主机数量设置合理的并发数
  • SSH连接复用可以提高性能

Grapes是一个简单但功能强大的工具,特别适合需要在多台服务器上执行相同命令的场景。它的轻量级设计使得它可以很容易地集成到更大的自动化系统中。

回到顶部