从输出

时间:2017-08-09 05:59:09

标签: go ssh

我正在尝试使用Go语言开发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% /

1 个答案:

答案 0 :(得分:1)

上面的<nil>session.Run的输出,返回error(根据docs)。

该命令的输出已由以下goroutine显示在控制台上:

go io.Copy(os.Stdout, stdout)

您不需要打印output nil,因为session.Run呼叫完成时不会发生错误。最好的办法是检查错误:

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