1
import telnetlib

def telNetCall():
    host  = "10.200.1.23"
    user  = "me"
    password = "matrix"
    telnet  = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r')
    telnet.read_until('Password: ', 3)  
    telnet.write(password + '\r') 
    telnet.write("sh log"+ "\r\n")
    telnet.write('exit' + '\r')
    print telnet.read_all() 

私の問題は、Ciscoルーターから「showlog」を取得しようとすると、部分的な結果しか得られないことです。完全なログを取得するには、スペースバーを5回押す必要があるためです(ログ履歴の長さによって異なります)。手動で行うと、Pythonに完全なログを一覧表示するように指示する方法がわかりません。なにか提案を?

4

3 に答える 3

5

解決策ではありませんが、もっともらしい回避策のようです。

次のIOSCLIコマンドを発行して、ターミナルページングを無効にできます。

端子長0

于 2010-09-11T10:48:04.147 に答える
4

それは実際には正確な答えです.....端末の長さ0を入力するか、ルーターがunix "more"を使用するように出力をページングして、人間が判読できるようにし、すばやくスクロールしないようにします。

import telnetlib

def telNetCall():
    host  = "10.200.1.23"
    user  = "me"
    password = "matrix"
    telnet  = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r')
    telnet.read_until('Password: ', 3)  
    telnet.write(password + '\r') 

    telnet.write("term length 0"+ "\r\n")

    telnet.write("sh log"+ "\r\n")
    telnet.write('exit' + '\r')
    print telnet.read_all() 
于 2011-02-08T15:17:33.377 に答える
3

問題は、約20kbを超える出力をキャプチャする方法になります...ファイルにログを記録すると、すべての出力が取得されますが、セッション全体ではなく、選択した出力のみを保存したいと思います。child.afterを使用する場合、出力が切り捨てられます。たとえば、最初が欠落しているため、maxreadを増やすことで少し軽減できますが、出力が30〜40kbに近づくと爆破します。

不思議に思う人のために、「sh int | i protocol | Last」を使用してCiscoスイッチの出力を取得しています。これは、インターフェイスごとに3行しか返しませんが、顧客のスイッチスタックの一部には450ポートがあります。

ここにダイナミクスが何であるかはわかりませんが、一部のスイッチでは成功します。

しばらくの間、ログをファイルのオンとオフに選択的に切り替えることで、この問題を回避しようとしました。これは信頼性が低いことが判明し、一般的なロギングから、ロギングがそれを見る前に、pexpectが出力方法と一致することがわかります。データがまだファイルに書き込まれている間に、ロギングを無効にすることになりました。約10行の出力の後に出力を切り捨てます。

したがって、最終的な問題は、child.afterの信頼性をどのように高めることができるかということです。大きな出力をキャプチャするため。出力が信頼できる限り、expectステートメントのタイムアウトを増やすことに問題はありません。私が今見ているのは、不完全な出力によるタイムアウトがないことです。

child.sendline(action)
child.expect(prompt_keys)
action_output = str(child.after)    # Captures the output
# print action_output   # Uncomment for debugging grabbed output
output_file.write(action_output + "\n\n\n") # Write the output to file
于 2012-11-27T13:41:18.413 に答える