Golang Go语言中调用外部ssh命令自动执行命令

发布于 1周前 作者 nodeper 来自 Go语言

很多太 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

14 回复

Unix 的进程参数是字符串数组,在 shell 中一个字符串命令会经过解析,得到字符串数组后传递。解析逻辑大致是按空格分割,同时处理引号包裹、转义等等。
你这个例子,args 应该是:
-i
/f/Download/new aws.pem
[email protected]
wc -l /home/e.csv

更多关于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 快

xargs -P 100 ? 本身用 go 转了一层再去调 shell 的方式,看起来就很别扭

建议用 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服务器并执行命令:

  1. 安装依赖: 你需要先安装golang.org/x/crypto/ssh包,可以使用以下命令:

    go get golang.org/x/crypto/ssh
    
  2. 编写代码

    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_usernameyour_passwordyour_server:22your_command

回到顶部