Подтвердить что ты не робот

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

4b9b3361

Ответ 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.