2013-03-21 42 views
9

Tôi đang cố gắng kết nối với cá thể Amazon EC2 qua SSH bằng cách sử dụng boto. Tôi biết rằng kết nối ssh có thể được thiết lập sau một thời gian sau khi cá thể được tạo ra. Vì vậy, câu hỏi của tôi là:Cách kiểm tra xem kết nối SSH đã được thiết lập với ví dụ AWS

  • Tôi có thể kiểm tra xem SSH có đang hoạt động không? (nếu có, như thế nào?)
  • Hoặc làm cách nào để kiểm tra kết quả của boto.manage.cmdshell.sshclient_from_instance()? Tôi có nghĩa là ví dụ nếu đầu ra in ra Could not establish SSH connection, hơn là thử lại.

Đó là những gì tôi đã cố gắng cho đến nay, nhưng không có may mắn:

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 

Và tất nhiên mọi thứ đều hoạt động bình thường, bởi vì tôi có thể khởi chạy cùng mã sau một thời gian và sẽ có được một kết nối, và sẽ có thể sử dụng cmd.shell()

Trả lời

7

thông điệp "kết nối SSH từ chối, sẽ thử lại trong 5 giây" đến từ boto: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py

Ban đầu, 'chạy' chỉ imp cam kết rằng cá thể đã bắt đầu khởi động. Miễn là sshd không hoạt động, các kết nối đến cổng 22 bị từ chối. Do đó, những gì bạn quan sát là hoàn toàn được mong đợi nếu sshd không xuất hiện trong vòng 25 giây đầu tiên của trạng thái 'đang chạy'.

Vì không thể dự đoán được khi sshd xuất hiện chính xác và trong trường hợp bạn không muốn lãng phí thời gian bằng cách xác định thời gian chờ đợi liên tục, bạn có thể triển khai mã phiếu bầu của riêng mình. Từ 1 đến 5 giây kiểm tra nếu cổng 22 có thể truy cập được. Chỉ khi nó được gọi boto.manage.cmdshell.sshclient_from_instance().

Một cách đơn giản để kiểm tra nếu một cổng TCP nhất định của một máy chủ nào đó có thể truy cập là thông qua các mô-đun 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

Cảm ơn bạn, nó rất thông minh. – Vor

Các vấn đề liên quan