我有一个 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