程序文件是一个二进制文件。在Unix中,二进制文件和文本文件都叫普通文件。不同文件的不同解释,这就靠应用程序来解释了。
与jin进程相关的ID有以下三种:实际用户ID(real user ID), 有效用户ID(effective user ID)和 保存的设置用户ID(saved set-user-ID)。
正常情况下,一个程序文件,被用户之行起来,那么这个进程的有效用户ID就是实际用户ID,两者相等。实际用户ID就是执行这个进行的用户的用户ID。
现在,假若,这个程序文件的stat结构体中的st_mode成员的set-user-ID,被设置为有效,那么,程序被运行起来了以后,有效用户ID(effective user ID)就不等于实际用户ID了,它等于进程要打开的文件的拥有者的用户ID了。
进程操作文件时,看有没有权限操作这个文件,比较的是进程的有效用户ID和要操作的文件的拥有者ID两者之间的关系。
举个例子:
passwd 命令,需要读写/etc/passwd , -rw-r--r--. 1 root root 2133 10月 23 2014 /etc/passwd, 但是/etc/passwd的拥有者是root,只有root用户才可以读写。
-rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd 命令拥有者是root,其他用户拥有执行的权利。
如果passwd被普通用户执行,那么怎么会更改/etc/passwd里面的内容呢 ?问题来了。。。。
是这样的,passwd命令程序文件是被置了set-user-ID标志的,那么程序文件被运行起来变成进程后,进程的实际用户ID就是执行该程序的用户的ID,***高潮来了***进程的有效用户ID是/etc/passwd 的实际拥有者用户ID了,就是root的ID了,这样,该进程对这个文件就临时有了root权限了。