如果我使用sudo运行Shell脚本,该如何获取正确的$USER?
这些脚本作为Mac安装包中的后安装脚本自动接受sudo权限,但我需要使用用户名做一些事情。
$HOME是正确的,但不太优雅的方法是从主目录路径中提取名称,但我想知道是否有更自然的方法。
由于它是安装程序内部的自动调用,因此我无法影响脚本的调用方式。
如果我使用sudo运行Shell脚本,该如何获取正确的$USER?
这些脚本作为Mac安装包中的后安装脚本自动接受sudo权限,但我需要使用用户名做一些事情。
$HOME是正确的,但不太优雅的方法是从主目录路径中提取名称,但我想知道是否有更自然的方法。
由于它是安装程序内部的自动调用,因此我无法影响脚本的调用方式。
在我的系统中,变量$SUDO_USER
被设置为调用者的用户名。
不应该直接从${HOME}
变量中提取用户名。它是被配置而不是计算出来的。要提取用户名,可以查看/etc/passwd
文件,但这非常依赖于系统,例如有时需要查看LDAP目录或通过NIS传播条目...
$(logname)
,即使您当前正在 sudo 的情况下也会返回您的登录名。echo $LOGNAME
... 但这取决于您的环境变量。 - NerdOfCode检查变量SUDO_USER。
http://www.gratisoft.us/sudo/man/sudo.html#environment
另一个获取用户的方法是通过who命令。当您不关心用户是否已经使用sudo时,这很有用。
who -m | awk '{print $1;}'
SUDO_USER
不是可移植的。在Fedora 17上未设置。
在使用sudo时,$USER
和$UID
变量也是不可预测的。一些发行版报告sudoer,其他发行版报告root用户。
这并不完美,但你可以使用test -w ~root && echo I have write access to ~root
。
logname
而来到这里的人,这个命令好像可以很好地工作:$(logname 2>/dev/null || echo $SUDO_USER)
。 在MacOS上进行了测试。 错误报告:https://bugzilla.gnome.org/show_bug.cgi?id=747046 - tresf