返回
在非交互环境中 SSH 到我的 EC2 实例:一个全面的指南
Linux
2024-03-11 17:30:57
如何在非交互环境中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:配置会话管理器
- 登录到AWS控制台并导航到亚马逊系统管理器服务。
- 选择“会话管理器”。
- 在“首选项”选项卡中,启用“启用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实例。
常见问题解答
-
为什么我收到“read_passphrase:无法打开/dev/tty:没有这样的设备或地址”错误?
- 在非交互环境中,无法获取用户输入,从而无法输入私钥的密码短语。
-
如何配置会话管理器?
- 登录到AWS控制台并导航到亚马逊系统管理器服务。选择“会话管理器”并在“首选项”选项卡中启用“启用SSH会话”。
-
如何修改BuildSpec以使用会话令牌?
- 在buildspec中添加pre_build phase并使用会话令牌创建ssh密钥对。
-
为什么使用会话管理器需要额外费用?
- 会话管理器提供了额外的功能和安全性,需要额外费用。
-
是否还有其他方法可以在非交互环境中进行SSH连接?
- 是的,可以使用端口转发或使用EC2实例角色来完成。