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 が混乱していると思います。
似たようなことを経験した人はいますか?