从 SSH 输出异步读取

我想编写一个接受 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.ReadAllon测试此代码output时,它只会间歇性地打印适当的输出,即使在调用session.Wait(). 为什么会这样?有没有更好的方法来返回函数输出(可能是通道?)?谢谢!


噜噜哒
浏览 211回答 1
1回答

暮色呼如

问题是我的函数中有以下代码:if session != nil {    defer session.Close()}这样,输出只会在命令完成并在函数返回之前发回其标准输出时打印(这种情况很少见)。我通过删除这些行来修复我的代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go