我试图通过思科终端/通信服务器连接到思科节点的控制台连接。 为此,我telnet到特定端口上的cisco终端/通信服务器的IP地址,比如说X.X.X.X-端口2068。 当我通过CLI在计算机上执行此操作时,它看起来如下所示:
[user@computer]$ telnet X.X.X.X 2068
Trying X.X.X.X...
Connected to X.X.X.X (X.X.X.X).
Escape character is '^]'.
Username: <user>
Password:
console-cisco-node>
所以通过我电脑上的CLI没问题。 但是当我在我的计算机上运行下面的Python代码时,它似乎不起作用。。。在
^{pr2}$当我运行这个代码时,我只能看到这个,它看起来像'读一些()'因为cisco终端/通信服务器没有任何信息,所以永远等待? [同样适用于tn.全部阅读()]
我通过按CTRL-C停止正在运行的代码
[user@computer]$ ./test.py
Telnet(X.X.X.X,2068): recv '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f'
Telnet(X.X.X.X,2068): IAC WILL 1
Telnet(X.X.X.X,2068): IAC WILL 3
Telnet(X.X.X.X,2068): IAC DO 24
Telnet(X.X.X.X,2068): IAC DO 31
Telnet(X.X.X.X,2068): recv '\xff\xfc\x01'
Telnet(X.X.X.X,2068): IAC WONT 1
Telnet(X.X.X.X,2068): recv '\xff\xfc\x03'
Telnet(X.X.X.X,2068): IAC WONT 3
Telnet(X.X.X.X,2068): recv '\xff\xfe\x18'
Telnet(X.X.X.X,2068): IAC DONT 24
Telnet(X.X.X.X,2068): recv '\xff\xfe\x1f'
Telnet(X.X.X.X,2068): IAC DONT 31
Traceback (most recent call last):
File "./test.py", line 7, in ?
data = tn.read_some()
File "/usr/lib64/python2.4/telnetlib.py", line 345, in read_some
self.fill_rawq()
File "/usr/lib64/python2.4/telnetlib.py", line 521, in fill_rawq
buf = self.sock.recv(50)
keyboardInterrupt
当我改变读一些()'在代码中'田纳西渴望()'或'非常渴望阅读()'或'田纳西懒洋洋的()'或'你很懒()'并再次运行代码,显示如下:
[user@computer]$ ./test.py
variable data is EMPTY
当我将python代码更改为不连接到cisco节点的控制台连接,而是连接到cisco节点的管理连接(正常端口23上的另一个IP地址Y.Y.Y.Y),如下所示,我看到了以下输出:
[user@computer]$ ./test1.py
Telnet(Y.Y.Y.Y,23): recv '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f'
Telnet(Y.Y.Y.Y,23): IAC WILL 1
Telnet(Y.Y.Y.Y,23): IAC WILL 3
Telnet(Y.Y.Y.Y,23): IAC DO 24
Telnet(Y.Y.Y.Y,23): IAC DO 31
Telnet(Y.Y.Y.Y,23): recv '\r\n************************************************'
************************************************
variable data is FILLED !!!
所以我认为Python代码没问题。 只是cisco终端/通信服务器(X.X.X.X)的反应方式与正常情况不同,我认为Python telnetlib很困惑。在
有没有人经历过类似的事情?在
我还与思科(和其他路由器)互动。对于telnet通信,我扩展了telnet类并添加了一个
read
方法,如下所示:所以基本上“问题”是不同的
^{pr2}$read_*
方法没有给出“all”,基本上是因为没有“all”的定义,它将返回它们在“buffer”中拥有的任何内容,或者它们将填充缓冲区,然后返回内容,这取决于您调用的方法。我的方法是“在还有东西要读的时候读(当我读到”“)或者直到它超过timeout
秒时才读。 另外,您应该研究一下read_until
方法的工作原理与expect的基本相同。在看起来2068端口上没有真正的telnet协议。从telnet man连接到非标准端口时, telnet省略telnet选项的任何自动启动。什么时候? 端口号前面有一个减号,即 选项协商完成。。但是telnetlib假设如果你使用它,你需要一个telnet协议。正如您所说的,在连接上使用wireshark并不容易,您可以尝试使用CLI telnet到端口-2068来验证您是否遇到了与telnetlib相同的问题。在
是否可以选择使用一个简单的套接字?在
我找到了另一种方法(多亏了Serge Ballesta)
在我的例子中,telnetlib对象是不可能的,所以我不得不使用socket对象通过cisco终端/comm服务器连接到cisco节点的控制台连接。 下面是原始的基本代码,它让我有可能开始编写我需要的程序。在
相关问题 更多 >
编程相关推荐