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)
}
}
}
最佳实践
- 错误处理:总是检查Run()返回的错误和每个主机的错误结果
- 并发控制:根据目标主机数量和网络条件调整并发数
- 超时设置:为长时间运行的命令设置合理的超时
- 敏感信息:避免在代码中硬编码密码,考虑使用环境变量或配置文件
- 日志记录:实现自定义输出处理器来记录执行结果
性能考虑
- Grapes使用Go协程实现并行执行,非常高效
- 默认并发无限制,但建议根据网络条件和目标主机数量设置合理的并发数
- SSH连接复用可以提高性能
Grapes是一个简单但功能强大的工具,特别适合需要在多台服务器上执行相同命令的场景。它的轻量级设计使得它可以很容易地集成到更大的自动化系统中。