linux的uid和euid相关问题

本文深入解析Linux文件权限中的s位和g位,解释它们如何影响用户权限,尤其是以root身份执行某些可执行文件时,如何改变用户的有效用户ID,进而允许普通用户修改特定文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux下文件的权限可不止rwx,总共有12位,分别为s g t rwx rwx rwx其中t为表示粘着位,一旦这个位被置位,用户不能删除这个文件,这里重点要说的是s 和g这两个权限位。s位涉及到用户id和有效用户id,g位涉及到组id 和有效用户组id在linux系统中,有些可执行文件需要root权限才能执行,比如/usr/bin/passwd这个可执行程序,
ls -l /usr/bin/passwd 的结果如下:
-rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd

从结果可以看出,这个可执行文件属于root用户,其中还对于属主权限时,x位被s位代替,这里的原因如下:
    首先,passwd这个可执行程序本身属于root,并且这个可执行程序本身操作的是/etc/passwd这个文件,对于/etc/passwd 非root用户只有读的权限,这个文件只有root用户具有写的权限当我们以root身份执行passwd 程序的时候,passwd对/etc/passwd这个文件执行写,这当然没问题。但是,奇怪的是,其他的用户也可以使用这个命令,并且也能够通过passwd命令修改/etc/passwd 这个文件,而/etc/passwd对于其他用户来说只能够读,这就
涉及到用户id (uid)和有效用户id 这两个概念(euid)内核在检查进程是否有权限操作某个资源,依据的是有效用户ID而非用户ID,当某个可执行文件在用户权限中设置了s位,那么执行这个程序的有效用户ID就被设置为可执行文件的属主用户ID.
下面就针对passwd这个程序来说明    比如有两个用户,一个是root  一个是foo 
uid(root) = 0 gid(root) = 0
uid(foo) = 502 gid(foo) = 501


那么当root用户执行passwd时,则对应的id如下
uid(root) = 0 gid(root) = 0
euid(root) = 0 egid(root) = 0 

而当foo用户执行passwd时,则对应的id如下:
uid(foo) = 502 gid(foo) = 502
euid(foo) = 0 egid(foo) = 0 
为什么其他用户通过passwd程序也能够写/etc/passwd这个程序,通过euid很显然可以看出来内核在检查时,发现euid是0所以,当然有权限能够写/etc/passwd这个文件了,这就是那个s标志位的影响。当foo用户执行passwd时,因为有s标志位,所以foo的有效用户被设置为passwd程序的属主用户root的id了。值得注意的是:s位只对可执行文件有意义,对其他的文件则没有意义。如果一个文件不是可执行文件,则通过chmod u+x filename  添加上,在执行的时候,还是不行的,同时具有x权限,
s才是有意义的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值