go - 如何从 Telnet session 读取数据

标签 go telnet

我正在尝试创建一个工具来通过 Telnet 连接到网络设备并使用 go-telnet 发送一些命令(与某些附加要求类似) 。

到目前为止,我设法创建连接并发送如下命令:

func main() {
    var loginBuffer = [6]byte{'r', 'o', 'o', 't', '\r', '\n'}
    var login = loginBuffer[:]

    conn, err := telnet.DialTo("10.10.10.2:23")
    if nil != err {
        fmt.Println(err)
    }
    defer conn.Close()

    conn.Write(login)
}

使用 Wireshark 我可以看到设备响应,但无法读取任何响应数据。我猜我使用 Read() 的方式是错误的,不确定。

希望有一个工作示例或解释如何在这种情况下捕获和处理响应数据。

最佳答案

感谢大家抽出时间回答我的问题。我设法找出问题所在:

  1. 每次我创建读取缓冲区时,它都太大(1024 字节),因此程序正在等待它填满。现在我正在使用循环读取 1 字节缓冲区。

  2. 看来,我还需要一些标准来让函数停止读取并继续发送命令。

这是工作代码:

// Thin function reads from Telnet session. "expect" is a string I use as signal to stop reading
func ReaderTelnet(conn *telnet.Conn, expect string) (out string) {
    var buffer [1]byte
    recvData := buffer[:]
    var n int
    var err error

    for {
        n, err = conn.Read(recvData)
        fmt.Println("Bytes: ", n, "Data: ", recvData, string(recvData))
        if n <= 0 || err != nil || strings.Contains(out, expect) {
            break
        } else {
            out += string(recvData)
        }
    }
    return out
}

//convert a command to bytes, and send to Telnet connection followed by '\r\n' 
func SenderTelnet(conn *telnet.Conn, command string) {
    var commandBuffer []byte
    for _, char := range command {
        commandBuffer = append(commandBuffer, byte(char))
    }

    var crlfBuffer [2]byte = [2]byte{'\r', '\n'}
    crlf := crlfBuffer[:]

    fmt.Println(commandBuffer)

    conn.Write(commandBuffer)
    conn.Write(crlf)
}

func main() {
    conn, err := telnet.DialTo("10.10.10.2:23")
    if nil != err {
        fmt.Println(err)
    }

    fmt.Print(ReaderTelnet(conn, "Login"))
    SenderTelnet(conn, "root")
    fmt.Print(ReaderTelnet(conn, "Password"))
    SenderTelnet(conn, "root")
    fmt.Print(ReaderTelnet(conn, ">"))
}

关于go - 如何从 Telnet session 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59117025/

相关文章:

linux - 无法远程登录到本地主机

smtp - 使用 telnet 发送邮件,地址为 '@' 为空

java - Java telnet连接以请求新的tor身份

go - 如何处理可以无阻塞增长的队列

使用套接字的java简单telnet客户端

shell - adb shell 直接命令在 telnet 上不起作用

go - 函数结束后,golang没有释放变量

go - 转换表格json字符串后如何打印数组

rest - 如何使用 Gin-Gonic 在 Go 中读取 snake case JSON 请求体

docker - 使用 Golang 从 Docker 连接到 Snowflake 数据库时出现错误 "x509: certificate signed by unknown authority"