以root身份运行脚本时获取用户主目录

时间:2011-09-09 07:51:16

标签: bash shell

我有一个需要以root身份运行的sh脚本,但是它由最终用户使用sudo运行。当运行sudo时,如何〜/指向/ root时如何获取用户主目录?

6 个答案:

答案 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 不会被执行。