我需要一个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作为控制代码执行正常流程的手段 - 它应该用于捕获实际错误,例如错误的主机密钥,无效的用户等。
答案 0 :(得分:20)
正如frb的评论中所提到的,try ... except
块是测试特定服务可用性的好方法。您不应该使用“catch-all”except
块,但将其限制为服务不可用时发生的特定异常。
根据文档,paramiko.SSHClient.connect
可能会抛出不同的异常,具体取决于连接时出现的问题。如果你想抓住所有这些,你的try ... 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
之后将这些例外放入元组中。