我需要一种方法来自动找出实例的SSH用户名。它需要知道AMI是Amazon Linux还是Ubuntu(适用于Amazon Linux的ec2-user@与Ubuntu映像上的ubuntu@(
有人可以看到获取此信息的方法吗?
我一直在使用image.root_device_name
它似乎在 Amazon Linux /dev/sda1
Ubuntu 上/dev/xvda
,但我想知道这有多可靠以及是否有替代方法。
以下位置获取 ImageId:
ec2=boto3.client('ec2')
ec2.describe_instances()
然后在 ec2.describe_images(ImageIds=[ImageId1,ImageId2])
中使用 ImageId
正如Shivam提到的,您可以从"描述图像"API调用中的描述中获取操作系统。如果它不包含在此处,那么您可能不得不恢复到在/dev/xvda1
和/dev/sda1
之间进行检查。您可以使用以下内容传入实例 ID 并使用 boto3 获取用户名
import boto3
ec2=boto3.client('ec2')
instance_id = 'i-0defb5cd304ca2d7a'
def find_username(instance_id):
image_id = ec2.describe_instances(InstanceIds=[instance_id])["Reservations"][0]['Instances'][0]['ImageId']
image_type = ec2.describe_images(ImageIds=[image_id])['Images'][0]['Description']
elif 'Amazon Linux' in image_type:
return 'Username is ec2-user'
elif 'Ubuntu' in image_type:
return 'Username is ubuntu'
else:
return 'OS is not Amazon Linux or Ubuntu'
或使用 AWS CLI(与 JQ 结合使用(
get_username () {
IMAGE_ID=$(aws ec2 describe-instances --instance-ids $1 | jq -r '.Reservations[].Instances[].ImageId');
IMAGE_TYPE=$(aws ec2 describe-images --image-ids $IMAGE_ID | jq '.Images[].Description');
if [[ $IMAGE_TYPE == *"Amazon Linux"* ]]; then
echo "Username is ec2-user"
elif [[ $IMAGE_TYPE == *"Ubuntu"* ]]; then
echo "Username is ubuntu"
else ;
echo "OS is not Amazon Linux or Ubuntu"
fi
}
您可以通过将实例 id 作为参数传递来运行 shell 函数,例如 get_username i-xxxxxxxxx