【问题标题】:Asynchronously Reading From SSH Output从 SSH 输出异步读取
【发布时间】:2015-10-14 04:03:31
【问题描述】:

我想编写一个函数,它接受一个 SSH 会话并运行一个命令,提供一个 io.Reader,它会在收到它的输出时读取它。

package main

import (
    "golang.org/x/crypto/ssh"
    "io"
)

func StreamOutput(session *ssh.Session, command string) (output io.Reader, err error) {
    if session != nil {
        defer session.Close()
    }
    if err != nil {
        return output, err
    }
    // connect to both outputs
    outReader, err := session.StdoutPipe()
    if err != nil {
        return output, err
    }
    errReader, err := session.StderrPipe()
    if err != nil {
        return output, err
    }
    output = io.MultiReader(outReader, errReader)
    err = session.Start(command)
    // return the readers that are to be read from
    return output, err

但是,当我在 output 上使用 ioutil.ReadAll 测试此代码时,即使在调用 session.Wait() 之后,它也只会间歇性地打印适当的输出。为什么会这样?有没有更好的方法来返回函数输出(也许是通道?)?谢谢!

【问题讨论】:

  • 它只是间歇性地打印适当的输出是什么意思? ReadAll 是否返回错误? (这段代码也编译不了,你是不是用了别的东西?)
  • 上面的代码修复了这个错误。我正在使用不同的东西,但我确信这些变化对我的问题并不重要。我的意思是,有时它在运行时会打印命令的输出,而其他时候什么也不打印。再次感谢!

标签: asynchronous ssh go io


【解决方案1】:

问题是我的函数中有以下代码:

if session != nil {
    defer session.Close()
}

这样,只有在命令完成并在函数返回之前将其标准输出发送回(这种情况很少见)时,才会打印输出。我只是通过删除这些行来修复我的代码。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多