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

通过EC2 user-data脚本下载的文件为何消失?

EC2 user-data脚本下载文件后SSH登录看不到的问题

问题背景

使用以下user-data引导脚本在EC2实例中部署服务,脚本执行日志显示文件已成功下载,但通过SSH登录ec2-user账号后,当前目录下无任何文件:

user-data脚本内容

#!/bin/bash
sudo yum update -y
sudo yum search docker
sudo yum install docker -y
sudo usermod -a -G docker ec2-user
id ec2-user
newgrp docker
sudo yum install python3-pip -y
sudo pip3 install docker-compose
sudo systemctl enable docker.service
sudo systemctl start docker.service
export PATH=$PATH:/usr/local/bin
mkdir content
docker network create web_todos
docker run -d -p 80:80 --name nginx-proxy --network=web_todos -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
aws s3 cp s3://jv-pocho/docker-compose.yaml .
aws s3 cp s3://jv-pocho/backup.sql .
aws s3 cp s3://jv-pocho/dns-updater.sh .
aws s3 sync s3://jv-pocho/images/ ./content/images
aws s3 sync s3://jv-pocho/themes/ ./content/themes
docker-compose up -d
sleep 30
docker exec -i db_jv sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < backup.sql
rm backup.sql
chmod +x dns-updater.sh

异常现象

  • 脚本执行日志显示文件下载完成:
download: s3://jv-pocho/dns-updater.sh to ./dns-updater.sh
[   92.739262] cloud-init[3203]: Completed 32.0 KiB/727.2 KiB (273.1 KiB/s) with 25 file(s) remaining
  • SSH登录ec2-user后,当前目录无文件:
[ec2-user@ip-x-x-x-x ~]$ ls
[ec2-user@ip-x-x-x-x ~]$ ls -l
total 0
  • yum安装、Docker部署等操作均已成功完成。

原因分析

文件没有被删除,而是脚本执行的工作目录和SSH登录后的默认目录不一致:

  • cloud-init执行user-data脚本时,默认以root用户在**根目录(/)**下运行,所以脚本中创建的content文件夹、下载的docker-compose.yaml、dns-updater.sh等文件都在/目录下。
  • SSH登录后默认进入的是ec2-user的家目录(/home/ec2-user),自然看不到根目录下的文件。

解决方法

方法1:在脚本中切换到ec2-user的家目录执行操作

在脚本开头添加切换目录的命令,确保所有文件都创建在ec2-user的家目录:

#!/bin/bash
# 切换到ec2-user的家目录
cd /home/ec2-user
# 后续操作保持不变
sudo yum update -y
sudo yum search docker
...

注:切换目录后,mkdir content这类操作无需sudo,因为ec2-user拥有家目录的权限。

方法2:使用绝对路径指定文件位置

如果需要把文件放在特定目录,直接在脚本中使用绝对路径,比如指定放在/home/ec2-user下:

# 创建content目录到指定路径
mkdir /home/ec2-user/content
# 下载文件到指定路径
aws s3 cp s3://jv-pocho/docker-compose.yaml /home/ec2-user/
aws s3 cp s3://jv-pocho/backup.sql /home/ec2-user/
aws s3 cp s3://jv-pocho/dns-updater.sh /home/ec2-user/
aws s3 sync s3://jv-pocho/images/ /home/ec2-user/content/images
aws s3 sync s3://jv-pocho/themes/ /home/ec2-user/content/themes
# 指定docker-compose配置文件路径启动服务
docker-compose -f /home/ec2-user/docker-compose.yaml up -d
# 导入备份时指定绝对路径
docker exec -i db_jv sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /home/ec2-user/backup.sql
rm /home/ec2-user/backup.sql
chmod +x /home/ec2-user/dns-updater.sh

快速验证

登录实例后直接查看根目录,就能找到之前下载的文件:

ls /
ls /content

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:25:22