如果通过os.exec运行调用程序失败

问题描述 投票:0回答:1

我不知道这是否是被调用程序的问题,如果问题是由的方式造成我称之为程序。正因为如此,我开始在源代码。

我需要从程序中调用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。

go openssh
1个回答
1
投票

你捕获来自Stdout Stderrcmd?这是命令的各自的输出被发送到。对于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都是stdins,你可以阅读和写他们就像任何其他的缓冲区。

您可能还需要考虑使用stdout包,它提供了围棋,而不是使用子流程本地SSH接口。

© www.soinside.com 2019 - 2024. All rights reserved.