我正在编写一个需要根级权限的脚本,我想让它这样做,如果脚本不是以根身份运行,它只是回显“请以根身份运行”并退出。
下面是我正在寻找的一些伪代码:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
我怎样才能最好地(干净和安全地)完成这个任务呢?谢谢!
啊,只是澄清一下:(做东西)部分将涉及运行本身需要root的命令。因此,作为一个普通用户运行它只会出现一个错误。这只是为了干净地运行一个需要根命令的脚本,而不需要在脚本中使用sudo,我只是在寻找一些语法糖。
检查你是否是root用户,如果不是就退出:
if ((EUID != 0)); then
echo "Root or Sudo Required for script ( $(basename $0) )"
exit
fi
或者在本例中,尝试在根位置创建目录,然后在提升权限后再尝试。
检查你是否是root,如果可能的话,如果不是elevate:
# Fails to create these dirs (needs sudo)
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)
if ((EUID != 0)); then
echo "Granting root privileges for script ( $(basename $0) )"
if [[ -t 1 ]]; then
sudo "$0" "$@"
else
exec 1> output_file
gksu "$0" "$@"
fi
exit
fi
echo "Root privileges granted..."
# Creates Dirs as it now has rights
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)
在bash脚本中,有几种方法可以检查正在运行的用户是否是root用户。
作为警告,不要使用root用户名检查用户是否为root。没有什么能保证ID为0的用户被称为root。这是一个被广泛遵循的强大约定,但任何人都可以为超级用户重命名其他名称。
我认为使用bash时最好的方法是使用$EUID,从手册页:
EUID Expands to the effective user ID of the current user, initialized
at shell startup. This variable is readonly.
这是一种比$UID更好的方法,因为$UID可以更改,并且不能反映运行脚本的真实用户。
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
我解决这类问题的一种方法是,当我的命令不是以root身份运行时,在命令中注入sudo。这里有一个例子:
SUDO=''
if (( $EUID != 0 )); then
SUDO='sudo'
fi
$SUDO a_command
这样,当使用超级用户时,我的命令由root运行,当由普通用户运行时,由sudo运行。
如果您的脚本总是由根用户运行,只需相应地设置权限(0500)。