最近在一个课题学习的过程中,遇到Linux权限机制,将自己的理解总结如下:

1.Linux权限模型——UGO模型

当我们用ls -l 命令查看一个目录下的文件或者目录时,我们会看到如下的显示:

-rw-rw-r-- 1 linuxw linuxw 18 Apr 16 18:23 Test.txt

今天,我们主要学习它的第一个字段-rw-rw-r-- 。这里的r表示可读,w表示可写,x表示可执行。那我们如何解读它?首先,我们抛开第一位的“-”,后面的九位分别以三位划分为一组,即一个三元组,也就是说“rw-”、"rw-"、"r--"。它们依次表示该文件或者文件夹的所有者(owner)的权限、其所有组(group)的权限以及其它所有用户(other)的权限。我们把第一个字段综合起来看就是:允许它的所有者以及他的所有组进行读写,允许其他用户读,但不允许写,他们全部都不具有执行它的权力。我们再来看看第一位,本例中以“-”出现,它是一个常规文件。但它只是有这一种,概括来讲,它可能出现的还有:

“d”目录,“l”符号链接,“c”字符专门设备文件,“b”块专门设备文件,“p”先进先出

“s”套接字

在我写这篇博文的时候,我也只见过“d”(文件夹)开头的,其他的几类,在日后的学习中大家可以留心一下。

2.四位八进制数权限模型

总体来说,他和UGO模型极为相似,让我一度没有意识到它们的区别,局中者迷嘛!现在让我们一起来揭开它:

所谓四位八进制数权限模型就是用四个八进制数字(0~7)进行权限表示。比如说0755,现在我们来解读一下它的组成。它可以被分为两个部分。第一位为单独的一部分,第二~四位为第二部分。我们先来理解一下第二部分,为什么说它让人混淆呢?是因为数字0~7与一个三元组之间有着对应关系:

rwx 7rw- 6r-x 5r-- 4-wx 3-w- 2--x 1--- 0

现在:0755抛开第一位,得到的755可以按照对应关系列出三个三元组:rwxr-xr-x它表示的意义与UGO一致,这里不再赘述。我们来看,第一部分。第一部分只有一位数字。但是它仍然被划分为三个二进制数字,这三位对应是 :suid sgid sticky(粘滞)bit 。那么这里为什么要这样处理呢?Linux这样处理是为了使得权限的机制更加的完善。它是如何实现的,我们来详细了解一下:

首先,我们之前说过是三位二进制数,1表示on, 0表示off。它对应到八进制:on on on 7:(111)到off off off 0:(000),其它数字自行补全。那么它这一位数是怎么来的呢?这里我们不得不说Linux权限设置的一些基本方法,首先,当你创建了一个文件而并没有设置它的权限时,一般来说,Linux下默认的权限初始值为0666,但是它会同时参考一个叫做umask的东西来降低权限,使得它的权限设置更为合理,更加安全。umask的值可以在自己的系统中通过命令行输入umask来查看。比如我的值是0002。这里我们把他们统一看成二进制数字:

umask:  000 000 000 010

默认值:  000 110 110 110

我们把这两个值做个异或运算,得到000 110 110 100,我们惊奇地发现,它与我们展示的

“-rw-rw-r--”(0664:二进制:000 110 110 100)一致,这是它们的参考方式的吗?这里由于我只在我的机型上做了演示,所以并不敢给出肯定的答案,但感兴趣,可以去自己的机子上验证,注意这是在你没有指定权限的情况下,或者这里有更深的联系,感兴趣可以做更进一步的了解。现在我们来说一下三个具体的二进制位的作用。当对一个文件设置了suid位后,它的所有者权限的三元组里第三位会相应的变成S。它表示无论谁去执行它,都将以该文件所有者的身份去执行,举个例子,如果这个文件的所有者是root用户,那么将意味着执行它的用户将具备root用户的权限,这样做有时是不安全的,因此设置时需谨慎。sgid同样可以进行设置,意义以suid类推。我们再来说一下sticky位:

[email protected]:/home/linuxw# ls -dl /tmp

drwxrwxrwt 13 root root 4096 Apr 19 22:06 /tmp

当我们查看tmp目录时,会出现t ;那这个t 我们怎么理解呢?它与我们前面介绍的other元组字母组成不太一样啊。其实,这就是我们要讲的sticky位设置后的结果。要理解sticky位,我们先以tmp这个特殊的文件夹来说起。

/tmp目录下存放的是所有用户操作时产生的临时文件。那么,按道理它的权限应该是“rwxrwxrwx",因为它服务于所有的用户,理应所有的用户都可以随意进行读、写(包括修改删除等)、执行等操作。那么这样造成的问题是,如果一个用户删掉了另一个用户在使用时创建的临时文件,那它不就不能恢复了吗?这时啊,我们就说设置sticky位起作用了,它把删除文件的权限收归为只有root用户和它的所有者拥有,而不是任意用户可以去删除它。这也是Linux的一种保护机制。通俗来讲,设置粘滞位的意思相当于说我是你的了,只有你才能处理我,当然这里的你不包括root用户,因为root用户拥有绝对权限。这在文件权限的应用里是很有意义的,它可以防止其他用户损伤一些特定的文件。

3.权限的修改

以Test.txt进行权限的修改为例:

修改权限之前:

-rw-rw-r-- 1 linuxw linuxw   18 Apr 16 18:23 Test.txt

修改常规读、写、可执行权限

chmod u+x Test.txt     //所有者设置可执行权限,在Shell脚本编程里很常用。

-rwxrw-r-- 1 linuxw linuxw   18 Apr 16 18:23 Test.txt

chmod g+w Test.txt//所在组设置可写权限

chmod g-x Test.txt    //所在组取消可读权限

chmod u+r Test.txt    //所有者设置可读权限

chmod o-x Test.txt    //设置所有其他用户不可执行权限

设置数字权限:

chmod 0664 Test.txt

设置suid:

chmod u+s Test.txt

-rwsrw-r-- 1 linuxw linuxw   18 Apr 16 18:23 Test.txt

设置sgid

-rwsrwSr-- 1 linuxw linuxw   18 Apr 16 18:23 Test.txt

设置sticky:

chmod +t Test.txt

-rwsrwSr-T 1 linuxw linuxw   18 Apr 16 18:23 Test.txt

总结:首先我们学习了UGO模型和数字权限模型,两者的差异之处是第一位的不同。其次,我们介绍了suid sgid sticky bit位的作用,最后,我们练习了如何修改权限。细心的你可能会发现所有的命令我们都用了chmod,设置权限用“+”,取消权限用“-”,并且设置的三元组与字母间的组合,细心的你肯定会发现。到这里,我们本次的学习就告一段落了。

声明:本文例子均为为本人在Ubuntu kylin上实际演练过的,shell版本为bash.若有浏览到本文,可通过echo $SHELL查看自己的Linux shell版本。本文仅供初学Linux爱好者浏览大致内容,获取更多知识,请参考权威文献著作,本文不负任何法律责任。本文为作者原创,转载请注明出处。

Logo

更多推荐