2013-03-21 2 views
9

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

  • Могу ли я как-то проверить, есть ли 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()

ответ

7

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

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

Поскольку это не предсказуемо, когда 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() 
+0

Спасибо, это очень умный. – Vor

Смежные вопросы