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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:05:26