1

背景:为了练习,我正在编写一个工作应用程序,允许帮助台用户 grep | 尾日志,而不需要他们执行 SSH/终端工作。这些用户在 Windows 机器上运行,否则我会使用子进程。一些服务器使用系统帐户(这些是预先填充到脚本中的),但其他服务器需要用户输入凭据。

当脚本(详情如下)运行并且用户错误地输入他们的凭据时,应用程序在抛出“No handlers could be found for logger "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方法调用上。该方法采用可选的超时参数,但默认情况下超时设置为无,因此永远不会返回。如果您将此值设置为对用户更合理的值,例如 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 回答