脚本如何检查其是否以 root 身份运行?

脚本如何检查其是否以 root 身份运行?

我正在编写一个简单的 bash 脚本,但我需要它来检查它是否以 root 身份运行。我知道可能有一个非常简单的方法可以做到这一点,但我不知道如何做。

只是为了清楚起见:
编写脚本的简单方法是什么foo.sh,这样命令./foo.sh就会输出0,并且命令sudo ./foo.sh会输出1?

答案1

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi

答案2

根用户不必名为“root”。whoami返回第一个具有用户 ID 的用户名0$USER包含已登录用户的名称,该用户可以具有用户 ID 0,但具有不同的名称。

检查帐户是否以 root 身份登录的唯一可靠程序是:

id -u

-u使用有效的用户 ID,不适-r用于真实的用户 ID。权限包括决定有效的用户 ID,而不是真实的一。

测试

/etc/passwd包含以下0按给定顺序排列的用户 ID 的用户名:

rootx
root2

以 身份登录后root2,得到以下结果:

  • whoamirootx
  • echo $USER:(root2如果程序是在空环境中启动的,则返回一个空字符串,例如env -i sh -c 'echo $USER'
  • id -u0 如您所见,其他程序均未通过本次检查,只有id -u通过了。

更新后的脚本如下:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi

答案3

作为@Lekensteyn 说您应该使用有效用户 ID。您不需要id -u在 bash 中调用:

#!/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

答案4

考虑到效率,您可以先测试EUID环境变量,然后如果不存在,则调用标准id命令:

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

这样,由于或快捷方式,您避免调用系统命令,优先查询内存变量。

代码重用:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}

相关内容