shell脚本运行时切换到超级用户

shell脚本运行时切换到超级用户

我有一个 shell 脚本,其中包含以下几行:

CURRENT_USER=${USER}
echo $CURRENT_USER
su
echo switch to `who am i`

执行第二行后,shell 会提示我输入 root 密码。在我提供正确的密码并以管理员身份登录后,最后一行不会被执行。

这个问题的原因可能是什么?

答案1

su启动一个新的 shell(或运行其他命令)。它不会神奇地切换当前 shell 的 UID。如果您exit在输入密码后键入,您将看到脚本继续执行该echo语句(但以原始用户身份,而不是 root 用户身份)。

您可以将应以 root 身份执行的脚本部分放入单独的脚本中,然后使用su. (或者有些人使用该技巧的变体。)

答案2

就 shell 而言,su它是一个与其他命令一样的命令。当您su不带参数运行时,它会提示输入 root 密码,然后像往常一样调用交互式 shell。一旦此交互式 shell 退出,脚本就会继续执行下一个命令。

将命令传递给su而不需要太多引用麻烦,最简单的方法是使用这里的文档。使用字面heredoc(其中引用输入结束标记)以避免引用令人头疼的问题。请注意,父脚本的 shell 变量对于以 root 身份执行的脚本不可用:只有环境变量(导出的)可用。例子:

ADD_USER=john
ADD_TO_GROUP=fiddlers
export ADD_USER ADD_TO_GROUP
su <<'EOF'
adduser "$ADD_USER" "$ADD_TO_GROUP"
EOF
# more commands executed as the original user

答案3

运行su会启动一个新命令(默认为 shell)。

为了使这项工作有效,请尝试这样的事情:

#!/bin/bash
if [ `id -u` = 0 ]; then
    # Do our real work as root
else
    su -c $0
fi

相关内容