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