判断脚本是否由root用户执行,核心是检查当前进程的有效用户id(euid)是否为0;推荐用id -u做数值判断,因其稳定、语义清晰、跨环境兼容,而whoami在无utmp环境可能失败,$user等环境变量易被伪造,不可靠。

判断脚本是否由 root 用户执行,核心是检查当前进程的**有效用户 ID(EUID)是否为 0**,因为只有 EUID=0 才代表拥有 root 权限。不能依赖登录名、环境变量或会话状态,这些都可能被绕过或不一致。
推荐方式:用 id -u 或 id -ru
这是最稳定、语义清晰、跨环境兼容的做法:
-
id -u返回当前进程的 real UID —— 多数情况下与 EUID 相同;在普通 root 登录或直接以 root 运行时返回 0 -
id -ru明确返回 real UID,id -un返回 real UID 对应用户名,id -run返回 effective UID 对应用户名(等价于whoami) - 脚本中写成:
if [ "$(id -u)" -eq 0 ]; then ...,简洁可靠,cron、systemd、容器中均适用
可用但需注意局限:用 whoami
whoami 实际调用 geteuid(),输出 EUID 对应的用户名,所以 whoami 为 root 通常意味着 EUID=0。
- 优点:直观易读,适合快速校验
- 缺点:在无 utmp 环境(如某些 init 启动的服务、精简容器)中可能失败或返回
nobody - 不建议用于关键权限控制逻辑,尤其不能替代
id -u做数值判断
不推荐的方式:依赖 $USER 或 $HOME
这些是 shell 环境变量,极易被伪造或继承异常:
-
$USER可能仍是原用户(如sudo -u nobody ./script.sh中仍显示你的用户名) -
$HOME在sudo ./script.sh下默认指向/root,但实际执行者未必有 root 权限 - 用
[ "$USER" = "root" ]判断会漏掉 sudo 提权场景,也容易被环境污染误导
编程语言中应直接调用系统接口
在 C/C++ 等语言中,应使用 geteuid() 函数判断:
if (geteuid() == 0) { /* is root */ }- 不要用
getuid(),它返回真实 UID,在sudo场景下仍是普通用户 ID,会导致误判 - 该方式绕过所有字符串解析和外部命令调用,效率高、无依赖、内核级权威











