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 /etcgaolu@gaolu-desktop:/etc$ ls -l shadow-rw-r—– 1 root shadow 978 2009-02-22 21:25 shadowgaolu@gaolu-desktop:/etc$这是出现了矛盾:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的 EUID,而不是执行该程序的UID。gaolu@gaolu-desktop:/etc$ cd /usr/bingaolu@gaolu-desktop:/usr/bin$ ls -l passwd-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwdgaolu@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.cgaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ chmod u+s uid //用户主增加权限setuidgaolu@gaolu-desktop:~$ ls -l uid-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uidgaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ ./uidCurrent process UID: 1000Current process EUID: 1000gaolu@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 uidroot@gaolu-desktop:/home/gaolu# ./uidCurrent process UID: 0Current process EUID: 1000 //有效用户ID为1000root@gaolu-desktop:/home/gaolu#root@gaolu-desktop:/home/gaolu#

一个人的天地是冷得连呼吸都会寂寞的颤栗,而麻烦,

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

相关文章:

你感兴趣的文章:

标签云: