我想编写一个接受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()
之后,它也会间歇性地打印相应的输出。为什么会这样?有没有更好的方法来返回函数输出(通道,也许?)?谢谢!
答案 0 :(得分:0)
问题是我在我的函数中有以下代码:
if session != nil {
defer session.Close()
}
这样,输出只会在命令完成时打印,并在函数返回之前发送回stdout(这很少见)。我只是通过删除这些行来修复我的代码。