You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SSM在AWS EC2克隆Bitbucket私有库遇公钥权限问题求解决

解决SSM Agent克隆Bitbucket私有仓库时的Permission Denied问题

首先咱们先搞清楚核心原因:当你通过SSM Run Command执行命令时,命令是在SSM服务默认使用的系统用户(比如Amazon Linux 2上是ssm-user,Ubuntu可能是ubuntu或root)的上下文下运行的,不是你手动登录EC2时用的个人用户。你之前上传到自己用户~/.ssh目录的密钥,对SSM进程来说完全不可见——它只会去找执行命令那个用户的~/.ssh目录。

下面是几个可行的解决方案,按从易操作到安全合规的顺序排列:


方案1:把SSH密钥放到SSM执行用户的.ssh目录

步骤1:确认SSM使用的用户

先通过SSM执行whoami命令,确定当前执行命令的用户:

aws ssm send-command --instance-ids <你的EC2实例ID> --document-name "AWS-RunShellScript" --parameters commands="whoami"

查看命令输出,得到用户名(比如ssm-user)。

步骤2:配置SSH密钥和known_hosts

把你的Bitbucket私钥放到该用户的.ssh目录,同时设置严格的权限(SSH对文件权限要求很高,权限太宽会直接拒绝使用):

# 创建.ssh目录并设置权限
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="mkdir -p /home/ssm-user/.ssh && chmod 700 /home/ssm-user/.ssh"

# 写入私钥(替换成你的私钥内容,注意保留原格式)
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="echo '-----BEGIN OPENSSH PRIVATE KEY-----
你的私钥完整内容,每一行都要保留
-----END OPENSSH PRIVATE KEY-----' > /home/ssm-user/.ssh/id_rsa && chmod 600 /home/ssm-user/.ssh/id_rsa"

# 添加Bitbucket到known_hosts,避免首次连接的交互式确认
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="ssh-keyscan bitbucket.org >> /home/ssm-user/.ssh/known_hosts && chmod 644 /home/ssm-user/.ssh/known_hosts"

注意:如果你的私钥设置了密码,这个方案不适用,因为SSM命令无法交互式输入密码。

步骤3:克隆仓库

现在就可以正常执行克隆命令了:

aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone git@bitbucket.org:<你的Bitbucket用户名>/<仓库名>.git /目标克隆目录"

方案2:用HTTPS + Bitbucket App Password克隆(无需SSH密钥)

这个方案跳过SSH配置,直接用HTTPS认证,操作更简单:

步骤1:创建Bitbucket App Password

登录Bitbucket → 点击个人头像 → Personal settings → App passwords → Create app password,勾选Repository read权限(如果需要写入权限就额外勾选),生成后务必保存好这个密码(Bitbucket只显示一次)。

步骤2:执行HTTPS克隆

把你的Bitbucket用户名和App Password嵌入到HTTPS URL里,直接克隆:

aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone https://<你的Bitbucket用户名>:<你的App Password>@bitbucket.org/<你的用户名>/<仓库名>.git /目标克隆目录"

小提示:如果App Password里有特殊字符(比如@、&),需要做URL编码,比如@换成%40,&换成%26。


方案3:用EC2 Instance Profile + Bitbucket IAM集成(最安全)

如果你的EC2实例已经配置了Instance Profile,并且Bitbucket支持AWS IAM身份验证,这种方案不需要存储任何静态密钥,完全依赖临时IAM凭证认证,符合安全最佳实践:

步骤1:配置Bitbucket的AWS IAM集成

在Bitbucket仓库的设置里,找到Access management → AWS IAM,启用集成,添加你的AWS账户ID,并授予仓库对应的访问权限。

步骤2:安装认证助手并克隆

# 安装Bitbucket AWS认证助手(以Amazon Linux 2为例,其他系统替换对应的下载链接)
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="curl -L https://github.com/awslabs/aws-bitbucket-creds/releases/latest/download/aws-bitbucket-creds-linux-amd64 -o /usr/local/bin/aws-bitbucket-creds && chmod +x /usr/local/bin/aws-bitbucket-creds"

# 配置Git使用该认证助手
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git config --global credential.helper '!aws-bitbucket-creds'"

# 克隆仓库
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone https://bitbucket.org/<你的用户名>/<仓库名>.git /目标克隆目录"

内容的提问来源于stack exchange,提问作者Mohamed Adel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:06:31