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

转载 2011年01月18日 21:44:00

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<stdio.h>
#include<unistd.h>
#include<sys/types.h>
 
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#
 

本文出自 “淡泊明志,宁静致远” 博客,请务必保留此出处http://keren.blog.51cto.com/720558/144908

相关文章推荐

Linux编程中的中断信号和一些标识(sig uid gid pid)

先上代码:#include #include #include #include char *buf;// 自己定义一个中断的处理函数,在main中设定中断进入的条件,并且在中断中处理后事(fr...

C# 全过程用户权限实现策论 (2.成员资格标识)

成员资格标识,在第一篇验证用户代码中使用 public sealed class MemberPrincipal : GenericPrincipal, NXDO.WinUI.Security.I...

获取用户唯一标识的替代方案

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the val...

Android中获取手机IMEI,IMSI, MAC(Android 6.0)工具类(标识用户唯一)

最近项目中用到获取手机IMEI,IMSI以及MAC,在此记录一下,方便你我他。。。其中包含Android 6.0获取MAC地址以及调用以前方式返回02:00:00:00:00:00...

IOS6及以后如何标识不同设备&获取用户的唯一标示符

通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。 keychain里保存的信息不会因App被删...

使用邮箱地址标识用户

IT以及数字化的不断普及,日益渗透着生活中的每个角落和旮旯里。即时通信、邮箱、电商、论坛等等诸多的公司、网站,都需要对用户进行管理,如何标识用户,既方便用户记忆,又方便服务器后台管理呢?qq的祖先是o...

unix环境高级编程-1.8-用户标识

1.用户ID 口令文件登录项中的用户ID是个数值,他向系统标识各个不同的用户。每个用户拥有为一个用户ID, 下面介绍内核如何使用用户ID检验该用户是否有执行某些操作的权限。   用户ID为0的...

Linux进程的uid和euid

对可执行文件设置 setuid 权限时,将对运行该文件的进程授予基于文件属主的访问权限。该访问权限不是基于正在运行可执行文件的用户。使用此特殊权限,用户可以访问通常只有属主才可访问的文件和目录。  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux用户标识UID与有效用户标识EUID
举报原因:
原因补充:

(最多只允许输入30个字)