linux程序都是一个用户,linux实际用户和有效用户的区别,附程序示例说明

看unix高级编程的时候,第八章有提到实际用户和有效用户,那么这两个用户到底是什么,它们之间有什么区别呢?

实际用户:表示一开始执行程序的用户,比如用账号iceup登录shell,然后执行程序ls,那么实际用户就是iceup。

有效用户:有效用户是指在程序运行时,计算权限的用户。大多数情况下实际用户和有效用户相等,但是在执行拥有SUID权限的程序的时候,这两个用户通常会不一致。

为方便理解,笔者用C写了一个例子hello.c,内容很简单,就是获取实际用户id和有效用户id然后输出,代码如下:

#include

int main(void)

{

int uid, euid;

//实际用户id

uid = getuid();

//有效用户id,其中e表示effective,就是有效的意思

euid = geteuid();

printf("uid=%d\n", uid);

printf("euid=%d\n", euid);

return 0;

}

编译后的执行文件为a.out,使用ls -l查看两个文件的属性:

ca205c533ea56949da5d8409a1106883.png

实际用户和有效用户演示文件属性

可以看到a.out的所有者为root,用root账号运行这个文件,输出如下:

$ ./a.out

uid=0

euid=0

换一个账号iceup运行这个文件,输出如下:

$ ./a.out

uid=1001

euid=1001

这两个执行结果比较显而易见,实际用户和有效用户都是一致的。前面一个执行者是root,所以两个都是0,在linux下root的id就是0;后面一个是1001,就是iceup的编号。

下面来看下实际用户和有效用户不一致的情况,切换回root,修改a.out的权限,增加SUID权限:

$ chmod u+s a.out

使用iceup来执行这个程序,结果输出如下:

$ ./a.out

uid=1001

euid=0

可以看到有效用户和实际用户不一致了,因为一开始执行程序的是iceup账号,所以实际用户uid=1001。因为a.out有SUID权限,所有在执行的时候,权限的计算会转为root账号,所以有效用户euid=0了。

关于SUID,我在另外一篇文章有比较详细的说明,其中还包括SGID和SBIT的说明。有兴趣的童靴可以参考这篇文章:linux特殊权限SUID,SGID和SBIT实例演示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值