Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试SSH可用性的优雅方法_Python_Ssh_Paramiko - Fatal编程技术网

Python 测试SSH可用性的优雅方法

Python 测试SSH可用性的优雅方法,python,ssh,paramiko,Python,Ssh,Paramiko,我需要一个Python程序来轮询远程服务器的SSH连接,并在可用时发出通知。我目前正在使用paramiko进行此操作;尝试连接,如果失败,请等待并重试,直到成功或最大重试次数。这是可行的,但有点笨重。另外,paramiko似乎要么连接,要么抛出错误,所以我能看到的唯一方法是使用一个try/except块,它是坏的,坏的,坏的。方法如下: def check_ssh(self, ip, user, key_file, initial_wait=0, interval=0, retries=1):

我需要一个Python程序来轮询远程服务器的SSH连接,并在可用时发出通知。我目前正在使用paramiko进行此操作;尝试连接,如果失败,请等待并重试,直到成功或最大重试次数。这是可行的,但有点笨重。另外,paramiko似乎要么连接,要么抛出错误,所以我能看到的唯一方法是使用一个try/except块,它是坏的,坏的,坏的。方法如下:

def check_ssh(self, ip, user, key_file, initial_wait=0, interval=0, retries=1):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    sleep(initial_wait)

    for x in range(retries):
        try:
            ssh.connect(ip, username=user, key_filename=key_file)
            return True
        except Exception, e:
            print e
            sleep(interval)
    return False
一定有比这更优雅的解决方案。Paramiko是我选择的SSH库,但我愿意接受这里的任何建议


为了澄清,我想避免使用try/except作为控制正常代码执行流程的手段-它应该用于捕获实际错误,如坏主机密钥、无效用户等。

正如frb评论中提到的,a
try。。。除非
块是测试特定服务可用性的好方法。但是,您不应该使用“catch all”
“except
块,而是将其限制在服务不可用时发生的特定异常

根据文档,可能会引发不同的异常,具体取决于连接时发生的问题。如果你想抓住所有这些,你的
试试。。。除此之外
块将如下所示:

try:
    ssh.connect(ip, username=user, key_filename=key_file)
    return True
except (BadHostKeyException, AuthenticationException, 
        SSHException, socket.error) as e:
    print e
    sleep(interval)

如果只是这些异常的一个子集与您的案例相关,那么只将那些异常放在
except

之后的元组中。我能看到的唯一方法是使用try/except块,它是坏的,坏的,坏的
为什么不好?捕获
异常
是坏的,这一点您肯定是对的。然而,捕获paramiko抛出的特定异常一点也不坏。事实上,使用异常处理作为程序流的一种手段通常是不好的,正如:我没有费心把实际的异常放进去,因为这是一种临时的黑客行为,而且我很懒!我的问题是,我不想用try/except来控制我程序的正常流程——只想在我的lax代码上捕获一个实际的错误fair point,只指定一个通用的异常:p我确实需要一个try/catch,我想这是一个坏的主机密钥,因为这些是实际的错误,而不是“服务器还没有启动”-重点是我不希望try/except块控制等待循环(即代码的正常流)。您可以在示例脚本中包含导入吗?目前还不清楚这些变量的主要来源from@P.V.这不是一个独立的示例,只是建议您更换
try
<代码>除OP代码中的
块外。