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

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

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

  else (do stuff)
fi

exit

我怎样才能最好地(干净和安全地)完成这个任务呢?谢谢!

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


当前回答

据我所知,正确的检查方法如下:

#!/bin/sh

if [ "$(id -u)" -eq 0 ]; then
    echo "You are root."
else
    echo "You are NOT root." >&2
fi

OP注释:你可以在linuxcommand.org上看到“测试Root”部分。

编者注:我稍微调整了这个shell片段,使其与posix兼容。

其他回答

$EUID环境变量保存当前用户的UID。Root的UID为0。在你的脚本中使用这样的东西:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

注意:如果你得到2:[:非法数字:检查你是否有#!将/bin/sh改为#!/bin/bash。

我的小笑话:

[ "$(whoami)" != root ] && echo "Please, run as root." >&2 && exit 1

在Debian, Ubuntu和Docker下测试。

正如@ wrkken在他的评论中提到的,id -u是一个更好的根检查。

此外,通过正确使用sudo,您可以检查脚本,看看它是否以根用户身份运行。如果不是,让它通过sudo收回自己,然后以根权限运行。

根据脚本的功能,另一个选项可能是为脚本可能需要的任何专门命令设置一个sudo条目。

有一个简单的检查用户是否为root。

# Fancy red-colored `error` function with `stderr` redirection with `exit`.
error ()
{
    { printf '\E[31m'; echo "$@"; printf '\E[0m'; } >&2
    exit 1
}

# Test for root user.
if [ "$EUID" -eq 0 ]; then
    error "Do not run this as the root user"
fi

这还假设如果失败,您希望以1退出。error函数是一种将输出文本设置为红色的功能(不需要,但如果你问我的话,我觉得这很不错)。

id -u比whoami要好得多,因为Android等系统可能不提供root这个词。


示例命令:

# whoami

示例输出:

whoami: unknown uid 0