我正在使用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操作系统下运行远程脚本,如何解决它们之间的差距?
答案 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:)