我需要一个 Python 程序来轮询远程服务器的 SSH 连接并在它可用时发出通知。我目前正在使用 paramiko 进行此操作;尝试连接,如果失败,请等待并重试,直到成功或最大重试次数。这可行,但有点笨拙。 paramiko 似乎也连接或抛出错误,所以我能看到这样做的唯一方法是使用 try/except block ,这是坏的,坏的,坏的。方法如下:
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 作为控制代码执行的正常流程的手段 - 它应该用于捕获实际错误,例如错误的主机 key 、无效的用户等。
最佳答案
正如 frb 的评论中提到的,try ... except
block 是测试特定服务可用性的好方法。不过,您不应该使用“包罗万象”的 except
block ,而应将其限制在服务不可用时发生的特定异常。
根据文档,paramiko.SSHClient.connect
可能会抛出不同的异常,具体取决于连接时发生的问题。如果你想捕获所有这些,你的 try ... except
block 将如下所示:
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
之后的元组中。
关于python - 测试 SSH 可用性的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14236346/