linux - 戈朗 : ssh running remote scripts: No such file or directory

标签 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 操作系统下运行远程脚本,如何解决它们之间的差距?

最佳答案

我去的原因。通常,当我们需要通过 SSH 向远程服务器传递一个长命令时,比如 sh/path/to/script.sh,我们可以通过(单引号也可以)运行它:

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

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

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

烦人的是,错误信息没有带双引号,双引号让我瞎了眼。

谢谢@JimB :)

关于linux - 戈朗 : ssh running remote scripts: No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927577/

相关文章:

linux - 在 NodeJS 进程中创建 bash 包装器

linux - grep 匹配后的词 + 制表符

go - 在 GoLang 中生成 CosmosDB 身份验证 token

go - 在 Golang 中写入缓冲区的开头?

python - Paramiko:从远程执行命令的标准输出中读取

linux - 什么可以覆盖 Linux 目录的组权限?

Linux:弱链接整个库,如 OS X ld -weak-lfoo

go - 如何在 golang 中原子存储和加载接口(interface)?

linux - 更改默认端口(22) SSh [CENTOS]

linux - NET::SSH2 带 sudo