如何在连接之前尝试wmi连接尝试或检查远程主机是否可用?

时间:2018-03-30 19:53:12

标签: python wmi

我有一个脚本通过wmi连接到很多主机:

wmi.WMI(ip, user=username, password=password))

但是,通常许多主机都不可用,并且在允许脚本尝试下一个主机之前连接暂定需要很长时间。

我希望能够在尝试连接之前测试远程主机的可用性,或者能够为连接设置超时。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您遇到网络超时,其时间深深地埋藏在Windows注册表(网络堆栈)中。

您的问题有很多可能的解决方案,我的(除了使用多个线程)引入自定义超时(例如5秒而不是75默认秒)

有趣的是,Windows PowerShell wmi对象确实引入了一个开箱即用的超时选项,而python一个没有。因此,解决问题的一种方法是实现自己的超时。在python中,一种方法是这样的:

https://pythonadventures.wordpress.com/2012/12/08/raise-a-timeout-exception-after-x-seconds/

import signal
import time

def test_request(arg=None):
    """Your http request."""
    time.sleep(2)
    return arg

class Timeout():
    """Timeout class using ALARM signal."""
    class Timeout(Exception):
        pass

    def __init__(self, sec):
        self.sec = sec

    def __enter__(self):
        signal.signal(signal.SIGALRM, self.raise_timeout)
        signal.alarm(self.sec)

    def __exit__(self, *args):
        signal.alarm(0)    # disable alarm

    def raise_timeout(self, *args):
        raise Timeout.Timeout()

def main():
    # Run block of code with timeouts
    try:
        with Timeout(3):
            print test_request("Request 1")
        with Timeout(1):
            print test_request("Request 2")
    except Timeout.Timeout:
        print "Timeout"

#############################################################################

if __name__ == "__main__":
    main()