本文是在Linux系统下进行讨论的,因为Linux和Unix之间存在许多差异,并且不同的Unix系统也有所不同。对Linux进程权限的分析如下:在Linux下,大多数人都熟悉并熟悉文件权限。但是通常对进程权限知之甚少。本文总结了Linux系统下的进程权限问题和现象。首先,让我们首先列出本文中讨论的对象:ruid(真实用户ID:真实用户ID),euid(有效用户ID),suid(已保存用户ID),fuid(文件系统用户ID)。除了上述四个之外,它还涉及一个设置用户ID的位(设置用户ID的位),它是rwx之外的s标志位。另外,本文主要讨论userid,groupid规则基本相同,例如rgid,egid,sgid,fgid等,本文将不再重复讨论group id。首先,有两种查看这些uid的方法:一种是ps命令(ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname)列出这些uid。另一个是检查状态文件(cat / proc / 2495 / status | grep Uid)。本文创建了5个测试用户test1〜test5,这些用户用于本文的示例讨论,它们代表具有普通权限的普通用户。 1:文件所有者用户和程序执行者用户是同一用户int main(int argc,char * argv []){while(1)sleep(1);} $》 g ++ main.cpp -o a.out $ “ L1-rwxr-xr-x。 1 test1测试6780 Sep 16 15:32 a.out文件的所有者是test1,我们使用test1用户执行a.out程序$“ su test1 $”。 /a.out&amp; amp; $》 ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname | grep a.out 502 502 502 502 3192 a.out(查看结果为4 uid全部为test1;)现在,我们使用test2用户执行test1程序以查看结果$ su test2 503 503 503 503 3234 a.out然后使用root用户执行0 0 0 0 3257 a.out看到此结果,我们基本上可以总结一下:在一般情况下。这四个ID仅受执行用户的影响,而不受文件所有者用户的影响。四个uid都等于执行用户的id;第二,将权限转移给其他用户。非root用户不能将权限转让给其他用户,只有root用户可以转让它们。 int main(int argc,char * argv []){if(setuid(503)<< 0)perror(“ setuid错误”); while(1)sleep(1);} $》 ll -rwxr-xr-x。 1 test1 test 6780 Sep 16 15:32 a.out使用root用户执行$“。 /a.out查看状态,所有uid成为test2用户。 503 503 503 503 3592 a.out将代码中的setuid更改为seteuid函数,它将euid和fuid更改为test2用户0 503 0 503 3614 a.out将代码中的setuid更改为setfsuid函数,它将fuid更改为test2用户0 0 0 503 3636 a.out当代码更改为以下if(seteuid(503)<0)perror(“ seteuid error”)时; if(setfsuid(504)&lt;&lt; 0)perror(“ setfsuid error”); while(1)sleep(1);或if(setfsuid(504)“ 0” perror(“ setfsuid error”); if(setfeuid(503)“ 0”)perror(“ seteuid错误”); while(1)睡眠(1);以root用户执行并获得相同的结果0 503 0 503 3614 a.out在这里我将总结:1. setuid和seteuid之间存在区别。 ,Setuid是永久放弃root用户权限。转移到非root用户后,将无法再将其还原到root用户。 Seteuid是暂时放弃root用户权限。您可以使用seteuid(0)还原到根权限。这应该是一个众所周知的功能,因此本文不会通过示例进行演示。 2. Seteuid将同时将euid和fuid更改为设置的euid值。继续查看s权限位对进程权限的影响。第三,s标志影响euid,suid和fuidint main(int argc,char * argv []){while(1)sleep(1);} $》 g ++ main.cpp $》 ll -rwxr-xr-x。 1个测试1个测试6780 9月16日18:18 a.out $》 chmod u + s a.out $》 ll -rwsr-xr-x。 1 test1 test 6780 Sep 16 Sep:18 a.out是作为root用户执行的,用户ID为0 502 502 5024133。使用a.outs许可位的最典型情况是passwd命令。让我们看一下它们对文件权限的影响,并建立一个规则的euid,它与fuid不同。查看哪个uid是所创建文件的所有者。 4.影响用户文件权限的是fuid(而非euid)。 uid是特定于linux的属性。 Unix系统依靠euid来确定用户权限。 int main(int argc,char * argv []){if(setfsuid(503)“ 0)perror(” setfsuid error“); FILE * fp = fopen(“ test.log”,“ a +”); if(fp == NULL){perror(“ fopen error”);} else {fclose(fp);} while(1)sleep(1);}使用s权限位,文件所有者是root,执行者是test1,更改流体对于test2,以这种方式构造了三个具有相同部分的uid,这便于观察效果$》 ll -rws --- rx。 1个根7397年9月16日18:53 a.out