专栏中心

EEPW首页 > 专栏 > Linux用户ID和组ID

Linux用户ID和组ID

发布人:美男子玩编程 时间:2024-08-21 来源:工程师 发布文章

在 Linux 系统中,用户和组 ID 用于识别进程和文件的访问权限。每个进程都有与之关联的实际用户 ID、实际组 ID、有效用户 ID、有效组 ID 以及附属组 ID。


图片


实际用户 ID (Real User ID, UID)

  • 定义:实际用户 ID 是启动进程的用户的 ID。

  • 作用:标识执行该进程的用户。

  • 获取:使用 getuid() 函数可以获取实际用户 ID。


实际组 ID (Real Group ID, GID)

  • 定义:实际组 ID 是启动进程的用户组的 ID。

  • 作用:标识执行该进程的用户组。

  • 获取:使用 getgid() 函数可以获取实际组 ID。


有效用户 ID (Effective User ID, EUID)

  • 定义:有效用户 ID 用于控制进程对文件系统资源的访问权限。

  • 作用:决定进程的访问权限。例如,具有 root 权限的进程可以通过将 EUID 设置为 0 来获得特权操作的权限。

  • 获取:使用 geteuid() 函数可以获取有效用户 ID。


有效组 ID (Effective Group ID, EGID)

  • 定义:有效组 ID 用于控制进程对文件系统资源的访问权限。

  • 作用:与有效用户 ID 类似,决定进程在组级别上的访问权限。

  • 获取:使用 getegid() 函数可以获取有效组 ID。


附属组 ID (Supplementary Group IDs)

  • 定义:附属组 ID 是用户所属的其他组的 ID 列表,除了实际组 ID 和有效组 ID 之外。

  • 作用:允许进程获得多个组的权限,从而可以访问更多的资源。

  • 获取:使用 getgroups() 函数可以获取附属组 ID 列表。


以下代码演示如何获取并打印这些 ID:


#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <grp.h>
int main() {    uid_t uid = getuid();    gid_t gid = getgid();    uid_t euid = geteuid();    gid_t egid = getegid();     printf("Real User ID: %dn", uid);    printf("Real Group ID: %dn", gid);    printf("Effective User ID: %dn", euid);    printf("Effective Group ID: %dn", egid);
    int ngroups = 10;    gid_t groups[10];    if (getgroups(ngroups, groups) == -1) {        perror("getgroups");    } else {        printf("Supplementary Group IDs: ");        for (int i = 0; i < ngroups; i++) {            printf("%d ", groups[i]);        }        printf("n");    }
    return 0;}


了解和正确使用这些 ID 是管理 Linux 系统权限的重要基础。实际用户 ID 和实际组 ID 标识了执行进程的用户和组,而有效用户 ID 和有效组 ID 决定了进程的权限。附属组 ID 则允许进程在多个组中进行操作,灵活性更高。


总结一下这些ID的特点:

  • 实际用户 ID (UID) 和 实际组 ID (GID) 标识了进程的拥有者,即谁启动了这个进程。它们通常不会改变。

  • 有效用户 ID (EUID) 和 有效组 ID (EGID) 用于访问权限控制,决定了进程对系统资源的访问权限。这些 ID 可以在程序运行过程中改变(例如,通过 setuid 系统调用)。

  • 附属组 ID 列出了用户所属的所有其他组,这些组可以给予用户额外的权限。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: Linux

相关推荐

基于ARM的嵌入式Linux系统开发 上

视频 2009-10-22

Kontron与Congatec合作开发安全的嵌入式Linux平台

基于ARM的嵌入式Linux系统开发 中

视频 2009-10-22

linux入门精华

ARM 开发板使用手册 在三星 S3C2410开发板上烧写linux

Linux中的fork与exec系列函数分析

嵌入式系统 2025-08-06

嵌入式Linux优化:加快系统起动和应用起动的过程

视频 2009-10-22

GeForce 590 驱动分支是首个不支持 GTX 9 和 10 系列 GPU 的分支——Linux 版本标志着定义时代显卡的终结

U-BOOT 与 MontaVista Linux 的移植

由于英特尔裁员和公司重组,主要的英特尔 Linux 驱动项目正在消亡

Linus Torvalds 称谷歌工程师提交的 RISC-V 代码为“垃圾”,并表示它“让世界变得更糟糕”

嵌入式系统 2025-08-11

FFT公司9200的板子的资料

Linux 今天 34 岁了

53年后,惠普于1972年推出的总线标准获得了稳定的Linux驱动——通用接口总线拥有惊人的8 MB/s带宽

RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构

2025-12-18

Linux就AI生成代码定下规则:允许Copilot类工具、拒绝劣质AI代码,错误由人类负责

基于ARM的嵌入式Linux系统开发 下

视频 2009-10-22

彻底告别486:Linux内核维护者正式移除英特尔486处理器支持

实时Linux技术:如何在嵌入式LINUX中应用实时特性

视频 2009-10-22
更多 培训课堂
更多 焦点
更多 视频

技术专区