2013-03-21 10 views
9

Sto provando a connettermi all'istanza Amazon EC2 tramite SSH utilizzando boto. So che la connessione ssh può essere stabilita dopo un po 'di tempo dopo la creazione dell'istanza. Quindi le mie domande sono:Come verificare se la connessione SSH è stata stabilita con l'istanza AWS

  • Posso verificare in qualche modo se SSH è attivo sull'istanza? (se sì, come?)
  • O come posso verificare l'uscita di boto.manage.cmdshell.sshclient_from_instance()? Intendo, ad esempio, se l'output stampa Could not establish SSH connection, di riprovare.

Questo è quello che ho provato finora, ma non hanno fortuna:

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 

E, naturalmente, tutto funziona correttamente, perché posso lanciare lo stesso codice dopo qualche tempo e vi ottenere una connessione, e sarà in grado di utilizzare cmd.shell()

risposta

7

il messaggio "connessione SSH rifiutato, sarà riprovare in 5 secondi" viene da boto: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py

Inizialmente, 'disattivato' solo imp licenzia che l'istanza ha avviato l'avvio. Finché sshd non è attivo, le connessioni alla porta 22 vengono rifiutate. Quindi, ciò che si osserva è assolutamente da aspettarsi se sshd non viene visualizzato entro i primi 25 secondi dello stato 'in esecuzione'.

Poiché non è prevedibile quando sshd viene visualizzato esattamente e nel caso in cui non si desideri perdere tempo semplicemente definendo un lungo periodo di attesa costante, è possibile implementare il proprio codice di polling che, ad es. Intervalli da 1 a 5 secondi controllano se la porta 22 è raggiungibile. Solo se è invocato boto.manage.cmdshell.sshclient_from_instance().

Un modo semplice per verificare se una determinata porta TCP di un determinato host è raggiungibile sia tramite il modulo 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

Grazie, è molto intelligente. – Vor

Problemi correlati