Answers:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fiif ((EUID)); then,请参阅@geirha的评论
                    sudo。如果您运行sudo sh -c 'echo $EUID',将会看到预期的结果。
                    $EUID是一种Bashism(正如@DavidFoerster上文所述),您/bin/sh很可能是/bin/dash,而不是的链接/bin/bash。sudo bash -c 'echo $EUID'将产生预期的结果。
                    root用户不必被命名为“ root”。whoami返回具有用户ID的第一个用户名0。$USER包含已登录用户的名称,可以具有用户ID 0,但名称不同。
唯一可靠的程序,用于检查帐户是否以root用户身份登录:
id -u我使用-u的有效用户ID,而不是-r为真正的用户ID。权限判断由有效用户ID,而不是真正的一个。
/etc/passwd包含以下具有用户ID的用户名0(按给定顺序):
rootx
root2以身份登录root2,可得到以下结果:
whoami: rootxecho $USER:(root2如果程序是在空环境中启动的,则返回一个空字符串,例如env -i sh -c 'echo $USER')id -u:0
如您所见,其他程序在此检查中失败,仅id -u通过了。更新后的脚本如下所示:
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fiid -u参加bashaskubuntu.com/questions/30148/…–
                    sh(dash)而不是来保持与POSIX的兼容性bash。但是射门好,节省了另一把叉子:)
                    [ -w / ]。这个想法保持不变。注意:在某些chroot中,[ -w /etc/shadow ]将由于/etc/shadow不存在而失败,因此/首选使用。一种更好的方法是检查对root权限的实际需求。如果脚本需要写入/etc/someconfig,只需检查该文件是否可写或该文件不存在且/etc可写。
                    正如@Lekensteyn所说,您应该使用有效的用户ID。您不需要调用id -ubash:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi@geirha在评论中的建议使用算术评估:
#!/bin/bash
if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi((..))来测试数字,以及[[..]]测试字符串和文件,所以我会if (( EUID != 0 )); then改用或者仅仅是if ((EUID)); then
                    EUID应该成为$EUID。代替使用(( $EUID != 0 )),使用[ $EUID != 0 ]。它也可以使用dash。
                    EUID很好。该问题被标记为bashnot dash。该命令env -i sh -c '[ $EUID != 0 ]'失败,但是env -i bash -c '(( EUID != 0 ))'有效。顺便说一句,dash不适用于Ubuntu stackoverflow.com/questions/5160125/上的某些非ascii字符。现在是2011年,有人使用其他语言。
                    $EUID。结果,我更改了接受的答案。
                    您可以使用以下whoami命令来完成此操作,该命令返回当前用户:
#!/bin/bash
if [ `whoami` != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi
...You must be root to do this.如果当前用户不是,则运行上述命令将打印root。
注意:在某些情况下,一种替代方法是简单地检查$USER变量:
if [ $USER != 'root' ]$USER,尤其是这种方式。$USER是由登录shell设置的,因此不必传播到程序(env -i sh -c 'echo $USER')。这样,它$USER为空,并且发生语法错误。
                    $USER由外壳设置,而且它很容易被欺骗。Whoami将返回实际用户。
                    $USER由您的shell解释,您的示例应该sudo sh -c 'echo $USER'是有意义的。@George:它使错误的假设whoami总是返回root的UID 0
                    考虑到效率,您可以首先测试EUID环境变量,然后如果不存在,请调用标准id命令:
if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi这样,由于使用OR快捷方式,您避免调用系统命令,从而优先查询内存中的变量。
代码重用:
function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}id -u。请在此处查看基准脚本及其下面的结果:pastebin.com/srC3LWQy
                    使脚本只能由root用户运行的一种简单方法是使用以下行启动脚本:
#!/bin/su root
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi这个答案只是为了保存一个想法,可能对您中的某些人有所帮助。如果您需要从桌面GUI运行并且需要root特权的脚本,请尝试以下方式:
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 $@
   exit
fi
#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave这样,您将获得一个漂亮的对话框窗口,询问您root用户密码。就像使用命令行sudo一样。
该gksudo可能不会在你的系统中可用然后安装它sudo apt-get install gksu。