AWS实例user_data无法在$HOME目录创建文件的原因及解决问询
关于AWS EC2 user_data无法在$HOME目录创建文件的问题解答
原因
user_data脚本默认以root用户身份执行,此时的$HOME环境变量指向root的家目录(/root),而非你登录实例时使用的普通用户(比如Ubuntu的ubuntu、Amazon Linux的ec2-user)的家目录。另外,脚本执行的默认工作目录并非普通用户的家目录,因此使用相对路径创建的文件会生成在root用户的工作目录(通常是/)或root的家目录里,而非你预期的普通用户$HOME路径。
解决方法
针对Ubuntu实例(你的示例环境),可以通过以下几种方式在普通用户的$HOME目录创建文件:
1. 直接指定普通用户的家目录绝对路径
明确写出目标用户的家目录路径,比如Ubuntu默认普通用户ubuntu的家目录是/home/ubuntu:
touch /home/ubuntu/2.txt
2. 切换到普通用户执行命令
使用sudo -u切换到目标用户,确保命令在该用户的环境下执行,此时$HOME会解析为该用户的家目录:
sudo -u ubuntu bash -c 'cd $HOME && touch 2.txt'
3. 动态获取用户家目录(兼容不同AMI)
如果需要适配不同的AMI(比如Amazon Linux用ec2-user,CentOS用centos),可以通过getent命令动态获取用户的家目录:
# 替换为目标用户名,比如ubuntu/ec2-user/centos TARGET_USER="ubuntu" USER_HOME=$(getent passwd $TARGET_USER | cut -d: -f6) touch $USER_HOME/2.txt
修改后的Terraform示例代码
resource "aws_instance" "ubuntu" { ami = var.ubuntu_ami instance_type = var.ubuntu_instance_type subnet_id = aws_subnet.ubuntu_subnet.id associate_public_ip_address = "true" key_name = var.key_name vpc_security_group_ids = [aws_security_group.standard_sg.id] user_data = <<-BOOTSTRAP #!/bin/bash touch /etc/1.txt # 该文件会创建在/etc/1.txt # 方法1:直接指定普通用户家目录 touch /home/ubuntu/2.txt # 方法2:切换用户执行,确保$HOME为目标用户家目录 sudo -u ubuntu bash -c 'cd $HOME && touch 3.txt' BOOTSTRAP tags = { Name = "${var.project}_eks_master_${count.index + 1}" } }
内容的提问来源于stack exchange,提问作者nyxx88
相关产品推荐
相关产品推荐

