Linux 如何判断当前程序是否为root启动?
需求
Linux程序中,常有这样的需求:判断当前程序是否为root权限启动。如果是,正常运行;如果不是,则打印日志,退出程序。
root用户特点
要判断是否为root权限启动,可以先看看root用户特点。root用户典型特点:UID(用户id)为0,GID(组id)为0。
每个用户有对应唯一UID值,可分成三类用户:
1)超级用户UID 0:root用户默认0;
2)系统用户UID 1~999:系统服务由不同用户运行,更安全,不过默认被限制登录;
3)普通用户UID 1000~:管理员创建的、用于日常工作地普通用户。
- 终端查看用户UID
如果在终端环境,可以通过命令查看:
$ cat /etc/passwd
运行查看到结果如下:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
每行用户信息格式:
用户名:密码:UID:GID:描述性信息:主目录:默认Shell
其中,shell为/bin/bash,表示可以登录;/sbin/nologin 表示不可以登录。
- 终端查看用户组GID
如果在终端环境,可以通过命令查看:
$ cat /etc/group
运行查看到如下结果:
root:x:0:
daemon:x:1:
bin:x:2:
...
每行用户组信息格式:
组名:密码:GID:该用户组中的用户列表
其中,组密码保存在/etc/gshadow,用户组密码通常没用;组中的用户列表只包括附加用户,如果该组是某个用户端初始组,则该用户不会出现在这个用户列表中。
C程序判断是否为root用户
有了root用户特点,就可以通过运行当前程序的用户UID是否为0,判断程序是否以root用户运行。
bool sysutil_running_as_root(void)
{
return (getuid() == 0);
}
如果对于非root权限启动,可以加上非root用户的异常处理。
void die_unless_privileged(void)
{
if (!sysutil_running_as_root())
{
die("target must be started as root");
}
}
void die(const char* p_text)
{
_exit(2);
}