裸金属云 - 如何为计算实例设置授权的SSH键



我已经成功地使用以下代码提供了裸机云计算实例:

public static Instance createInstance(
        ComputeClient computeClient,
        String compartmentId,
        AvailabilityDomain availabilityDomain,
        String instanceName,
        Image image,
        Shape shape,
        Subnet subnet
    ) {
    LaunchInstanceResponse response = computeClient.launchInstance(
        LaunchInstanceRequest.builder()
            .launchInstanceDetails(
                LaunchInstanceDetails.builder()
                    .availabilityDomain(availabilityDomain.getName())
                    .compartmentId(compartmentId)
                    .displayName(instanceName)
                    .imageId(image.getId())
                    .shape(shape.getShape())
                    .subnetId(subnet.getId())
                    .build())
            .build());  
    return response.getInstance();
}

但是,我无法通过上述代码创建的任何实例,因为launchInstance上没有参数可以传递我的SSH Keypair的公钥。

如何告诉实例什么SSH公共密钥允许?我知道必须以某种方式有可能,因为控制台UI允许我提供SSH公钥作为实例创建的一部分。

根据启动实例API文档,您需要通过metadata参数的ssh_authorized_keys字段传递SSH公共密钥:

提供云 - 内部元数据

您可以使用以下元数据密钥名称将信息提供给云端:

" ssh_authorized_keys" - 提供一个或多个公共SSH键 包含在用于默认用户的〜/.ssh/eleteriped_keys文件中 实例。使用newline字符分开多个键。这 SSH键必须处于授权_keys文件所需的格式

Java SDK中的代码如下:

public static Instance createInstance(
        ComputeClient computeClient,
        String compartmentId,
        AvailabilityDomain availabilityDomain,
        String instanceName,
        Image image,
        Shape shape,
        Subnet subnet
    ) {
    String sshPublicKey = "ssh-rsa AAAAB3NzaC1y...key shortened for example...fdK/ABqxgH7sy3AWgBjfj some description";
    Map<String, String> metadata = new HashMap<>();
    metadata.put("ssh_authorized_keys", sshPublicKey);
    LaunchInstanceResponse response = computeClient.launchInstance(
        LaunchInstanceRequest.builder()
            .launchInstanceDetails(
                LaunchInstanceDetails.builder()
                    .availabilityDomain(availabilityDomain.getName())
                    .compartmentId(compartmentId)
                    .displayName(instanceName)
                    .imageId(image.getId())
                    .metadata(metadata)
                    .shape(shape.getShape())
                    .subnetId(subnet.getId())
                    .build())
            .build());  
    return response.getInstance();
}

然后,该实例将允许您使用该公共密钥的SSH Keypair进行SSH。

最新更新