从SSH输出异步读取

时间:2015-10-14 04:03:32

标签: asynchronous ssh go io

我想编写一个接受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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题