如何向未关联密钥对的EC2实例拷贝文件?
未绑定密钥对的EC2实例文件传输可行方案
以下是经过验证的3种常用实现路径,无需使用原有SSH密钥对即可完成文件传输:
方案1:使用AWS Systems Manager (SSM) 直接传输(最推荐)
无需实例开放22端口、无需公网IP,也不需要重启实例,是生产环境优先选择的方案。
前提条件
- 目标EC2实例已安装SSM Agent(Amazon Linux 2/2023、Ubuntu 16.04+等AWS官方镜像默认预装,其他操作系统可手动部署)
- 实例绑定的IAM角色已附加
AmazonSSMManagedInstanceCore权限策略 - 实例可正常访问SSM服务端点(有公网出口、或已在VPC内配置SSM私有端点均可)
操作步骤
- 如果传输的文件体积较小,可直接使用AWS CLI v2的send-file命令,本地直接向实例推送文件:
aws ssm send-file --instance-id <你的实例ID> --source ./本地文件路径 --destination /实例上的绝对存储路径 --region <实例所属区域> - 如果文件体积较大,可先将文件上传到同区域的S3存储桶,再通过SSM发送命令让实例拉取文件,注意需要给实例的IAM角色额外添加对应S3存储桶的读取权限:
aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids "<你的实例ID>" --parameters '{"commands":["aws s3 cp s3://<存储桶名称>/<文件路径> /实例上的目标存储路径"]}' --region <实例所属区域> - 可通过
aws ssm list-command-invocations --command-id <上一步返回的CommandId> --details查看命令执行结果,确认文件传输状态。
如果目标实例是Windows系统,只需将上述命令中的AWS-RunShellScript替换为AWS-RunPowerShellScript,调整对应路径格式即可。
方案2:临时绑定密钥对(适合允许短时间停机的场景)
如果是基于EBS卷的实例,且允许短暂停机,可直接为现有实例绑定新的密钥对,之后即可正常使用SCP传输:
- 先停止目标EC2实例(停止操作不会删除实例本地数据,若使用临时公网IP,重启后公网IP会变更)
- 在EC2控制台选中实例,依次点击「操作」-「安全」-「修改密钥对」,选择已有密钥对或新建密钥对后完成绑定
- 启动实例后即可用新绑定的密钥对执行SCP/SFTP传输,文件传输完成后也可按需解绑密钥对。
方案3:通过用户数据传输小文件(适合16KB以内的小型文件/脚本)
如果仅需要传输小型配置文件、脚本等体积小于16KB的内容,可通过修改实例用户数据实现,无需额外配置权限:
- 停止目标实例后,依次点击「操作」-「实例设置」-「编辑用户数据」
- 将需要传输的文件内容做Base64编码后,写入用户数据的启动脚本,示例如下:
#!/bin/bash echo "c2FtcGxlIGNvbnRlbnQK" | base64 -d > /opt/target.conf chmod 644 /opt/target.conf - 保存后启动实例,系统启动时会自动执行脚本,将解码后的内容写入指定路径。
内容的提问来源于stack exchange,提问作者puneetky
相关产品推荐
相关产品推荐

