我正在使用 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/