我正在尝试创建一种工具,以通过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(),不确定。
在这种情况下,将感谢一个有效的示例或有关如何捕获和处理响应数据的说明。
您从连接中读取操作在哪里?我认为您需要调用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
谢谢大家,他们抽出时间来回答我的问题。我设法找出问题所在:
每次创建读取缓冲区时,缓冲区都太大(1024字节),因此程序正在等待它填满。现在,我正在使用循环读取1字节缓冲区。
看来,我还需要一些准则来使函数停止读取并继续发送命令。
这里是有效的代码段:
// 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, ">"))
}