getuid() 实际用户ID为 执行程序的实际用户ID
geteuid() 有效用户ID与设置用户ID有关,及权限中的S位
如果权限为rws 那么s位代表其他用户执行程序时改变为主用户权限。不安全
如:
8 #include<stdio.h>
9 #include<stdlib.h>
10 #include <unistd.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14
15 int main(void)
16 {
17
18 int fd;
19
20 fd = open("abc", O_CREAT | O_RDWR | O_EXCL, 0777);
21 if(fd==-1)
22 {
23 perror("error:");
24 }
25 printf("uid %ld,euid %ld\n",getuid(),geteuid());
26
27
28 }
程序放到root用户下,
-rwxr-xr-x 1 root root 8762 Feb 16 05:16 a.out
当前gaopeng用户
如果在gaopeng用户下执行这个程序正常情况下报错
gaopeng@bogon:/$ ./a.out
error:: Permission denied
uid 1000,euid 1000
如果设置了 设置用户ID 如下:
chmod 4755 a.out
-rwsr-xr-x 1 root root 8762 Feb 16 05:16 a.out
再次执行
gaopeng@bogon:/$ ./a.out
uid 1000,euid 0
可以看到设置用户ID为0即位超级用户,并且没有任何报错文件建立完成
设置这个位过后不需要SUDO就可以或者切换到root用户下就能执行程序。不安全
如果是sudo
gaopeng@bogon:/$ sudo ./a.out
uid 0,euid 0
可以看到
实际用户ID和有效用户ID都是 0
那么总结一下:
实际用户ID实际上是发起执行这个程序的用户ID
有效用户ID实际上是执行程序过程中,程序自身的用户ID,
如果没有设置S位实际上他是和实际用户ID一样的。
当然还有效用户组ID 组权限位也可以设置为S,和用户一样,执行时可以切换到其他组(如root组)用户权限下。
设置4***这里的4是设置用户s
设置2***这里的2设置组s
当然还有1为黏住位已经淘汰无用。
chmod 2755 a.out
-rwxr-sr-x 1 root root 8762 Feb 16 05:16 a.out
chmod 4755 a.out
-rwsr-xr-x 1 root root 8762 Feb 16 05:16 a.out
chmod 6755 a.out
-rwsr-sr-x 1 root root 8762 Feb 16 05:16 a.out