1

cisco 端末/通信サーバー経由で cisco ノードのコンソール接続に接続しようとしています。これを行うには、特定のポート XXXX - ポート 2068 で cisco 端末/通信サーバーの IP アドレスに telnet します。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 コードを実行すると、動作しないようです...

#! /usr/bin/env python

import telnetlib

tn = telnetlib.Telnet("X.X.X.X",2068)
tn.set_debuglevel(8)
data = tn.read_some()
tn.close()
if data == '':
  print 'variable data is EMPTY'
else:
  print data
  print "variable data is FILLED !!!"

このコードを実行すると、これだけが表示されます。cisco 端末/通信サーバーから何も来ていないため、「tn.read_some()」が永遠に待機しているように見えますか? [tn.read_all()も同様]

PS。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

コード内の「tn.read_some()」を「tn.read_eager()」または「tn.read_very_eager()」または「tn.read_lazy()」または「tn.read_very_lazy()」に変更してコードを実行すると、繰り返しますが、これは私に示しています:

[user@computer]$ ./test.py
variable data is EMPTY

次のように、cisco ノードのコンソール接続ではなく、cisco ノードの管理接続 (通常のポート 23 の別の IP アドレス YYYY) に接続するように Python コードを変更すると、正常に動作します。次の出力が表示されます。

[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 端末/COMM サーバー (XXXX) が通常とは異なる方法で反応しているため、Python telnetlib が混乱していると思います。

似たようなことを経験した人はいますか?

4

3 に答える 3

0

別の方法を見つけました ( Serge Ballestaに感謝)

私の場合、telnetlib オブジェクトは使用できなかったため、ソケット オブジェクトを使用して、cisco 端末/通信サーバー経由で 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
于 2014-06-13T14:21:03.527 に答える
0

ポート 2068 には真の telnet プロトコルがないようです。telnet man から非標準ポートに接続する場合、telnet は TELNET オプションの自動開始を省略します。ポート番号の前にマイナス記号がある場合、最初のオプション ネゴシエーションが行われます。. しかし、telnetlib は、それを使用する場合、telnet プロトコルが必要であると想定しています。接続でwiresharkを使用するのは簡単ではないと言ったように、ポート-2068に対してCLI telnetを実行して、telnetlibと同じ問題が発生することを確認できます。

シンプルなソケットを使用するオプションはありますか?

s = socket.create_connection(('X.X.X.X', 2068))
data = s.recv(1024)
...
于 2014-06-12T13:18:31.510 に答える