1

背景: 練習のために、ヘルプ デスク ユーザーが grep | SSH/端末の作業を実行する必要なく、ログをテールします。これらのユーザーは Windows マシンで実行しています。それ以外の場合は、サブプロセスを使用します。一部のサーバーはシステム アカウントを使用しますが (これらはスクリプトに事前に入力されています)、他のサーバーはユーザーが資格情報を入力する必要があります。

スクリプト (詳細は以下) が実行され、ユーザーが資格情報を間違って入力すると、「ロガー "paramiko.transport" のハンドラーが見つかりませんでした」というエラーがスローされた後、アプリケーションがハングします。ユーザーが認証情報が事前に入力されていないオプションを選択すると、ユーザー名とパスワードの入力を求められます。資格情報が適切なリストに追加され、ポップアップが破棄され、ログ チェック機能が呼び出されます。エラーがスローされたときにウィンドウがハングする原因は何ですか?また、そのような問題を処理する最善の方法は何ですか?

logging.basicConfig() を追加しようとしましたが、アプリケーションがまだハングします。

完全なスクリプト: http://pastebin.com/TUvs92yN

ユーザーが最初に送信ボタンを押すと、以下が呼び出されます。

lambda: credentials() if hosts[log.get()][0] in needs_pass else log_check()

ホスト名がリストにある場合は、認証情報ボックスが表示されます。ユーザーがユーザー名とパスワードを入力すると、submit_cred() 関数が呼び出されます。

def submit_cred():
    if len(hosts[log.get()]) < 3:
        hosts[log.get()].append(username_prompt.get())
        hosts[log.get()].append(password_prompt.get())
    prompt.destroy()
    log_check()

ここからトラブルが始まります。資格情報が正しい場合、アプリケーションは期待どおりに結果を表示しますが、そうでない場合、ウィンドウが破棄された後に log_check() が呼び出されるとエラーが発生し、アプリケーションがハングします。log_check() で認証の問題を処理しようとしましたが、現時点ではそれが問題になるほど十分に進んでいないようです。

4

1 に答える 1

1

問題は paramiko sshconnectメソッドの呼び出しにあると思います。このメソッドはオプションのタイムアウト引数を取りますが、タイムアウトはデフォルトで None に設定されているため、戻りません。この値をユーザーにとってより適切な値 (5 秒など) に設定した場合 (実際にはもう少し長く設定することをお勧めします):

# Verify connectivity/authenticate.
    try:
        ssh.connect(host, username=user, password=passwd, timeout=5)

これで、except 句にヒットすることに気付くでしょう。例外メッセージは「タイムアウト」になるため、そこにチェックを追加できます。

また、アプリ全体がフリーズするのを防ぐためにスレッド内の GUI 内でそのような関数をラップすることは悪い考えではありません。実装は非常に簡単です。あなたの場合、現在のlog_check関数の名前を次のように変更してから_log_check、次のような小さなラッパーを書くことができます。

def log_check(self):
    t = Thread(target=_log_check)
    t.start()

お役に立てれば!

于 2013-11-11T19:00:21.633 に答える