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

bvuwiixz  于 2023-01-21  发布在  Shell
关注(0)|答案(7)|浏览(243)

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

b4lqfgs4

b4lqfgs41#

尽量避免eval,尤其是根烫发。
您可以:

USER_HOME=$(getent passwd $SUDO_USER | cut -d: -f6)
    • 更新日期:**

here是避免eval的原因。

kd3sttzy

kd3sttzy2#

用户的主目录为~$SUDO_USER。可以按如下方式使用eval

USER_HOME=$(eval echo ~${SUDO_USER})
echo ${USER_HOME}
kmynzznz

kmynzznz3#

$ sudo env |grep USER
USER=root
USERNAME=root
SUDO_USER=glglgl

因此,您可以访问$SUDO_USER并使用getent passwd $SUDO_USER | cut -d: -f6向系统请求他的homedir。

6ovsh4lw

6ovsh4lw4#

尝试访问环境变量$SUDO_USER

n53p2ov0

n53p2ov05#

除非我误解了这个问题,否则当用户使用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(在本例中为 /home/haiv)。

lvjbypge

lvjbypge6#

这是对eval解决方案的一点改进。
在将username变量发送到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将不会被执行。

sh7euo9m

sh7euo9m7#

你可以使用Hai的不完整答案来非常简单地构造用户的主目录,他和其他人正确地指出,你可以在sudo shell中获得原始用户,你可以使用它来构造主目录到一个名为user_home的新变量中(或者任何你喜欢的变量):

#user_home="/home/${$SUDO_USER}";

相关问题