go - 如何使用conn.read()读取横幅

标签 go

我正在使用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/

相关文章:

go - golang 1.18 中逆变类型如何与泛型一起工作?

json - 我们如何使用 Go 编程语言读取 JSON 文件?

reflection - 我如何编写一个函数来处理不同的类型

sockets - 如何在 TLS 监听器中验证对等证书

Goroutines 选择范围循环

go - sqlx 的结构嵌​​入不从数据库返回值

go - 消除类型转换中的重复代码

go - 如何在 atom.io 下运行我的 golang 主包?

golang 开关出现 ` used as value` 错误?

go - 尽管在启动应用程序时是私有(private)的,但如何从主包调用 main() 函数?