问题描述
我正在编写一个简单的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。权限是determined的有效用户ID,而不是真实的用户ID。
Tests
/etc/passwd
按给定顺序包含以下用户ID为0
的用户名:
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
第三种解决方案
作为@Lekensteyn said,您应该使用有效的用户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
...
如果当前用户不是root
,则运行上述操作将打印You must be root to do this.
。
注意:在某些情况下,另一种方法是简单地检查$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快捷方式,您可以避免调用系统命令,优先查询in-memory变量。
代码重用:
function amIRoot() {
! ((${EUID:-0} || "$(id -u)"))
}
第七种方案
使脚本只能由root运行的一种简单方法是使用以下行启动脚本:#!/bin/su root