#? Description:
#? Get the user's home directory by username regardless of whether is running with `sudo`.
#? The username is checked, it must exist, to avoid the arbitrary code execution of `eval`.
#? The returned home directory's existence is not checked.
#?
#? Usage:
#? @home USERNAME
function home () {
if id "$1" >/dev/null 2>&1; then
eval echo "~$1"
else
return 255
fi
}
7条答案
按热度按时间b4lqfgs41#
尽量避免eval,尤其是根烫发。
您可以:
here是避免eval的原因。
kd3sttzy2#
用户的主目录为
~$SUDO_USER
。可以按如下方式使用eval
:kmynzznz3#
因此,您可以访问
$SUDO_USER
并使用getent passwd $SUDO_USER | cut -d: -f6
向系统请求他的homedir。6ovsh4lw4#
尝试访问环境变量$SUDO_USER
n53p2ov05#
除非我误解了这个问题,否则当用户使用sudo运行脚本时,
$HOME
环境变量不会改变。...并运行它:
输出:
输出告诉我
$HOME
仍然指向用户的home(在本例中为 /home/haiv)。lvjbypge6#
这是对eval解决方案的一点改进。
在将username变量发送到
eval
之前,请测试用户是否存在,如果存在任意代码,它将无法通过检查。在macOS上运行代码:
输出:
如果您运行类似于以下内容的代码:
它什么也不给并返回一个错误,
ls
将不会被执行。sh7euo9m7#
你可以使用Hai的不完整答案来非常简单地构造用户的主目录,他和其他人正确地指出,你可以在sudo shell中获得原始用户,你可以使用它来构造主目录到一个名为user_home的新变量中(或者任何你喜欢的变量):