脚本如何检查它是否以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
,提供下一个结果:
-
whoami
:rootx
-
echo $USER
:root2
(如果程序在空的环境中启动,则返回一个空字符串,例如env -i sh -c 'echo $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 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
安装它。