如何检查是否在bash脚本中以root身份运行

时间:2013-08-13 17:56:37

标签: bash shell root

我正在编写一个需要root级别权限的脚本,我想这样做,如果脚本不以root身份运行,它只是回应“请以root身份运行”。并退出。

这是我正在寻找的一些伪代码:

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

我怎样才能做到最好(干净安全)?谢谢!

啊,只是为了澄清:(做东西)部分将涉及运行内部和自身需要root的命令。因此,以普通用户身份运行它只会出现错误。这只是为了干净地运行需要root命令的脚本,而不在脚本中使用sudo,我只是在寻找一些语法糖。

17 个答案:

答案 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
  • 如果以root身份运行,则返回id为0。

这似乎比其他方法更可靠,并且即使脚本通过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 -uwhoami要好得多,因为像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

请参见“测试根”部分:

http://linuxcommand.org/lc3_wss0080.php

答案 12 :(得分:2)

在这个答案中,请明确一点,我假设读者能够阅读bashPOSIX这样的shell脚本,例如dash

我相信这里的解释不多,因为投票率很高的答案可以解释很多问题。

但是,如果有什么需要进一步解释的地方,请随时发表评论,我会尽力填补空白。

针对性能和可靠性的优化bash解决方案

已验证可以在bashroot的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>

为什么我在OP询问了这么多年后才发布此解决方案

好吧,如果我没看错的话,上面似乎确实缺少一段代码。

您看到,有许多变量必须要考虑,其中之一是结合性能和可靠性


POSIX解决方案

已验证可以与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

编者注:如果您不需要双括号,请使用单一括号来实现代码可移植性。