使用sudo运行shell脚本时如何获取$USER?

45

如果我使用sudo运行Shell脚本,该如何获取正确的$USER?

这些脚本作为Mac安装包中的后安装脚本自动接受sudo权限,但我需要使用用户名做一些事情。

$HOME是正确的,但不太优雅的方法是从主目录路径中提取名称,但我想知道是否有更自然的方法。

由于它是安装程序内部的自动调用,因此我无法影响脚本的调用方式。

4个回答

44

在我的系统中,变量$SUDO_USER被设置为调用者的用户名。

不应该直接从${HOME}变量中提取用户名。它是被配置而不是计算出来的。要提取用户名,可以查看/etc/passwd文件,但这非常依赖于系统,例如有时需要查看LDAP目录或通过NIS传播条目...


4
对于因gnome-terminal不再支持logname而来到这里的人,这个命令好像可以很好地工作:$(logname 2>/dev/null || echo $SUDO_USER)。 在MacOS上进行了测试。 错误报告:https://bugzilla.gnome.org/show_bug.cgi?id=747046 - tresf
logname 2>/dev/null || echo $SUDO_USER,这个命令在Ubuntu 16.04.6 LTS和Ubuntu 20.04 LTS操作系统中对我很有效。 - Syed Faraz Umar

28
您可以使用$(logname),即使您当前正在 sudo 的情况下也会返回您的登录名。

3
@Knetic为了你和其他谷歌员工的未来参考,这可能并不是一个问题:https://bugzilla.gnome.org/show_bug.cgi?id=747046 - muru
它在Ubuntu 16.04.1 LTS上返回sudo名称。 - Adnan
在 Arch Linux 上,我建议使用 echo $LOGNAME... 但这取决于您的环境变量。 - NerdOfCode

19

9

SUDO_USER不是可移植的。在Fedora 17上未设置。

在使用sudo时,$USER$UID变量也是不可预测的。一些发行版报告sudoer,其他发行版报告root用户。

这并不完美,但你可以使用test -w ~root && echo I have write access to ~root


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接