通过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
相关产品推荐
相关产品推荐

