返回

在非交互环境中 SSH 到我的 EC2 实例:一个全面的指南

Linux

如何在非交互环境中SSH到我的EC2实例:终极指南

作为一位经验丰富的程序员,我经常遇到在非交互环境(如CodeBuild或BuildSpec)中SSH到我的EC2实例时遇到的问题。这些环境缺乏交互式终端,从而无法获取用户输入,导致密码短语错误。

问题:无法获取私钥密码短语

在非交互环境中,ssh命令无法获取用户输入,因此无法输入私钥的密码短语。这会导致以下错误:

agent_1  | read_passphrase: can't open /dev/tty: No such device or address

原因:非交互环境的限制

在构建spec中使用ssh命令时,它无法在非交互环境中获取用户输入,从而无法输入私钥的密码短语。

解决方法:利用亚马逊系统管理器会话令牌

为了解决这个问题,我们可以利用亚马逊系统管理器会话令牌进行无密码SSH。具体步骤如下:

步骤 1:配置会话管理器

  1. 登录到AWS控制台并导航到亚马逊系统管理器服务。
  2. 选择“会话管理器”。
  3. 在“首选项”选项卡中,启用“启用SSH会话”。

步骤 2:修改BuildSpec

修改buildspec以使用会话令牌进行身份验证,如下所示:

version: 0.2
env:
  variables:
    EC2_HOST: "13.235.xx.yy"
    EC2_SESSION_TOKEN: ${SSM_SESSION_TOKEN}  # 此变量将自动填充为会话令牌
phases:
  pre_build:
    commands:
      # 使用会话令牌创建ssh密钥对
      - echo "$EC2_SESSION_TOKEN" | base64 -d | tee ~/.ssh/session-token-key
      - chmod 400 ~/.ssh/session-token-key
      - ssh-add ~/.ssh/session-token-key
  build:
    commands:
      - ssh -v -o PreferredAuthentications=publickey -i ~/.ssh/session-token-key  ec2-user@$EC2_HOST "ls /var/www/xx-api"

步骤 3:运行BuildSpec

在执行buildspec之前,请确保已在构建环境中设置了SSM_SESSION_TOKEN环境变量。这可以通过在构建环境中运行以下命令来实现:

export SSM_SESSION_TOKEN=$(aws ssm get-session-token --profile default-profile | jq -r '.Token')

附加说明

  • 确保EC2实例已安装并启用了SSH守护进程。
  • 确保您的IAM用户或角色具有必要的权限来访问EC2实例。
  • 使用会话管理器需要额外的费用,但它可以提供更安全、更方便的方式来访问EC2实例。

常见问题解答

  1. 为什么我收到“read_passphrase:无法打开/dev/tty:没有这样的设备或地址”错误?

    • 在非交互环境中,无法获取用户输入,从而无法输入私钥的密码短语。
  2. 如何配置会话管理器?

    • 登录到AWS控制台并导航到亚马逊系统管理器服务。选择“会话管理器”并在“首选项”选项卡中启用“启用SSH会话”。
  3. 如何修改BuildSpec以使用会话令牌?

    • 在buildspec中添加pre_build phase并使用会话令牌创建ssh密钥对。
  4. 为什么使用会话管理器需要额外费用?

    • 会话管理器提供了额外的功能和安全性,需要额外费用。
  5. 是否还有其他方法可以在非交互环境中进行SSH连接?

    • 是的,可以使用端口转发或使用EC2实例角色来完成。