Элегантный способ тестирования доступности SSH
Мне нужна программа 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 в качестве средства контроля нормального потока выполнения кода - он должен использоваться для обнаружения фактических ошибок, таких как неправильный ключ хоста, недопустимый пользователь и т.д.
Ответы
Ответ 1
Как упоминалось в комментарии от 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
.