如何从Telnet会话中读取数据

问题描述 投票:1回答:2

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

到目前为止,我设法创建了一个连接并发送带有如下内容的命令:

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(),不确定。

在这种情况下,将感谢一个有效的示例或有关如何捕获和处理响应数据的说明。

go telnet
2个回答
0
投票

您从连接中读取操作在哪里?我认为您需要调用conn.read(buffer)从连接中读取并将其写入到缓冲区中

https://godoc.org/github.com/reiver/go-telnet#Conn.Read

示例对您使用的hte包没有太大帮助。可能是以下示例从不同的telnet go软件包中取出来会更有用。

https://github.com/ziutek/telnet/blob/master/examples/unix-cisco/main.go

0
投票

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

  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, ">"))
}
© www.soinside.com 2019 - 2024. All rights reserved.