我不知道这是否是被调用程序的问题,如果问题是由的方式造成我称之为程序。正因为如此,我开始在源代码。
我需要从程序中调用SSH(如果你有兴趣的原因,我将提及他们下面),但SSH默默退出。
当我打电话ssh -v user@remotehost
从shell中成功:
但是,当我做同样的从我的计划之内(myssh -v user@remotehost
只出现这种情况:
既不在stderr调试输出被示我也不到达远程主机壳。
这是我的源代码:
package main
import (
"fmt"
"log"
"os"
"os/exec"
)
func main() {
params := os.Args[1:]
fmt.Printf("passing this to ssh: %s\n", params)
cmd := exec.Command("ssh", params...)
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
}
我之所以写这样的代码:我使用Ansible这就要求SSH。我需要“操纵”是Ansible传递到SSH参数。到目前为止,我还询问了OpenSSH和Ansible邮件列表,有在OpenSSH和Ansible没有办法更改参数(对其他人而言,是的,但不是那些我需要)。我和我想要实现的最好的建议是,以Ansible提供替代SSH命令,用它来接收和修改参数,并把它们交给真正的SSH。
你捕获来自Stdout
Stderr
和cmd
?这是命令的各自的输出被发送到。对于exec.Command文档对此有一个很好的例子。
在你的情况,你还需要设置Stdin
这样就可以例如通过密码。
以下是根据您的代码很基本的例子:
package main
import (
"bytes"
"fmt"
"log"
"os"
"os/exec"
)
func main() {
params := os.Args[1:]
fmt.Println("Passing this to ssh: %s", params)
var stdin bytes.Buffer
var stdout bytes.Buffer
var stderr bytes.Bufer
cmd := exec.Command("ssh", params...)
cmd.Stdin = &stdin
cmd.Stdout = &stdout
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
fmt.Println("Stdout: %s", stdout.String())
fmt.Println("stderr: %s", stderr.String())
}
由于qazxsw POI,qazxsw POI和POI qazxsw都是stdin
s,你可以阅读和写他们就像任何其他的缓冲区。
您可能还需要考虑使用stdout
包,它提供了围棋,而不是使用子流程本地SSH接口。