从stdout读取永远不会返回golang

时间:2018-05-09 17:25:53

标签: go

我正在尝试从SSH连接的stdoutpipe中读取。当缓冲区中有数据时,我能够读取它,但是当它在空白后尝试读取时,读取会挂起。

有没有办法在读取之前检查缓冲区中是否有数据?或者完全是在这里发生了什么?

我做了一个快速的例子来展示我所看到的内容。

package main

import (
    "fmt"
    "strconv"

    "golang.org/x/crypto/ssh"
)

func main() {
    var user = "<user>"
    var passwd = "<password>"
    var ip = "<ip>"

    sshConfig := &ssh.ClientConfig{
        User:            user,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Auth: []ssh.AuthMethod{
            ssh.Password(passwd),
        },
    }

    var conn, _ = ssh.Dial("tcp", ip + ":22", sshConfig)

    var sess, _ = conn.NewSession()

    var stdin, _ = sess.StdinPipe()
    var stdout, _ = sess.StdoutPipe()
    sess.Shell()

    stdin.Write([]byte("ls\n"))

    var numBytes = 1
    var readCount = 0

    for numBytes > 0 {
        fmt.Println("Read count: " + strconv.Itoa(readCount))
        var recvData = make([]byte, 1024)
        numBytes, _ = stdout.Read(recvData)
        fmt.Println(string(recvData[:numBytes]))
        readCount++
    }
}

您需要更新用户,密码和IP变量,但之后您应该看到程序在stdout为空后冻结。

0 个答案:

没有答案