2017-08-09 33 views
0

我正在尝试使用Go语言开发SSH客户端。我写了下面的代码来获取用户的命令,在远程服务器上执行它们并打印响应。从输出中排除SSH命令执行状态

下面的代码存在一个小问题。在屏幕上打印输出将在响应结束时打印命令执行状态(零/错误状态)。我如何从输出中排除这个?

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的输出,它返回error(根据docs)。

go io.Copy(os.Stdout, stdout) 

你并不需要,因为没有出现错误,打印output,这是nilsession.Run是调用完成:

命令的输出已经由以下够程控制台上显示。更好的事情是检查错误:

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

谢谢,这个工程。 :) – Beginner