最可靠的方法是检查有效用户id(euid)是否为0:c/c++中用geteuid(),shell中用id -u;二者均返回当前进程实际权限依据,避免误判sudo提权等场景。

最可靠的方法是检查有效用户ID(EUID)是否为0,而不是看用户名或真实UID。
用 geteuid() 判断(C/C++程序)
Linux内核以EUID为准决定进程实际权限。即使通过sudo启动,真实UID仍是普通用户,但EUID会变成0。
- 调用 geteuid() 函数,返回值为0即表示拥有root权限
- 避免使用 getuid() —— 它返回的是启动进程时的原始用户ID,sudo下仍为非零值,容易误判
- 示例代码中只需包含
,无需额外链接选项
用 id -u 命令判断(Shell脚本)
在bash、zsh等shell中,推荐使用 id -u 获取当前EUID:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- id -u 默认输出有效UID,不是真实UID;它和 geteuid() 行为一致
- 可直接用于条件判断:
if [ $(id -u) -eq 0 ]; then echo "root"; fi - 比
whoami或id -un更准确——后者只看用户名,无法反映sudo提权后的实际权限状态
其他常见但不推荐的方式
这些方法存在逻辑漏洞,容易在sudo、容器、特权降级等场景下失效:
- whoami:仅比对用户名是否为"root",无法识别 sudo ./prog 这类提权后仍保持原用户名的情况
- 提示符判断($ vs #):纯属交互式终端约定,对后台进程、systemd服务、crontab任务完全无效
- sudo -l:依赖sudo配置,未配置sudo权限的root用户也会提示失败,造成反向误判
- 读取 /etc/passwd 中 UID=0 的行:查的是系统定义,不是当前进程运行身份
权限检测应紧贴实际操作发生前进行,不能仅在程序启动时检查一次。即使EUID=0,也可能因noexec挂载、chattr锁定、SELinux策略等原因导致具体操作失败。










