本文介绍如何使用config_ecs_instance_connect插件连接Linux实例。

前提条件

  • 目标实例所在账号已开通会话管理功能。具体操作,请参见通过会话管理连接实例
  • 已安装云助手客户端,且客户端版本支持会话管理,即确保Linux操作系统中使用的客户端版本不低于2.2.3.196,Windows操作系统中使用的客户端版本不低于2.1.3.196。具体操作,请参见安装云助手客户端
  • 目标实例必须为Linux系统。
说明 会话管理功能正在公测中,如需使用请以阿里云账号登录后开通。

背景信息

使用config_ecs_instance_connect插件和云助手公共命令,可以将ssh公钥发送到指定实例内部供指定用户使用,密钥保留60s。在60s内,您可以通过ssh公钥登录的方式进入实例,无需输入密码。

操作步骤

  1. 在会话管理客户端,执行如下命令,生成RSA类型的公钥与密钥文件。
    ssh-keygen -t rsa
    根据界面提示,按Enter,当界面显示如下所示时,说明公钥与密钥文件已生成。生成公钥
    说明 生成的公钥路径默认为~/.ssh/id_rsa.pub。
  2. 在目标实例中,使用云助手发送如下命令,安装并启用config_ecs_instance_connect。
    具体操作,请参见执行命令
    acs-plugin-manager -e -P config_ecs_instance_connect --params --install
  3. 在目标实例中,发送ssh公钥。
    您可以选择以下任一方式,发送ssh公钥到目标实例。
    • 使用API发送ssh公钥到目标实例。

      调用InvokeCommand,执行名称为ACS-ECS-SendSshPublicKey-linux.sh的公共命令,将公钥发送到目标实例。

      您需要注意以下三个参数,更多参数说明,请参见InvokeCommand
      • CommandId:命令ID,取值为ACS-ECS-SendSshPublicKey-linux.sh
      • username: 远程登录目标实例的用户名,默认为root。
      • sshpublickey: 必填参数,参数的值为步骤1中生成的id_rsa.pub的内容。
      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.IAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.exceptions.ServerException;
      import com.aliyuncs.profile.DefaultProfile;
      import com.google.gson.Gson;
      import java.util.*;
      import com.aliyuncs.ecs.model.v20140526.*;
      
      public class InvokeCommand {
      
          public static void main(String[] args) {
              DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "<accessKeyId>", "<accessSecret>");
              IAcsClient client = new DefaultAcsClient(profile);
      
              InvokeCommandRequest request = new InvokeCommandRequest();
              request.setRegionId("cn-beijing");
              request.setCommandId("ACS-ECS-SendSshPublicKey-linux.sh");
      
              List<String> instanceIdList = new ArrayList<String>();
              instanceIdList.add("i-xxxxxx");
              request.setInstanceIds(instanceIdList);
              request.setParameters("{\"username\":\"root\", \"sshpublickey\":\"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDftEm8H5A19FXv5SCVzHqmS9vg+8B4wsp9M/U/vKwPMlM0fJr8Z52ErGnEnpFA24hLSf/Ffpht19tp+QtsYhVcg xxx\"}");
      
              try {
                  InvokeCommandResponse response = client.getAcsResponse(request);
                  System.out.println(new Gson().toJson(response));
              } catch (ServerException e) {
                  e.printStackTrace();
              } catch (ClientException e) {
                  System.out.println("ErrCode:" + e.getErrCode());
                  System.out.println("ErrMsg:" + e.getErrMsg());
                  System.out.println("RequestId:" + e.getRequestId());
              }
      
          }
      }
    • 使用云助手发送ssh公钥到目标实例。
      1. 登录ECS管理控制台
      2. 在左侧导航栏,选择运维与监控 > 发送命令/文件(云助手)
      3. 单击公共命令页签。
      4. 选择ACS-ECS-SendSshPublicKey-linux.sh,在操作列,单击执行
      5. 在弹出的执行命令面板,配置参数。
        • 命令参数:
          • username : 远程登录目标实例的用户名,默认为root。
          • sshpublickey : 必填参数,参数的值为步骤1中生成的id_rsa.pub的内容。
        • 选择实例:选中要连接的目标实例。
        执行命令
      6. 单击执行
  4. 免密登录目标实例。
    支持以下两种方式登录目标实例。
    • 通过公网IP免密登录目标实例。
      ssh -i ~/.ssh/id_rsa username@instance_ip 
      说明 ~/.ssh/id_rsa请替换成您的实际路径,username请替换成您远程登录目标实例的用户名,instance_ip请替换成您远程登录的目标实例IP。
    • 通过instance_id免密登录目标实例。
      ssh -i ~/.ssh/id_rsa username@instance_id 
      说明
      • 用于登录目标实例的会话管理客户端已安装ali-instance-cli。具体操作,请参见Linux、macOS操作系统Windows操作系统
      • ~/.ssh/id_rsa请替换成您的实际路径,username请替换成您远程登录目标实例的用户名,instance_id请替换成您远程登录的目标实例ID。

常见问题

为什么免密登录时提示输入密码?

公钥注册完成之后,有效期只有60s,注册公钥之后,免密登录如果提示需要密码,请确认您的公钥是否已经过期。

通过云助手安装config_ecs_instance_connect,或者通过公共命令报错时候,如何查看具体问题?

您可以通过查看log分析具体问题。
  • 查看云助手客户端日志:
    /usr/local/share/aliyun-assist/云助手版本号/log/aliyun_assist_main.log.*
  • 查看acs_plugin_manager日志:
    /usr/local/share/aliyun-assist/云助手版本号/log/acs_plugin_manager.log