9

我正在尝试使用 SSH 通过 SSH 连接到 Amazon EC2 实例boto。我知道可以在创建实例后的一段时间后建立 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()

4

2 回答 2

7

消息“SSH 连接被拒绝,将在 5 秒后重试”来自 boto: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()
于 2013-07-15T14:25:53.590 回答
0

我有 2 个部分,一个用于检查实例是否正在运行,另一个用于检查实例是否可访问

# Get instance status till it is running
status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
instance_status=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceState.Name)
echo $instance_status
while [ ${instance_status:1:-1} != running ]
do
    status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
    instance_status=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceState.Name)
    echo $instance_status
done

# Get instance reachability till it is ready 
status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
instance_reachability=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceStatus.Status)
echo $instance_reachability
while [ ${instance_reachability:1:-1} != ok ]
do
    status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
    instance_reachability=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceStatus.Status)
    echo $instance_reachability
done
于 2020-09-16T12:29:47.233 回答