Answers:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
if ((EUID)); then
,请参阅@geirha的评论
sudo
。如果您运行sudo sh -c 'echo $EUID'
,将会看到预期的结果。
$EUID
是一种Bashism(正如@DavidFoerster上文所述),您/bin/sh
很可能是/bin/dash
,而不是的链接/bin/bash
。sudo bash -c 'echo $EUID'
将产生预期的结果。
root用户不必被命名为“ root”。whoami
返回具有用户ID的第一个用户名0
。$USER
包含已登录用户的名称,可以具有用户ID 0
,但名称不同。
唯一可靠的程序,用于检查帐户是否以root用户身份登录:
id -u
我使用-u
的有效用户ID,而不是-r
为真正的用户ID。权限判断由有效用户ID,而不是真正的一个。
/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
id -u
参加bashaskubuntu.com/questions/30148/…–
sh
(dash
)而不是来保持与POSIX的兼容性bash
。但是射门好,节省了另一把叉子:)
[ -w / ]
。这个想法保持不变。注意:在某些chroot中,[ -w /etc/shadow ]
将由于/etc/shadow
不存在而失败,因此/
首选使用。一种更好的方法是检查对root权限的实际需求。如果脚本需要写入/etc/someconfig
,只需检查该文件是否可写或该文件不存在且/etc
可写。
正如@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
((..))
来测试数字,以及[[..]]
测试字符串和文件,所以我会if (( EUID != 0 )); then
改用或者仅仅是if ((EUID)); then
EUID
应该成为$EUID
。代替使用(( $EUID != 0 ))
,使用[ $EUID != 0 ]
。它也可以使用dash
。
EUID
很好。该问题被标记为bash
not dash
。该命令env -i sh -c '[ $EUID != 0 ]'
失败,但是env -i bash -c '(( EUID != 0 ))'
有效。顺便说一句,dash
不适用于Ubuntu stackoverflow.com/questions/5160125/上的某些非ascii字符。现在是2011年,有人使用其他语言。
$EUID
。结果,我更改了接受的答案。
您可以使用以下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' ]
$USER
,尤其是这种方式。$USER
是由登录shell设置的,因此不必传播到程序(env -i sh -c 'echo $USER'
)。这样,它$USER
为空,并且发生语法错误。
$USER
由外壳设置,而且它很容易被欺骗。Whoami将返回实际用户。
$USER
由您的shell解释,您的示例应该sudo sh -c 'echo $USER'
是有意义的。@George:它使错误的假设whoami
总是返回root
的UID 0
考虑到效率,您可以首先测试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)"))
}
id -u
。请在此处查看基准脚本及其下面的结果:pastebin.com/srC3LWQy
使脚本只能由root用户运行的一种简单方法是使用以下行启动脚本:
#!/bin/su root
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
echo 1
else
echo 0
fi
这个答案只是为了保存一个想法,可能对您中的某些人有所帮助。如果您需要从桌面GUI运行并且需要root特权的脚本,请尝试以下方式:
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
gksudo -w $0 $@
exit
fi
#here go superuser commands, e.g. (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
。