2013-03-21 6 views
9

Próbuję połączyć się z instancją Amazon EC2 przez SSH, używając boto. Wiem, że połączenie ssh może zostać ustanowione po pewnym czasie od utworzenia instancji. Tak więc moje pytania są następujące:Jak sprawdzić, czy połączenie SSH zostało ustanowione z instancją AWS

  • Czy mogę w jakiś sposób sprawdzić, czy SSH jest na instancji? (jeśli tak, to w jaki sposób?)
  • Albo jak mogę sprawdzić wyjście boto.manage.cmdshell.sshclient_from_instance()? Mam na myśli na przykład, jeśli wyjście wypisze Could not establish SSH connection, niż spróbuj ponownie.

To, co starałem tak daleko, ale nie ma szczęścia:

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 

I oczywiście wszystko działa poprawnie, ponieważ mogę uruchomić tego samego kodu po pewnym czasie i uzyskać połączenie, a będą mogli korzystać cmd.shell()

Odpowiedz

7

się komunikat "Connection refused SSH, będzie ponownie w 5 sekund" pochodzi z boto: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py

Początkowo 'działa' tylko imp licencje, że instancja rozpoczęła uruchamianie. Dopóki sshd nie zostanie podniesione, połączenia z portem 22 są odrzucane. W związku z tym należy się spodziewać absolutnie, że sshd nie pojawi się w ciągu pierwszych 25 sekund stanu "pracy".

Ponieważ nie jest przewidywalne, gdy sshd pojawia się dokładnie i na wypadek, gdyby nie chcesz tracić czasu poprzez zdefiniowanie stałego długiego okresu oczekiwania, możesz zaimplementować swój własny kod odpytywania, który w np. Odstępy 1 do 5 sekund sprawdzają, czy port 22 jest osiągalny. Tylko jeśli jest wywoływana boto.manage.cmdshell.sshclient_from_instance().

Prostym sposobem na sprawdzenie, czy dany port TCP o pewnym gospodarzu jest osiągalny jest poprzez moduł 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

Dziękuję, to bardzo mądry. – Vor