`
阿尔萨斯
  • 浏览: 4398236 次
社区版块
存档分类
最新评论

linux用户标识UID与有效用户标识EUID

 
阅读更多

linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。

当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。

以下通过一个典型问题和代码实例来说明UID和EUID的问题。

【关于linux的passwd命令】
passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:

gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ cd /etc
gaolu@gaolu-desktop:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
gaolu@gaolu-desktop:/etc$
这是出现了矛盾:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的 EUID,而不是执行该程序的UID。
gaolu@gaolu-desktop:/etc$ cd /usr/bin
gaolu@gaolu-desktop:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$
因此,普通用户可以通过passwd程序修改shadow文件内容,完成密码修改。

【让代码说明问题】
#include
#include
#include

int main(void)
{
printf("Current process UID: %ld/n",(long)getuid());
printf("Current process EUID: %ld/n",(long)geteuid());
return 1;
}

执行情况:
gaolu@gaolu-desktop:~$ gcc -o uid uid.c
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ chmod u+s uid //用户主增加权限setuid
gaolu@gaolu-desktop:~$ ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./uid
Current process UID: 1000
Current process EUID: 1000
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ su //切换到root用户
Password:
root@gaolu-desktop:/home/gaolu# ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
root@gaolu-desktop:/home/gaolu# ./uid
Current process UID: 0
Current process EUID: 1000 //有效用户ID为1000
root@gaolu-desktop:/home/gaolu#
root@gaolu-desktop:/home/gaolu#

分享到:
评论

相关推荐

    非常宝贵的LINUX学习笔记

    【linux学习笔记-7】用户标识UID与有效用户标识EUID 【linux学习笔记-8】Linux进程相关系统调用(1) 【linux学习笔记-9】Linux进程相关系统调用(2) 【linux学习笔记-10】Linux进程相关系统调用(3) 【linux学习...

    linux进程创建.doc

    下面是一个实践实例,演示了如何使用 getpid、getppid、getuid、geteuid、getgid、getegid 和 getpwuid 函数来获取进程的 ID、父进程的 ID、用户 ID、有效用户 ID、组 ID 和有效组 ID,以及获取用户的其他信息。...

    Linux下的Capabilities安全机制分析.pdf

    在Linux内核中,Capabilities存储在进程的cred结构中,包括euid(有效用户ID)、suid(保存用户ID)、fsuid(文件系统用户ID)等字段。这些标识符允许进程在运行时灵活地改变用户身份,而Capabilities则决定了进程...

    Linux创建进程

    - **有效用户ID(EUID)**:`geteuid()`返回进程在系统调用时使用的用户ID,这与权限检查有关。 - **组ID(GID)**:`getgid()`返回进程所属的主要组的ID。 - **有效组ID(EGID)**:`getegid()`返回进程在系统调用...

    Linux下C语言编程--进程的创建

    6. **有效组ID (EGID)**:与有效用户ID类似,进程也有一个有效组ID,这同样会影响进程的权限。有效组ID可以通过`getegid()`系统调用来获取。 #### 三、进程的创建 在Linux系统中,创建进程通常使用`fork()`函数。`...

    Linux 深入理解进程权限

    euid(有效用户ID)是进程在执行过程中用于权限检查的主要标识,它决定了进程能否访问某些受保护的资源。suid(保存用户ID)是在特权操作后保留的原始用户ID,以备恢复。而fuid(文件系统用户ID)在处理文件访问权限...

    linux 进程管理学习总结

    此外,进程还有其他属性,如用户ID(UID)、组ID(GID)、有效用户ID(eUID)和有效组ID(eGID),这些属性决定了进程的权限和对文件的访问控制。 在Linux中,进程间的关系通常是层次结构的,即父进程可以创建子...

    Linux原理与应用——专题1:Shell外围.ppt

    - `EUID`:获取当前Shell进程的有效用户ID。 - `HISTCMD`:当前命令在历史命令表中的数字索引。 - `HISTFILE`:Bash历史记录文件的路径,默认为`$HOME/.bash_history`。 - `HISTSIZE`:命令历史文件的大小上限。 - `...

    Linux0.11 进程子系统

    - **权限信息**:`uid`、`euid`等字段记录了进程的有效用户ID和组ID。 - **文件系统信息**:`pwd`和`root`指向进程当前工作目录和根目录的inode,`filp`数组存储了进程打开的文件列表。 #### 三、任务状态段结构 ...

Global site tag (gtag.js) - Google Analytics