我使用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。读卡器将字节拖到该分隔符。设置一个截止日期,以防服务器没有响应。
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]