Golang Go语言中调用外部ssh命令自动执行命令
很多太 ec2 机器 想通过 go 实现快速执行命令
搞了好久了 没成功
原始命令为 ssh -i '/f/Download/new aws.pem' [email protected] 'wc -l /home/e.csv'
package main
import (
“fmt”
“os/exec”
)
func main() {
args := []string{"-i ‘/f/Download/new aws.pem’ [email protected]",“wc -l /home/e.csv”}
cmd := exec.Command(“ssh”,args…)
ret,err := cmd.Output()
if err != nil {
fmt.Printf("\nerr:%v\n", err)
}
fmt.Printf("%v\n",ret)
}
Golang Go语言中调用外部ssh命令自动执行命令
更多关于Golang Go语言中调用外部ssh命令自动执行命令的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
args := []string{"-i", “/f/Download/new aws.pem”, “[email protected]”, “wc -l /home/e.csv”}
另外,如果只是想并行执行,还不如直接用 GNU parallel
看起来是 wc 那句直接被当成 ssh 的参数送进去了,根本没解析
ansible 了解一下朋友
为啥不直接用 shell ?
cat ec2_ip_list | xargs -i ssh -i ‘/f/Download/new aws.pem’ ec2-user@{} wc -l /home/e.csv
接下来还要做复杂一点的动作
你这样做顺序执行 没有 goroutine 快
建议用 ssh 库,我做过一样的东西,直接调用命令的话,ssh 进程多了会完全卡死
你这原始命令并不是一个单一命令啊, 直接当成参数肯定不行的,得用 pipe 管道组合下
偷懒也可以直接命令全放到 shell 文件里执行 shell
1 楼的解释是对的。
这种工作不适合用编译型语言跑,我的习惯是编译型语言不应该有这种不可控的依赖(外部的 ssh )。
我自己喜欢用 python 的 asyncssh 写脚本跑。
在用 python 的 asyncio 前,是用线程池跑 fabric (不喜欢 ansible )。
我同事喜欢用 https://github.com/ParallelSSH/parallel-ssh
你需要使用 golang.org/x/crypto/ssh 库,这个可以实现你需要的功能,建议配合 github.com/spf13/viper 库来加载配置文件,配置文件可以使用 toml 格式,将 ssh 认证信息及需要被执行的命令,灵活的传递。
在Golang中调用外部SSH命令以自动执行远程命令,通常我们会使用golang.org/x/crypto/ssh
这个包。这个包提供了强大的功能来与SSH服务器进行交互。
以下是一个简单的示例,展示如何使用该包连接到SSH服务器并执行命令:
-
安装依赖: 你需要先安装
golang.org/x/crypto/ssh
包,可以使用以下命令:go get golang.org/x/crypto/ssh
-
编写代码:
package main import ( "fmt" "golang.org/x/crypto/ssh" "io/ioutil" "log" "os" ) func main() { config := &ssh.ClientConfig{ User: "your_username", Auth: []ssh.AuthMethod{ ssh.Password("your_password"), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } conn, err := ssh.Dial("tcp", "your_server:22", config) if err != nil { log.Fatalf("Failed to dial: %s", err) } defer conn.Close() session, err := conn.NewSession() if err != nil { log.Fatalf("Failed to create session: %s", err) } defer session.Close() output, err := session.CombinedOutput("your_command") if err != nil { log.Fatalf("Failed to run: %s", err) } fmt.Println(string(output)) }
这段代码展示了如何设置SSH客户端配置,连接到SSH服务器,并执行远程命令。请根据你的实际情况替换your_username
、your_password
、your_server:22
和your_command
。