2015-10-14 47 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() 
} 

這樣一來,如果命令完成輸出將只打印並送回其標準輸出函數返回前(這是罕見的) 。我通過刪除這些行來修復我的代碼。