UID、EUID、SUID的区别 Linux

UID、EUID、SUID的区别 Linux,第1张

UID:真实的用户ID 进程的UID就是其创建者的用户ID,用于标识进程的属主。

EUID:有效的用户ID(我理解是文件所有者)

(1)只有进程的创建者和root用户才有权利对该进程进行 *** 作。于是,记录一个进程的创建者(也就是属主)就显得非常必要。

(2)EUID,用来确定进程对某些资源和文件的访问权限。在大多数情况下,进程的UID和EUID是一样的 —— 除了著名的setuid程序。

(3)什么是setuid程序? 例如:passwd命令,这个命令允许用户修改自己的登录口令。但是密码保存在/etc/shadow文件中,这个文件对普通用户是不可读的,那么用户怎么能够通过修改shadow文件来修改自己的口令呢?这就是setuid的妙处了。

setuid通过使passwd在执行阶段具有文件所有者(也就是root)的权限,让用户临时有了修改shadow文件的能力(当然这种能力是受到限制的)。因此,passwd就是一个经典的setuid程序,其UID是当前执行这个命令的用户ID,而EUID则是root用户的ID(也就是0)

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

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

gid和egid同理。

下面一段C代码将解释区别:"printid.c"

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

int main(void)

{

printf(" UID\t= %d\n", getuid())

printf(" EUID\t= %d\n", geteuid())

printf(" GID\t= %d\n", getgid())

printf(" EGID\t= %d\n", getegid())

return EXIT_SUCCESS

}

编译之:

aguo@linux-x9rc:~>gcc -o printid printid.c

执行:

aguo@linux-x9rc:~>./printid

Real UID= 1000

Effective UID= 1000

Real GID= 100

Effective GID= 100

看看/etc/passwd里uid和gid:

aguo@linux-x9rc:~>cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'

uid:1000gid:100

要执行setuid(uid)如果是非特权用户则euid必须等于实际用户ID或者是保存设置用户ID,如果是特权用户则可以将euid设置为uid,seteuid(0)按照这种理解应该是特权用户下。给你推荐《linux就该这么学》看看吧


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7131712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存