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

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

要明确一点:
编写脚本foo.sh的简单方法是什么,以便命令./foo.sh输出0 ,命令sudo ./foo.sh输出1

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

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

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

 id -u 

我使用-u作为有效用户ID,而不是-r作为真实用户ID。 权限由有效用户ID 确定 ,而不是真实用户ID。

测试

/etc/passwd包含以下给定顺序中用户ID为0用户名:

 rootx root2 

root2身份root2 ,提供下一个结果:

  • whoamirootx
  • echo $USERroot2 (如果程序在空的环境中启动,则返回一个空字符串,例如env -i sh -c '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 

正如@Lekensteyn所说,你应该使用有效的用户ID。 你不需要在bash中调用id -u

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

您可以使用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' ] 
 #!/bin/bash [[ $(id -u) != 0 ]] echo $? 

考虑到效率,您可以首先测试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)")) } 

使脚本只能由root运行的一种简单方法是使用以下行启动脚本:
#!/bin/su root

 #!/bin/bash uid=`id -u` if [ "$uid" == "0" ] then echo 1 else echo 0 fi 

这个片段会:

  • 检查不同的会话
  • 建议使用sudo !!
  • 并返回错误
 if [“$(whoami&2> / dev / null)”!=“root”] && [“$(id -un&2> / dev / null)”!=“root”]
      然后
       echo“你必须是root才能运行这个脚本!”
      回声“使用'sudo !!'”
       1号出口
科幻

这个答案只是为了保存一个想法可能对你们中的一些人有所帮助。 如果您需要从桌面GUI运行并需要root权限的脚本,请尝试以下方式:

 #!/bin/bash if ! [ $(id -u) = 0 ]; then gksudo -w $0 $@ exit fi #here go superuser commands, eg (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安装它。