Python telnetlib和控制台连接cisco nod

2024-05-14 19:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过思科终端/通信服务器连接到思科节点的控制台连接。 为此,我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很困惑。在

有没有人经历过类似的事情?在


Tags: 代码py服务器终端dowillciscocomputer
3条回答

我还与思科(和其他路由器)互动。对于telnet通信,我扩展了telnet类并添加了一个read方法,如下所示:

 def read(self, timeout):
    s = time.time()
    resp = ""
    while True:
        res = self.read_eager()
        if not res and resp:
            return resp
        resp += res
        if time.time() - s >= timeout:
            return resp
        time.sleep(0.001)

所以基本上“问题”是不同的read_*方法没有给出“all”,基本上是因为没有“all”的定义,它将返回它们在“buffer”中拥有的任何内容,或者它们将填充缓冲区,然后返回内容,这取决于您调用的方法。我的方法是“在还有东西要读的时候读(当我读到”“)或者直到它超过timeout秒时才读。 另外,您应该研究一下read_until方法的工作原理与expect的基本相同。在

^{pr2}$

看起来2068端口上没有真正的telnet协议。从telnet man连接到非标准端口时, telnet省略telnet选项的任何自动启动。什么时候? 端口号前面有一个减号,即 选项协商完成。。但是telnetlib假设如果你使用它,你需要一个telnet协议。正如您所说的,在连接上使用wireshark并不容易,您可以尝试使用CLI telnet到端口-2068来验证您是否遇到了与telnetlib相同的问题。在

是否可以选择使用一个简单的套接字?在

s = socket.create_connection(('X.X.X.X', 2068))
data = s.recv(1024)
...

我找到了另一种方法(多亏了Serge Ballesta

在我的例子中,telnetlib对象是不可能的,所以我不得不使用socket对象通过cisco终端/comm服务器连接到cisco节点的控制台连接。 下面是原始的基本代码,它让我有可能开始编写我需要的程序。在

#! /usr/bin/env python

import socket
import time

try:
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect(("X.X.X.X",2068))
   data1 = s.recv(1024)
   #
   # when the connection with the server is made the server sends some (IAC) commands
   #
   #    '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f'
   #
   # as far as I know this means the following:
   #
   #     IAC WILL ECHO
   #     IAC WILL SUPRESS GO AHEAD
   #     IAC DO   TERMINAL TYPE
   #     IAC DO   WINDOW SIZE
   #
   # WILL means the server wants to use the indicated facility if the client has the possibilty to use this facility
   # (client can reply with DO or DONT)
   #
   # DO means the server has the possibility for the indicated facility and asks the client if he wants to use this facility
   # (client can reply with WILL or WONT)
   #
   #
   # PS.
   #      WILL = xFB = 251
   #      WONT = xFC = 252
   #      DO   = xFD = 253
   #      DONT = xFE = 254
   #
   #
   #
   # Python is going to answer as follwos:
   #
   #     IAC DONT ECHO
   #     IAC DO   SUPRESS GO AHEAD
   #     IAC WONT TERMINAL TYPE
   #     IAC WONT WINDOW SIZE
   #

   s.sendall('\xff\xfe\x01\xff\xfd\x03\xff\xfc\x18\xff\xfc\x1f')

   data2 = s.recv(1024) # server sends '\xff\xfc\x01' = IAC WONT ECHO as a reply back

   # send an enter to make the hop from the terminal server to the console connection of the node we want to be on
   s.send('\r')

   data3 = ''
   while not 'Username: ' in data3:
      data3 = s.recv(2048)

   s.send('<USERNAME>\r')
   time.sleep(0.1)

   s.recv(1024)
   s.send('<PASSWORD>\r')
   time.sleep(0.1)
   data5 = s.recv(1024)
   s.send('exit\r')

   s.close()

   #print repr(data1)   # '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f' from the server
   #print repr(data2)   # '\xff\xfc\x01' from the server
   #print data3         # banner and Username: from the console connection of the node we want to be on  

   prompt_console = data5.split()[-1]
   print 'prompt van de console = %s' %prompt_console[:len(prompt_console)-1]

except socket.error, e:
   print e

except socket.timeout, e:
   print e

相关问题 更多 >

    热门问题