Mal*_*rba 160 bash root scripts
我正在编写一个简单的 bash 脚本,但我需要它来检查它是否以 root 身份运行。我知道可能有一种非常简单的方法可以做到这一点,但我不知道该怎么做。
只是要清楚:
编写脚本foo.sh的简单方法是什么,以便命令./foo.sh
输出0
,命令sudo ./foo.sh
输出1
?
ane*_*hep 214
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
Lek*_*eyn 141
root 用户不必命名为“root”。whoami
返回带有用户 ID 的第一个用户名0
。$USER
包含登录用户的名称,该名称可以具有用户 ID 0
,但具有不同的名称。
检查帐户是否以 root 身份登录的唯一可靠程序:
id -u
Run Code Online (Sandbox Code Playgroud)
我-u
用于有效用户 ID,而不是-r
用于真实用户 ID。权限判断由有效用户ID,而不是真正的一个。
/etc/passwd
0
按给定顺序包含以下带有用户 ID 的用户名:
rootx
root2
Run Code Online (Sandbox Code Playgroud)
以 身份登录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
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 37
正如@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
Run Code Online (Sandbox Code Playgroud)
@geirha 从评论中提出的建议使用算术评估:
#!/bin/bash
if (( EUID != 0 )); then
echo "You must be root to do this." 1>&2
exit 100
fi
Run Code Online (Sandbox Code Playgroud)
Nat*_*man 22
您可以使用whoami
返回当前用户的命令来完成此操作:
#!/bin/bash
if [ `whoami` != 'root' ]
then
echo "You must be root to do this."
exit
fi
...
Run Code Online (Sandbox Code Playgroud)
You must be root to do this.
如果当前用户不是 ,则运行上面的将打印root
。
注意:在某些情况下,另一种方法是简单地检查$USER
变量:
if [ $USER != 'root' ]
Run Code Online (Sandbox Code Playgroud)
Luc*_*ein 12
考虑到效率,您可以先测试EUID
环境变量,如果不存在,则调用标准id
命令:
if ((${EUID:-0} || "$(id -u)")); then
echo You are not root.
else
echo Hello, root.
fi
Run Code Online (Sandbox Code Playgroud)
这样,由于OR 快捷方式,您可以避免调用系统命令,从而优先查询内存中的变量。
代码重用:
function amIRoot() {
! ((${EUID:-0} || "$(id -u)"))
}
Run Code Online (Sandbox Code Playgroud)