从SSH输出异步读取
问题描述:
我想写一个函数,它需要一个SSH会话并运行一个命令,并提供一个io.Reader
,它会在接收到输出时读取它的输出。从SSH输出异步读取
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()
后。为什么会这样呢?有没有更好的方法来返回函数输出(通道,也许?)?谢谢!
答
问题是,我在我的函数如下代码:
if session != nil {
defer session.Close()
}
这样一来,如果命令完成输出将只打印并送回其标准输出函数返回前(这是罕见的) 。我通过删除这些行来修复我的代码。
你是什么意思,它只是间歇打印适当的输出? ReadAll返回错误吗? (这段代码也不能编译,你使用的是不同的东西?) – JimB
上面的代码修复了错误。我正在使用不同的东西,但我确信这些变化并不是我所拥有的问题的基础。我的意思是,有时它运行时会打印命令的输出,而其他时间则什么也不打印。再次感谢! – Langston