我有一个 Solaris 10 系统:
# uname -a
SunOS edddev03 5.10 Generic_150400-04 sun4v sparc SUNW,SPARC-Enterprise-T5120
我编写了一个打印 uid 的程序:
# cat getuid.c
int main (void) {
printf ("%d\n", getuid());
}
它按预期工作:
# gcc -o /bin/getuid getuid.c
# getuid
0
# su nobody -c /bin/getuid
60001
现在我把它改成了setuid程序:
# chmod 4555 /bin/getuid
# ls -la /bin/getuid
-r-sr-xr-x 1 root root 6424 May 18 13:04 /bin/getuid
但它没有按预期工作:
# su nobody -c /bin/getuid
60001
我预期是 0。为什么它不起作用?
答案1
我发现这个问题仍然没有答案;G-曼和布拉奇利已指出错误;getuid()
返回“调用进程的真实用户ID”,同时geteuid()
返回“调用进程的有效用户ID”。
您可以看到该程序的差异:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main (void) {
printf ("getuid=%d, geteuid=%d\n", getuid(), geteuid());
setuid(geteuid());
printf ("getuid=%d, geteuid=%d\n", getuid(), geteuid());
}
$ gcc -o getuid getuid.c
$ sudo chown root getuid
$ sudo chmod u+s getuid
$ su nobody -c ./getuid
getuid=60001, geteuid=0
getuid=0, geteuid=0