玩命加载中 . . .

UID与EUID区别


概述

Linux系统中每个进程都有2个ID,分别为用户ID(UID)和有效用户ID(EUID),UID(实际用户)是一个重要的环境变量,可用于检查当前脚本是以超级用户(root)还是普通用户的身份运行。

UID与EUID,两者之间有什么区别,本文介绍之。

UID与EUID的区别

从理论上介绍一下两者区别

实际用户(UID)

实际用户ID是指运行这个进程的用户uid。这个用户uid会被设置为父进程的实际用户ID,并且在系统调用中都不会发生改变。一般情况下,登录进程会将用户登录那个shell的实际用户ID设置为 登录用户的uid,并且这个用户所有进程的实际用户ID都会继承这个值。 超级用户可能会把实际用户 ID设置修改为任意值,但是其他用户不可以。

有效用户

有效用户ID是当前进程所使用的用户ID。 权限认证一般是使用这个值。 初始时,这个ID等于实际用户ID。

通过实例展示UID与EUID的区别

先来看一段perl脚本

test01@node77:/home$ cat id.pl 
#!/usr/bin/perl

use warnings;
use strict;

printf "uid: %-20s euid: %-20s\n",$<,$>;
printf "gid: %-20s egid: %-20s\n",$(, $);

test01@node77:/home$ 

说明:

perl里面的特殊变量$<、$>表示uid euid; $(、$)表示gid egid。只是,$(和$)会存储一个列表,第一位表示的才是gid和egid,这个是perl的设置,不在本文讨论范围。

在root用户下执行,效果如下:

root@node77:/home# perl id.pl 
uid: 0                    euid: 0                   
gid: 0 0                  egid: 0 0                 
root@node77:/home# 

非root用户下执行,效果如下:

test01@node77:/home$ perl id.pl 
uid: 1000                 euid: 1000                
gid: 1000 1000            egid: 1000 1000           
test01@node77:/home$ 

说明:

第一次运行的时候,使用的是超级权限(root),所以uid=0,gid=0;

第二次运行的时候,使用的是普通用户,uid=1000,gid=1000,由于没有使用setgid对gid进行改变,所以uid=gid。

总结

  • 有效用户ID(euid)代表它的属主,限制进程的权限

  • 在没有seteuid的情况下,uid=euid,guid同理

  • 当进程以root权限调用setuid()后,root权限会被丢弃,所以root权限下,使用setuid()更加安全


文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录