2017-08-09 14 views
0

私はGo言語を使用してSSHクライアントを開発しようとしています。以下のコードを書いて、ユーザーからコマンドを取得し、リモートサーバーでコマンドを実行し、レスポンスを出力します。出力からSSHコマンドの実行ステータスを除外します

次のコードには小さな問題があります。画面の出力結果は、応答の最後にコマンドの実行状況(nil/error status)を表示します。これを私の出力からどのように除外するのですか?

SSH.go

package main 

import "fmt" 
import "io" 
import "bufio" 
import "os" 
import "net" 
import "golang.org/x/crypto/ssh" 

func main(){ 

    sshConfig := &ssh.ClientConfig{ 
     User: "[USERNAME]", 
     Auth: []ssh.AuthMethod{ 
      ssh.Password("[PASSWORD]"), 
     }, 
     HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { 
      return nil 
     }, 
    } 

    connection,err := ssh.Dial("tcp", "[IP]:[PORT]", sshConfig) 
    if err != nil { 
     fmt.Println("Failed to connect: %s", err) 
    } 

    reader := bufio.NewReader(os.Stdin) 

    for{ 
     input, _ := reader.ReadString('\n') 
     session,err := connection.NewSession() 
     if err != nil { 
      fmt.Println("Failed to create session: %s", err) 
     } 
     stdout,err := session.StdoutPipe() 
     if err != nil { 
      fmt.Println("Failed to get stdout: %s", err) 
     } 
     go io.Copy(os.Stdout, stdout) 
     output := session.Run(input); 
     fmt.Println(output) 
    } 

} 

現在の結果

hello 
Process exited with status 127 
df -hP /tmp 
Filesystem  Size Used Avail Use% Mounted on 
/dev/sda6  198G 13G 176G 7%/
<nil> 

期待される結果

hello 
df -hP /tmp 
Filesystem  Size Used Avail Use% Mounted on 
/dev/sda6  198G 13G 176G 7%/
+0

多分stderrを '/ dev/null'にリダイレクトするべきでしょうか? – armnotstrong

+0

@armnotstrong - その構文は何ですか? – Beginner

+0

@Beginner「stderrを '/ dev/null'にリダイレクトすればgoogleになる? – zerkms

答えて

1

<nil>の出力はsession.Runの出力で、errordocs)を返します。

コマンドの出力は、すでに以下のゴルーチンしてコンソールに表示されている:

go io.Copy(os.Stdout, stdout) 

session.Runが通話完了したときにエラーが発生しないので、あなたはnilあるoutputを、印刷する必要はありません。 。

// ... 
if err := session.Run(input); err != nil { 
    // handle error 
} 
// ... 
+0

ありがとう、これは動作します。 :) – Beginner

関連する問題