2013-03-21 108 views
9

我試圖通過SSH連接到Amazon EC2實例,使用boto。我知道ssh連接可以在實例創建一段時間後建立。所以我的問題是:如何檢查是否與AWS實例建立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()

回答

7

消息「SSH連接被拒絕,將在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 2013-07-15 14:32:43