Bash:如果脚本没有以root身份运行,则失败

15

我有一个安装某些软件的Bash脚本。如果它没有以root身份运行,我希望尽早失败。我应该如何做?


1
虽然我通常认为这是愚蠢的行为:“让它运行直到权限失败”;但系统可能设置成当前用户可以成功执行该操作,并且通过强制使用root,这个选项被取消了(之前我曾经修复过类似假设的脚本)。另一方面,如果以root身份运行,我更倾向于阻止访问或显示一个大而明显的警告。 - user166390
你应该尝试使用sudo。在Linux下,当你安装任何东西时,你需要以root身份运行,以防止普通用户安装任何可能损坏系统的东西。 - Eligio Becerra
1
他希望他的脚本考虑到有些人可能会忘记或不知道sudo(或其他特权升级方式)。在尝试执行任何其他操作之前,检查运行时的健全性是一个好习惯。 - Tim Post
2个回答

28

如果要缩短代码,可以检查UID环境变量: if [[ $UID -ne 0 ]]; then - zlack
1
@zlack $UID会在通过sudo运行脚本时给出原始用户的UID,而David的则将脚本视为以root身份运行。根据你要做什么,David的可能更好。 - pr1001
正如pr1001所说,如果用户使用sudo运行脚本,则UID将无法工作,但EUID将可以正常工作。 - Tom

9

在这方面进行深入挖掘后,一致的看法似乎是在bash中不需要使用id -u,因为EUID(有效用户ID)变量将被设置。与UID相反,当用户是root或使用sudo时,EUID将为0。显然,这比运行id -u要快约100倍:

#!/bin/bash
if (( EUID != 0 )); then
    echo "You must be root to do this." 1>&2
    exit 1
fi

来源:https://askubuntu.com/questions/30148/how-can-i-determine-whether-a-shellscript-runs-as-root-or-not

如何确定shell脚本是否以root身份运行:

您可以使用以下代码:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

这将检查当前用户的UID是否为0(即root)。如果不是,则输出错误消息并退出脚本。


2
这在Bourne shell中不起作用。您有任何严格遵循POSIX标准的解决方案吗? - Janus Troelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接