我正在编写一个需要root级别权限的脚本,我想这样做,如果脚本不以root身份运行,它只是回应“请以root身份运行”。并退出。
这是我正在寻找的一些伪代码:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
我怎样才能做到最好(干净安全)?谢谢!
啊,只是为了澄清:(做东西)部分将涉及运行内部和自身需要root的命令。因此,以普通用户身份运行它只会出现错误。这只是为了干净地运行需要root命令的脚本,而不在脚本中使用sudo,我只是在寻找一些语法糖。
答案 0 :(得分:326)
$ EUID环境变量保存当前用户的UID。 Root的UID为0.在脚本中使用类似的东西:
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
注意:如果您2: [: Illegal number:
检查顶部是否有#!/bin/sh
并将其更改为#!/bin/bash
。
答案 1 :(得分:69)
在bash脚本中,您有多种方法可以检查正在运行的用户是否为root。
作为警告,请勿使用root
用户名检查用户是否为root用户。没有任何保证ID为0的用户被称为root
。这是一个非常强大的惯例,广泛遵循,但任何人都可以重命名超级用户的另一个名称。
我认为使用 bash 的最佳方法是使用手册页中的$EUID
:
EUID Expands to the effective user ID of the current user, initialized
at shell startup. This variable is readonly.
这是一种比$UID
更好的方法,可以更改,而不是反映运行脚本的真实用户。
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
我处理这种问题的一种方法是在不以root身份运行时在我的命令中注入sudo
。这是一个例子:
SUDO=''
if (( $EUID != 0 )); then
SUDO='sudo'
fi
$SUDO a_command
这样我的命令在使用超级用户时由root运行,或者由普通用户运行时由sudo
运行。
如果您的脚本始终由root运行,只需相应地设置权限(0500
)。
答案 2 :(得分:55)
已经给出了一些答案,但似乎最好的方法是使用:
id -u
这似乎比其他方法更可靠,并且即使脚本通过sudo
运行,它似乎也返回id为0。
答案 3 :(得分:44)
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
或
if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
:)
答案 4 :(得分:29)
正如@wrikken在评论中提到的,id -u
对root来说是一个更好的检查。
此外,通过正确使用sudo
,您可以检查脚本并查看它是否以root身份运行。如果没有,让它通过sudo
回忆自己,然后以root权限运行。
根据脚本的作用,另一个选项可能是为脚本可能需要的任何专门命令设置sudo
条目。
答案 5 :(得分:21)
对用户是root用户进行简单检查。
[[ stuff ]]
语法是在bash中运行检查的标准方法。
error() {
printf '\E[31m'; echo "$@"; printf '\E[0m'
}
if [[ $EUID -eq 0 ]]; then
error "This script should not be run using sudo or as the root user"
exit 1
fi
如果失败,这也假设您要退出1。 error
函数是将输出文本设置为红色的一些天赋(不需要,但如果你问我,那就非常优雅了。)
答案 6 :(得分:11)
0-阅读官方GNU Linux文档,有很多方法可以正确地完成它。
1-确保放置shell签名以避免解释错误:
#!/bin/bash
2-这是我的剧本
#!/bin/bash
if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
echo "Please run as root/sudo"
exit 1
else
#do your stuff
fi
答案 7 :(得分:9)
非常简单的方法就是:
if [ "$(whoami)" == "root" ] ; then
# you are root
else
# you are not root
fi
使用它而不是id
的好处是你可以检查某个非root用户是否正在运行该命令;例如
if [ "$(whoami)" == "john" ] ; then
# you are john
else
# you are not john
fi
答案 8 :(得分:8)
如果脚本确实需要root访问权限,那么其文件权限应该反映出来。使非root用户可执行的根脚本将是一个红旗。我建议您不要使用if
支票来控制访问权限。
chown root:root script.sh
chmod u=rwx,go=r script.sh
答案 9 :(得分:5)
尝试以下代码:
if [ "$(id -u)" != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
OR
if [ `id -u` != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
答案 10 :(得分:3)
id -u
比whoami
要好得多,因为像android这样的系统可能不提供root这个词。
示例:
# whoami
whoami
whoami: unknown uid 0
答案 11 :(得分:3)
据我所知,正确的检查方法是:
if [ $(id -u) = "0" ]; then
echo "You are root"
else
echo "You are NOT root"
fi
请参见“测试根”部分:
答案 12 :(得分:2)
在这个答案中,请明确一点,我假设读者能够阅读bash
和POSIX这样的shell脚本,例如dash
。
我相信这里的解释不多,因为投票率很高的答案可以解释很多问题。
但是,如果有什么需要进一步解释的地方,请随时发表评论,我会尽力填补空白。
bash
解决方案 已验证可以在bash
和root
的GNU sudo
版本4.4.19上运行
#!/bin/bash
function am_i_root {
! (( ${EUID:-0} || $(id -u) ))
}
if am_i_root; then
tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi
由于读取$EUID
标准bash
变量(有效的用户ID号)要比执行id -u
命令来POSIX地查找用户要快很多倍ID,此解决方案将两者组合成一个很好的打包函数。当且仅当$EUID
由于任何原因不可用时,id -u
命令将被执行,以确保无论情况如何,我们都将获得正确的返回值 。< / p>
好吧,如果我没看错的话,上面似乎确实缺少一段代码。
您看到,有许多变量必须要考虑,其中之一是结合性能和可靠性。
已验证可以与dash
一起使用root
的{{1}}版本0.5.8
sudo
尽管您可能不喜欢它,但Linux环境已经多样化了很多。意味着有些人非常喜欢bash
,他们甚至都没有考虑可移植性(POSIX shell)。像我这样的人更喜欢POSIX壳。如今,这是个人选择和需求的问题。
答案 13 :(得分:1)
检查root,如果失败则退出:
func_check_for_root() {
if [ ! $( id -u ) -eq 0 ]; then
echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7
fi
}
func_check_for_root
然后还有whoami和我是谁,如果你想知道谁打电话给那些正在运行剧本的剧本:
it@it-ThinkPad-W510:~$ who am i
it pts/19 2014-06-03 12:39 (:0.0)
it@it-ThinkPad-W510:~$ sudo who am i
[sudo] password for it:
it pts/19 2014-06-03 12:39 (:0.0)
(参见即使用sudo调用它也会给用户ID)
it@it-ThinkPad-W510:~$ sudo whoami
root
因此,
if [ "$(whoami)" == "user" ]; then
echo "Executing the installer script"
else
echo "user is only allowed to execute the installer script"
fi
答案 14 :(得分:0)
使用 id -u,$ EUID和whoami 的问题是,当我伪造根目录时,它们全部给出假阳性,例如:
$ fakeroot
id:
$ id -u
0
EUID:
$ echo $EUID
0
whoami:
$ whoami
root
然后一种可靠的黑客手段是验证用户是否有权访问/ root目录:
$ ls /root/ &>/dev/null && is_root=true || is_root=false; echo $is_root
答案 15 :(得分:-1)
检查root:
ROOT_UID=0 # Root has $UID 0.
if [ "$UID" -eq "$ROOT_UID" ]
then
echo "You are root."
else
echo "You are just an ordinary user."
fi
exit 0
经过测试并以root身份运行。
答案 16 :(得分:-1)
#!/bin/bash
# GNU bash, version 4.3.46
# Determine if the user executing this script is the root user or not
# Display the UID
echo "Your UID is ${UID}"
if [ "${UID}" -eq 0 ]
then
echo "You are root"
else
echo "You are not root user"
fi
编者注:如果您不需要双括号,请使用单一括号来实现代码可移植性。