Как проверить, установлено ли соединение SSH с экземпляром AWS

Я пытаюсь подключиться к экземпляру Amazon EC2 через SSH, используя boto . Я знаю, что ssh-соединение может быть установлено через некоторое время после создания экземпляра. Поэтому мои вопросы:

  • Могу ли я как-нибудь проверить, есть ли SSH на экземпляре? (если да, то как?)
  • Или как я могу проверить выход boto.manage.cmdshell.sshclient_from_instance() ? Я имею в виду, например, если вывод печатается. Could not establish SSH connection , чем повторить попытку.

Это то, что я пробовал до сих пор, но не повезло:

 if instance.state == 'running': retry = True while retry: try: print 'Connecting to ssh' key_path = os.path.join(os.path.expanduser('~/.ssh'), 'secret_key.pem') cmd = boto.manage.cmdshell.sshclient_from_instance(instance, key_path, user_name='ec2-user') print instance.update() if cmd: retry = False except: print 'Going to sleep' time.sleep(10) SSH Connection refused, will retry in 5 seconds SSH Connection refused, will retry in 5 seconds SSH Connection refused, will retry in 5 seconds SSH Connection refused, will retry in 5 seconds SSH Connection refused, will retry in 5 seconds Could not establish SSH connection 

И, конечно же, все работает правильно, потому что через один из них я смогу запустить тот же код и получить соединение, а также смогу использовать cmd.shell()

Сообщение «SSH Connection отказано, повторите попытку через 5 секунд», начиная с boto: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py

Первоначально «запуск» просто подразумевает, что экземпляр начал загружаться. Пока sshd не встает, соединения с портом 22 отклоняются. Следовательно, то, что вы наблюдаете, абсолютно необходимо ожидать, если sshd не появляется в течение первых 25 секунд состояния «running».

Поскольку это не предсказуемо, когда sshd подходит точно, и если вы не хотите тратить время, просто определяя постоянный длительный период ожидания, вы можете реализовать свой собственный код опроса, который, например, от 1 до 5 секунд, проверяет, доступен ли порт 22 , Только если он вызывает boto.manage.cmdshell.sshclient_from_instance() .

Простой способ проверить, доступен ли определенный порт TCP определенного хоста через модуль socket :

 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(('hostname', 22)) print "Port 22 reachable" except socket.error as e: print "Error on connect: %s" % e s.close()