目标:golang 服务,准备获取ip:port的banner信息.
如果ip:port为http,即可获取http响应,如果为ssh服务,即可获取ssh服务输出信息.如版本信息等.
前置条件:对应tcpAddr可以访问(该http服务输出helloworld)
问题:通过代码
conn, err := net.DialTimeout("tcp", tcpAddr.String(),timeout)
if err != nil {
return false
}
reply := make([]byte, 4096)
conn.Read(reply)
conn.SetReadDeadline(time.Now().Add(time.Second))
byte, err := ioutil.ReadAll(conn)
fmt.Println("srv reply:" + string(byte))
defer conn.Close()
发现线程阻塞到read上.
请问如何避免这种阻塞,并能获取到对应endpoint banner信息?
追加:如果先SetReadDeadline,会在超时后解除阻塞.但获取到的reply为空.
假定你要做一个 SSH 与 HTTP 的服务扫描器,那你可能没有发现 SSH 与 HTTP 服务对于客户端的区别。
对 SSH 服务来说,客户端完成 TCP 连接后,就会收到服务器发送的 banner 信息,类似这样的
但是 HTTP 服务器不一样,客户端完成 TCP 连接后,必须发送一个请求,如
服务器才会返回内容,如
下面是参考代码
运行结果