PythonがTelnetの自動接続を実現して暗号を検査する例

3634 ワード

最近Pythonネットワーク関連のプログラミングを勉強していますが、このコードはTelnetの自動接続検出用のrootパスワードを実現しました。
Pythonはtelnetlibモジュールを内蔵しています。テレネットの遠隔操作をサポートしています。直接importだけでいいです。
コードは以下の通りです

# encoding=utf-8
import telnetlib
import time
import sys
import os


def do_telnet(Host, Port, username, password, finish):
    #   Telnet   
    tn = telnetlib.Telnet(Host, Port, timeout=1)
    tn.set_debuglevel(3)

    #        
    tn.read_until("login: ")
    tn.write(str(username) + '
') # tn.read_until("Password: ") tn.write(str(password) + '
') # , if tn.read_until(finish): print("****** login incorrect!
") tn.close() if __name__ == '__main__': Host = input("IP:") # Telnet IP Port = input("Port:") # Telnet username = 'root' # finish = 'incorrect' # pw_file = open('.\\pw.txt', 'r+') # Index = 0 print(time.asctime(), ": ****** begin", "
") while True: password = pw_file.readline() Index += 1 print(Index, time.asctime(), ": ****** try", "", username, ":", password, "") if len(password) == 0: break do_telnet(Host, Port, username, password, finish) pw_file.close()
パスワード帳pw.txt、内容は例えば:

root  
admin  
12345  
888888 
出力は以下の通りです

注:ここでテストした目的のホストは埋め込みlinuxシステムで、ユーザー名はrootで、パスワードが間違って戻ってきたのはincorectのヒントです。ターゲットシステムによってユーザー名とエラーメッセージを変更することができます。
テレネットは多くの方法を提供してデータを得ることができます。until()は結果に欲しい情報がある場合に戻ります。read_そして、結果があれば帰ってきます。read_very_lazy()はバッファに戻るデータです。コードを見て、telnetlibはバッファ処理をしていますので、データはすぐに戻るのではなく、バッファに置いておきました。多くの読取処理はこのバッファを取り囲んでいる。緩衝区の情報はいつ到着するか分かりません。速いかもしれません。遅いかもしれません。別れて到着するかもしれません。ですから、必ずしもデータがそろっているとは限りません。until()はバッファにあるデータが欲しい内容があるかどうかを判断します。もしないなら、タイムアウト時間に達していない限り、待ちます。また、expect方法とread_を使うことができます。untilは似ていますが、正規表現をサポートしています。機能はかなり強いです。
ネットでもう一つの名前があります。 Pexpect 強力な機能のようで、複数のプロトコルをサポートしています。ホームページでは、Pexpectを使ってドキュメントをダウンロードすることを勧めています。でも、ネットがあまりよくないので、まだ降りていません。Telnet契約を支持するかどうか分かりません。
上のプログラムにftplibの機能を追加すれば、遠隔更新のメンテナンスプログラムができます。ただ、バックグラウンドからのメッセージをどう判断するかは、良い方法が見つけられませんでした。lazy()まだread_エイジャーは?何か他の方法がありますか?最も主要な問題は、戻りデータが必ずしも完全ではないことです。リロードを提供していないようです。ラインの方法。
ここで、ポートとtimeoutはオプションのパラメータであり、timeoutはsocket接続を初期化する際にのみ機能しますが、接続が成功すると待ち時間が発生したら、read(u)を使用します。until方式でコンテンツを取得した際に戻る内容が指定された内容と一致していないと、提示待ちの場合、timeoutは機能しません。このsocket接続はずっと維持されています。永生不死です。
この問題をどう解決しますか?実はもっと原始的な方法があります。untilの方法は、このようにして種の情況が現れることはできなくて、時間になると自分で入力するため、最多で最後に望みの結果が得られないで、しかしこの方式はとても不安定で、互換性もよくありません;もう一つの方法はスレッドを使ってこの関数を起動し、サブスレッドをタイムアウト設定することで、このtelnet接続を間接的に制御することができます。

import threading  

th1 = threading.Thread(target=do_telnet, args=(host.encode('utf-8'), user.encode('utf-8'), passwd.encode('utf-8'), finish.encode('utf-8'), commands))  
th1.start()  
th1.join(20)  ##20      
遭遇した問題:
Telnetメソッドに渡す文字列は一回のコードを解きますので、過去にwriteが必要とされていた文字列が既に復号されているunicodeであれば、エラーとなりますので、送信される文字列を送る前にutf-8を編成するのが妥当です。asciiで符号化してもいいです。
以上はPythonがTelnetに自動接続して暗号を検査する例の詳しい内容を実現しました。python Telnetが自動接続して暗号を検査する資料についてもっと多いです。他の関連記事に注目してください。