Golang:运行远程脚本的ssh:没有这样的文件或目录

时间:2016-12-02 08:17:38

标签: linux go ssh

我正在使用ssh模块在远程计算机上运行shell脚本:

// ssh-run.go
package main
import (
    "bytes"
    "flag"
    "fmt"
    "log"
    "time"

    "golang.org/x/crypto/ssh"
)

var (
    flagUser = flag.String("user", "", "")
    flagPwd = flag.String("pwd", "", "")
    flagHost = flag.String("host", "", "")
    flagCmd = flag.String("cmd", "", "")
)

func main() {
    flag.Parse()
    log.SetFlags(log.Lshortfile | log.LstdFlags)

    cfg := ssh.ClientConfig {
        User: *flagUser,
        Auth: []ssh.AuthMethod(ssh.Password(*flagPwd)),
    }

    // skip err checking for short code
    conn, _ := ssh.Dial("tcp", fmt.Sprintf("%s:22", *flagHost), &cfg)
    defer conn.Close()
    ss, _ := conn.NewSession()
    defer ss.Close()

    var out bytes.Buffer
    ss.Stdout = &out
    ss.Stderr = &out
    ss.Run(*flagCmd)
    fmt.Printf("err: %v, out: %v\n", err, out.String())
}

在远程Centos服务器上运行sshd,我在主路径下放了一个简单的Ping脚本,然后运行演示:

go run ssh-run.go -cmd "/bin/bash /home/me/try_ping.sh" -host 172.17.0.2 -pwd 123456 -user me

我收到了错误:

err: Process exited with status 127, out: /bin/bash: /home/me/try_ping.sh: No such file or directory

但是当远程服务器是Ubuntu服务器时,Ping脚本运行良好。

面向远程脚本运行时Centos和Ubuntu有什么区别?我需要在许多类UNIX操作系统下运行远程脚本,如何解决它们之间的差距?

1 个答案:

答案 0 :(得分:1)

我说理由。通常,当我们需要通过SSH将长命令传递给远程服务器时,比如sh /path/to/script.sh,我们可以通过它运行它(单引号也可以):

ssh user@1.2.3.4 "sh /path/to/script.sh"

这里,我们使用双引号来禁用shell参数拆分。

虽然在我真正的golang代码中(上面的代码是从我的项目中删除并使用标志进行测试。),我也使用双引号,golang SSH包也将双引号发送到远程SSH服务器,然后远程SSH不知道如何找到以双引号为前缀的文件。

惹恼的是,错误信息不带双引号,让我对双引号视而不见。

谢谢@JimB:)