裸机云 - 如何为计算实例设置授权的ssh密钥?

时间:2016-11-23 22:32:20

标签: oracle-cloud-infrastructure oci-java-sdk oci-go-sdk

我已使用以下代码成功配置了Bare Metal Cloud计算实例:

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();
}

但是,我无法通过上面的代码SSH到我创建的任何实例,因为launchInstance上没有参数传递我的SSH密钥对的公钥。

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

1 个答案:

答案 0 :(得分:1)

根据launch instance API documentation,您需要通过ssh_authorized_keys参数的metadata字段传递SSH公钥:

  

提供Cloud-Init元数据

     

您可以使用以下元数据键名称向Cloud-Init提供信息:

     

“ssh_authorized_keys” - 提供一个或多个公共SSH密钥   包含在默认用户的〜/ .ssh / authorized_keys文件中   实例。使用换行符分隔多个键。该   SSH密钥必须采用authorized_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密钥对来SSH。