我有一个需要以root身份运行的sh脚本,但是它由最终用户使用sudo运行。当运行sudo时,如何〜/指向/ root时如何获取用户主目录?
答案 0 :(得分:42)
尽量避免使用eval。特别是根烫发。
你可以这样做:
USER_HOME=$(getent passwd $SUDO_USER | cut -d: -f6)
<强>更新强>
here是避免评估的原因。
答案 1 :(得分:27)
用户的主目录为~$SUDO_USER
。您可以按如下方式使用eval
:
USER_HOME=$(eval echo ~${SUDO_USER})
echo ${USER_HOME}
答案 2 :(得分:8)
$ sudo env |grep USER
USER=root
USERNAME=root
SUDO_USER=glglgl
因此,您可以访问$SUDO_USER
并通过getent passwd $SUDO_USER | cut -d: -f6
向系统询问其homedir。
答案 3 :(得分:4)
尝试访问环境变量$ SUDO_USER
答案 4 :(得分:1)
除非我误解了这个问题,否则当用户使用sudo运行脚本时,$HOME
环境变量不会更改。为了测试,我创建了这个脚本:
#!/bin/bash
#sudo_user.sh
env | grep -e USER -e HOME
...并运行它:
sudo ./sudo_user.sh
输出:
USER=root
HOME=/home/haiv
USERNAME=root
SUDO_USER=haiv
输出告诉我$HOME
仍然指向用户的家(在这种情况下, / home / haiv )。
答案 5 :(得分:0)
对 eval 解决方案进行了一些改进。
在将用户名变量发送到eval
之前,先用用户是否存在来测试它,所以如果有任意代码,它不会通过检查。
#? 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
}
在 macOS 上运行代码:
$ home root
输出:
/var/root
如果您使用以下内容运行它:
home 'root ; ls'
它什么也没给出并返回一个错误,ls
不会被执行。