Linux 如何判断当前程序是否为root启动?

发布时间 2023-03-30 09:27:31作者: 明明1109

需求

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);
}

参考

https://www.jianshu.com/p/2f4c56470856