2015-10-14 50 views
2

我想写一个函数,它需要一个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()后。为什么会这样呢?有没有更好的方法来返回函数输出(通道,也许?)?谢谢!

+0

你是什么意思,它只是间歇打印适当的输出? ReadAll返回错误吗? (这段代码也不能编译,你使用的是不同的东西?) – JimB

+0

上面的代码修复了错误。我正在使用不同的东西,但我确信这些变化并不是我所拥有的问题的基础。我的意思是,有时它运行时会打印命令的输出,而其他时间则什么也不打印。再次感谢! – Langston

回答

0

问题是,我在我的函数如下代码:

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

这样一来,如果命令完成输出将只打印并送回其标准输出函数返回前(这是罕见的) 。我通过删除这些行来修复我的代码。