分类: 系统运维
2012-03-28 13:23:32
正如我们早先描述的那样,当我们打开 一个文件,内核会基于有效用户和组ID来进行访问测试。有时进程会想基于真实用户和组ID来执行它的访问测试。当进程使用set-user-ID或 set-group-ID特性以其他人的身份运行时这非常有用。即使一个进程可能通过set-user-ID成为根用户,它可能仍想检查真实用户是否能访 问给定的文件。access函数基于真实用户和组ID来测试。(把4.5节末尾的4个步骤里的“真实”替换为“有效”。)
mode为下表常量中的位或值:
mode | 描述 |
R_OK | 测试读权限 |
W_OK | 测试写权限 |
X_OK | 测试执行权限 |
F_OK | 测试文件存在 |
看下面的代码:
再运行a.out:
$ ./a.out /etc/shadow
access error for /etc/shadow
open error for /etc/shadow
把自己变为超级用户后,为a.out的设置set-userID权限:
$ su
密码:
# chown root a.out
# chmod u+s a.out
# ls -l a.out
-rwsr-xr-x 1 root tommy 7289 2012-02-22 10:26 a.out
退出root身份
# exit
exit
再执行程序(以普通用户的身份)
$ ./a.out /etc/shadow
access error for /etc/shadow
open for reading OK
在这个例子里,我们把a.out设置为set-user-ID程序,它可以查觉到真实用户(tommy)不能访问这个文件,虽然它可以使用open函数来访问该文件。
在前面的例子以及在第8章里,我们有时会变为超级用户,来证明事情是怎么工作的。如果你在一个多用户系统而没有超级用户权限的话,你无法完全重现这些例子。