我需要一种自动找出实例的SSH用户名的方法。它需要知道AMI是Amazon Linux还是Ubuntu(Amazon Linux上为ec2-user @,而Ubuntu映像上为ubuntu @)
有人可以看到获取此信息的方法吗?
我一直在使用image.root_device_name
,在Ubuntu上的Amazon Linux /dev/xvda
上似乎是/dev/sda1
,但我想知道这有多可靠,是否还有其他方法。
答案 0 :(得分:0)
您可以从以下位置获取ImageId:
ec2=boto3.client('ec2')
ec2.describe_instances()
然后在ec2.describe_images(ImageIds=[ImageId1,ImageId2])
答案 1 :(得分:0)
如Shivam所述,您可以从“描述图像” API调用中的描述中获取操作系统。尽管此处未包含该操作系统,但您可能不得不恢复到/dev/xvda1
和{{ 1}}。
您可以使用以下内容传递实例ID并使用boto3获取用户名
/dev/sda1
或使用aws cli(与jq结合使用)
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'
您可以通过仅将实例ID作为参数传递来运行Shell函数,例如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
}