我正在使用Go连接到随机端口。假设它是22,因为这是一个很好的例子。一些端口带有横幅,而有些则没有。
我试图连接到端口后立即显示横幅。在这种情况下,为SSH-2.0-OpenSSH_7.9
,但是下面的代码并没有真正给我任何东西,也没有错误。
我正在尝试找出我在哪里出了问题。
banner := make([]byte, 0, 256)
connStr := net.JoinHostPort(host, port);
dialer := net.Dialer{Timeout: 3 * time.Second}
conn, err := dialer.Dial("tcp", connStr)
if err != nil {
io.WriteString(w,err.Error())
} else {
n, err := conn.Read(banner);
if err != nil {
log.Println(w, "read error: %v", err)
}
log.Println(string(banner))
io.WriteString(w, "Connected to " + connStr + ". " + string(n) + " byte output:" + string(banner))
defer conn.Close()
}
对我在这里做错的任何想法吗?还是我必须发送一些东西才能得到横幅?
最佳答案
答案取决于横幅是什么。
如果标题由可区分的字节分隔,请使用bufio.Reader将字节插入该分隔符。设置期限,以防服务器不响应。
conn, err := dialer.Dial("tcp", connStr)
if err != nil {
// handle error
}
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(time.Second))
br := bufio.NewReader(conn)
banner, err := bf.ReadBytes(delim)
if err != nil {
// handle error
}
如果横幅没有以某种方式分隔,请阅读直到超时:
conn, err := dialer.Dial("tcp", connStr)
if err != nil {
// handle error
}
defer conn.Close()
// Read for one second or until 256 bytes are read.
conn.SetReadDeadline(time.Now().Add(time.Second))
banner := make([]byte, 256)
n, err := io.ReadFull(banner)
banner = banner[:n]
关于go - 如何使用conn.read()读取横幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58807520/