【问题标题】:$HOME is not set for ec2-user during commands in User Data run在用户数据运行中的命令期间未为 ec2-user 设置 $HOME
【发布时间】:2020-11-08 05:15:15
【问题描述】:

我将以下命令放入运行 RedHat 8 AMI (ami-0fc841be1f929d7d1) 的 EC2 的用户数据中,当它们运行时,mkdir 尝试在根目录创建 .kube,在我看来,$HOME 未设置在时间。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

以下是来自/var/log/user-data.log的日志

+ mkdir -p /.kube
+ sudo cp -i /etc/kubernetes/admin.conf /.kube/config
++ id -u
++ id -g
+ sudo chown 0:0 /.kube/config

当我通过 SSH 连接到实例时,$HOME 被正确设置为 /home/ec2-user。

你能告诉我这里做错了什么吗?

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-ec2


    【解决方案1】:

    $HOME 指的是登录用户的主目录。 userdata在root用户下运行,root用户$HOME/。这就是你看到的结果。

    您的脚本应将/home 作为文字引用,而不是变量$HOME

    https://superuser.com/questions/271925/where-is-the-home-environment-variable-set

    【讨论】:

    • $HOME 用户 root 是 /root 而不是 /
    • 虽然确实 root 是用户 $HOME 并没有定义,而且另一个用户评论 root 的主目录是 /root 而不是 /。硬编码文字也是不好的做法。
    • Yes 通常硬编码是不好的做法,但对于标准文件系统路径/etc/var/log/home 是合适的。在上述非登录 shell 下,这是最好的解决方案,因为在该环境中没有名为 $HOME 的变量。如果您愿意,那么只需将该值设置在用户数据的开头,例如HOME=/home。有关标准文件系统路径的更多信息,请参阅access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
    【解决方案2】:

    您以 sudo 身份运行,众所周知,这会更改与您的用户 shell(例如 $HOME)以及基于 shell 上下文(例如 ssh-agent)建立的环境变量。

    通常,您可以通过在 /etc/sudoers 中添加以下行将其添加到 sudoers 配置中的 env_keep 设置来确保运行 sudo 时这种情况持续存在。更多信息可在here 获得,修改此文件时要小心。

    Defaults  env_keep=HOME
    

    否则,如果您不想进行上述更改,请确保您有权在不运行 sudo 或传入绝对路径值的情况下执行此操作。

    无论如何,对于重要的配置,我通常会避开用户数据, 而是使用 AnsibleChefPuppet 等配置工具,按照您想要的方式提前构建一个预烘焙的 AMI。

    或者因为无论如何这都在用户数据中,您不太可能已经配置了 sudoers 配置,您应该只指定路径。

    【讨论】:

      【解决方案3】:

      配置您的 EC2 服务器后,用户数据脚本以 root 用户身份运行,因此 $HOME 为空。您可以做的是在用户数据脚本的顶部定义 HOME env var,如下所示(在此处插入用户的主目录):

      export HOME=/home/ubuntu
      

      我已经尝试过了,它可以工作(我安装了 NVM、SDKMAN、sbt、java、git、docker;一切正常)。您可能需要在用户数据脚本的末尾执行一些 chown 以将某些文件的所有者更改回您的用户。例如,如果您的用户数据在您的主目录中设置了一些文件:

      chown ubuntu ~/.foo/bar.properties
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。将此添加到用户数据脚本有助于解决它。子 shell 将设置 HOME 并更改为配置文件。

        cat > /etc/profile.d/set_home.sh << 'EOF'
        export HOME=~
        EOF
        chmod a+x /etc/profile.d/set_home.sh
        

        【讨论】:

          猜你喜欢
          • 2017-02-04
          • 2018-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-05
          • 1970-01-01
          相关资源
          最近更新 更多