我正在尝试从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为空后冻结。