我正在编写一个简单的 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
,得到以下结果:
whoami
:rootx
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
答案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)"))
}