首先简单介绍一下Linux下的文件类型,使用ls –l 命令可以查看文件及目录的属性信息
格式如:
d    r   w    x   r -  x  - - -    3 redhat root 4096 Jul 27 2009 test
9  8    7     6 5 4   3   2  1 0
其中的第一段是权限信息,一共有0-9十位组成,分别表示文件类型(第9位),属主权限(6-8),属组权限(3-5)和其他用户的权限(0-2)r表示可读,可以读出文件的内容
w表示可写,可以修改文件的内容x表示可执行.
   使用ls –l 查看/etc/passwd得到如下属性信息
[root@server30 ~]# ls -l /etc/passwd
-rw-r--r-- 1 root root 2979 Jul 30 13:24 /etc/passwd
我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢? 为了解决这个问题,就要用到SUID/SGID。
首先,我们要知道进程在运行的时候,有一些属性,其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。
而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时, 是采用了进程的有效用户ID来进行判断的。
当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。举个例子:
[student@server30 root]$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2979 Jul 30 13:24 /etc/passwd
虽然你以student登陆系统,但是当你输入passwd命令来更改密码的时候,由于passwd设置了SUID位,因此虽然进程的实际用户ID是test对 应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。
为文件1.sh添加SUID可以使用
[root@server30 tmp]# chmod u+s 1.sh
[root@server30 tmp]# ls –l 可以看到
-rwSr--r-- 1 root user1      0 Jul 31 18:54 1.sh
这样普通用户就可以执行1.sh了
 由于suid和sgid是在执行一个程序的过程中起作用,所以在设置某个文件的suid或sgid位的同时必须打开该文件相应的可执行位,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的suid和sgid位是没有多大意义的。
   下面来说明一下对目录的影响。suid对目录没有影响。 如果一个目录设置了sgid位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。亦即,此目录下所建立的所有文件(含子目录)都将继承该目录的组属性。显然,当您需要创建一个属于同一组的一组人使用的目录树时,这种特殊的功能很管用。若目录被设为S位,则类似s位,但不为用户组设置搜索。
我们知道,linux系统是一个多用户系统,一个lunix系统可能有许多用户,同时/不同时的登陆,他们在自己的家目录创建文件,但也可能在一些公有文件夹里创建文件,典型的就是/tmp目录,这是一个任何用户在里面都可以创建文件的目录,而且任何用户对/tmp目录都具有读/写/执行权限,这意味着任何用户都可以删除/更名该目录下的文件。显然,对于/tmp这种公用目录,当然要使用一定的机制,来阻止“任何用户都可以删除/更名该目录下的文件”这种不该出现的现象,保证该目录下的文件,只有其文件属主才可以删除和更名,而其他用户不能删除和更名不属于他的文件。给/tmp目录设置粘滞位(umask),就实现了这一功能!
 不带任何参数的umask可以查看当前用户的umask值,在实现创建文件或目录时对权限的设置,是一中临时设置,切换终端或用户后即失效。
目录:777-umask(不同用户的umask不同)
 文件:666-umask 
在Linux系统中文件不具有执行权限,所以文件的最后一位不能是x,umask过的权限值最后一位是奇数是会自动加1。