为何sudo -H未设置HOME变量?Manjaro系统技术求助
嘿,我来帮你拆解下这个问题——你大概率是忽略了sudo的环境变量处理逻辑或者命令解析时机的问题,具体来看:
sudo默认会重置环境变量
包括Manjaro在内的大部分Arch系发行版,sudo默认开启了**env_reset**配置(你可以在/etc/sudoers里找到这个选项)。这个配置会重置大部分环境变量到目标用户的默认值——默认情况下sudo会切换到root用户,所以$HOME会被设置为/root,而不是你在/etc/passwd里定义的/home/laurence。如果你想在sudo执行时使用自己的主目录(比如以自己的用户身份执行命令),需要加上**
-H**选项(强制设置HOME为目标用户的主目录),比如执行:sudo -u laurence -H echo $HOME这时候输出就会是
/home/laurence。命令行变量解析的时机陷阱
如果你直接跑sudo echo $HOME,这里的$HOME其实是在普通用户的Shell里先被解析,然后才把解析后的结果传给sudo执行。举个例子:如果你普通用户的$HOME是/home/laurence,那这条命令实际等价于sudo echo /home/laurence——sudo只是执行echo命令输出这个字符串,根本没用到自己环境里的$HOME变量。如果你想查看sudo环境下的
$HOME值,得用单引号把变量包起来,让sudo的Shell去解析:sudo sh -c 'echo $HOME'这时候才会显示sudo目标用户的
$HOME值。混淆了当前工作目录和用户主目录
如果你执行的是sudo pwd,那输出的是当前的工作目录,而不是用户的主目录。比如你在/tmp目录下执行这条命令,输出就是/tmp,和/etc/passwd里的主目录设置完全无关。这时候要查看用户主目录,应该用:sudo getent passwd laurence | cut -d: -f6或者前面提到的
sudo sh -c 'echo $HOME'。
另外,你可以检查/etc/sudoers里的**Defaults env_keep**配置,如果里面包含HOME,那sudo会继承你的$HOME,但默认情况下这个选项是不开启的——出于安全考虑,sudo会重置环境变量来避免潜在的风险。
内容的提问来源于stack exchange,提问作者the.laurence

