5.2 任务2 管理Linux文件权限
5.2.1 子任务1 理解文件和文件权限
文件是操作系统用来存储信息的基本结构,是一组信息的集合。文件通过文件名来唯一标识。Linux中的文件名称最长可允许255个字符,这些字符可用A~Z、0~9、.、_、-等符号来表示。与其他操作系统相比,Linux最大的不同点是没有“扩展名”的概念,也就是说文件的名称和该文件的种类并没有直接的关联,例如,sample.txt可能是一个运行文件,而sample.exe也有可能是文本文件,甚至可以不使用扩展名。另一个特性是Linux文件名区分大小写。例如sample.txt、Sample.txt、SAMPLE.txt、samplE.txt在Linux系统中都代表不同的文件,但在DOS和Windows平台却是指同一个文件。在Linux系统中,如果文件名以“.”开始,表示该文件为隐藏文件,需要使用“ls-a”命令才能显示。
在Linux中的每一个文件或目录都包含访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。
通过设定权限可以按以下三种访问方式限制访问权限:只允许用户自己访问;允许一个预先指定的用户组中的用户访问;允许系统中的任何用户访问。同时,用户能够控制一个给定的文件或目录的访问程度。一个文件或目录可能有读、写及执行权限。当创建一个文件时,系统会自动赋予文件所有者读和写的权限,这样可以允许所有者显示文件内容和修改文件。文件所有者可以将这些权限改变为任何他想指定的权限。一个文件也许只有读权限,禁止任何修改。文件也可能只有执行权限,允许它像一个程序一样执行。
根据赋予权限的不同,三种不同的用户(所有者、用户组或其他用户)能够访问不同的目录或者文件。所有者是创建文件的用户,文件的所有者能够授予所在用户组的其他成员以及系统中除所属组之外的其他用户的文件访问权限。
每一个用户针对系统中的所有文件都有它自身的读、写和执行权限。第一套权限控制访问自己的文件权限,即所有者权限。第二套权限控制用户组访问其中一个用户的文件的权限。第三套权限控制其他所有用户访问一个用户的文件的权限,这三套权限赋予用户不同类型(即所有者、用户组和其他用户)的读、写及执行权限,就构成了一个有9种类型的权限组。
我们可以用“ls-l”或者ll命令显示文件的详细信息,其中包括权限。命令如下所示:
[root@RHEL6~]# ll total 84 drwxr-xr-x 2 root root 4096 Aug 9 15:03 Desktop -rw-r--r-- 1 root root 1421 Aug 9 14:15 anaconda-ks.cfg -rw-r--r-- 1 root root 830 Aug 9 14:09 firstboot.1186639760.25 -rw-r--r-- 1 root root 45592 Aug 9 14:15 install.log -rw-r--r-- 1 root root 6107 Aug 9 14:15 install.log.syslog drwxr-xr-x 2 root root 4096 Sep 1 13:54 webmin
上面列出了各种文件的详细信息,共分7列。所列信息的含义如图5-2所示。
图5-2 文件属性示意图
5.2.2 子任务2 详解文件的各种属性信息
1.第1栏为文件类型权限
每一行的第一个字符一般用来区分文件的类型,一般取值为d、-、l、b、c、s、p。具体含义如下。
• d:表示一个目录,在ext文件系统中目录也是一种特殊的文件。
•-:表示该文件是一个普通的文件。
•l:表示该文件是一个符号链接文件,实际上它指向另一个文件。
•b、c:分别表示该文件为区块设备或其他的外围设备,是特殊类型的文件。
•s、p:这些文件关系到系统的数据结构和管道,通常很少见到。
每一行的第2~10个字符表示文件的访问权限。这9个字符每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限。代表的意义如下。
• 字符2、3、4表示该文件所有者的权限,有时也简称为u(User)的权限。
• 字符5、6、7表示该文件所有者所属组的组成员的权限。例如,此文件拥有者属于user组群,该组群中有6个成员,表示这6个成员都有此处指定的权限。简称为g(Group)的权限。
• 字符8、9、10表示该文件所有者所属组群以外的权限,简称为o(Other)的权限。这9个字符根据权限种类的不同,也分为4种类型。
➢ r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
➢ w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
➢ x(execute,执行):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
➢-:表示不具有该项权限。
下面举例说明。
brwxr--r--:该文件是块设备文件,文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。
-rw-rw-r-x:该文件是普通文件,文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
drwx--x--x:该文件是目录文件,目录所有者具有读写与进入目录的权限,其他用户能进入该目录,却无法读取任何数据。
lrwxrwxrwx:该文件是符号链接文件,文件所有者、同组用户和其他用户对该文件都具有读、写和执行权限。
每个用户都拥有自己的主目录,通常在/home目录下,这些主目录的默认权限为rwx------。执行mkdir命令所创建的目录,其默认权限为rwxr-xr-x,用户可以根据需要修改目录的权限。
此外,默认的权限可用umask命令修改,用法非常简单,只需执行“umask 777”命令,便代表屏蔽所有的权限,因而之后建立的文件或目录,其权限都变成000,其他依次类推。通常root账号搭配umask命令的数值为022、027和077,普通用户则是采用002,这样所产生的默认权限依次为755、750、700、775。有关权限的数字表示法,后面将会详细说明。
用户登录系统时,用户环境就会自动执行urmask命令来决定文件、目录的默认权限。
2.第2栏表示有多少文件名连接到此节点(i-node)
每个文件都会将其权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件来记录,因此每个文件名就会连接到一个i-node。这个属性记录的就是有多少不同的文件名连接到相同的一个i-node。
3.第3栏表示这个文件(或目录)的拥有者账号
第3栏表示这个文件(或目录)的拥有者账号。比如图5-2中,文件拥有者是root用户。
4.第4栏表示这个文件的所属群组
在Linux系统下,你的账号会附属于一个或多个的群组中。举例说明如下:classl、class2、class3均属于projecta这个群组,假设某个文件所属的群组为projecta,且该文件的权限为(-rwxrwx---),则classl、class2、class3三人对于该文件都具有可读、可写、可执行的权限(看群组权限)。但如果是不属于projecta的其他账号,对于此文件就不具有任何权限了。
5.第5栏为这个文件的容量大小,默认单位为bytes
第5栏为这个文件的容量大小,默认单位是字带(bytes)。比如图5-2中的文件容量是4096字节。
6.第6栏为这个文件的创建日期或者是最近的修改日期
这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分仅会显示年份而已。如果想要显示完整的时间格式,可以利用ls的选项,即“ls-l--full-time”命令就能够显示出完整的时间格式了。
7.第7栏为这个文件的文件名
比较特殊的是:如果文件名之前多一个“.”,则代表这个文件为隐藏文件。请读者使用ls及ls-a这两个指令去体验一下什么是隐藏文件。
5.2.3 子任务3 使用数字表示法修改权限
在文件建立时系统会自动设置权限,如果这些默认权限无法满足需要,此时可以使用chmod命令来修改权限。通常在权限修改时可以用两种方式来表示权限类型:数字表示法和文字表示法。
chmod命令的格式是:
chmod 选项 文件
所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示,没有授予的部分就表示为0,然后再把所授予的权限相加而成。表5-2是几个示范的例子。
表5-2 以数字表示法修改权限的例子
例如,为文件/etc/file设置权限:赋予拥有者和组群成员读取和写入的权限,而其他人只有读取权限,则应该将权限设为“rw-rw-r--”,而该权限的数字表示法为664,因此可以输入下面的命令来设置权限:
[root@RHEL6~]# chmod 664 /etc/file [root@RHEL6~]# ll total 0 -rw-rw-r-- 1 root root 0 Sep 1 16:09 file
再如,要将.bashrc这个文件所有的权限都设定启用,那么就使用如下命令:
[root@RHEL6~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45.bashrc [root@RHEL6~]# chmod 777.bashrc [root@RHEL6~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45.bashrc
如果要将权限变成-rwxr-xr--呢?权限的数字就成为[4+2+1][4+0+1][4+0+0]=754,所以需要使用chmod 754 filename命令。另外,在实际的系统运行中最常发生的一个问题就是,常常我们以vim编辑一个shell的文本批处理文件后,它的权限通常是-rw-rw-r--,也就是664。如果要将该文件变成可执行文件,并且不要让其他人修改此文件,那么就需要-rwxr-xr-x这样的权限。此时就要执行chmod 755 test.sh指令。
技巧:如果有些文件不希望被其他人看到,可以将文件的权限设定为-rwxr-----,可执行“chmod 740 filename”指令。
5.2.4 子任务4 使用文字表示法修改权限
1.文字表示法
使用权限的文字表示法时,系统用4个字母来表示不同的用户。
• u即user,表示所有者。
• g即group,表示属组。
• o即others,表示其他用户。
• a即all,表示以上三种用户。
操作权限使用下面三种字符的组合表示法。
• r即read,可读。
• w即write,写入。
• x即execute,执行。
操作符号包括以下几种。
• +:添加某种权限。
• -:减去某种权限。
• =:赋予给定权限并取消原来的权限。
以文字表示法修改文件权限时,上例中的权限设置命令应该为:
[root@RHEL6~]# chmod u=rw, g=rw, o=r /etc/file
修改目录权限和修改文件权限相同,都是使用chmod命令,但不同的是,要使用通配符“*”来表示目录中的所有文件。
例如,要同时将/etc目录中的所有文件权限设置为所有人都可读取及写入,应该使用下面的命令:
[root@RHEL6~]# chmod a=rw /etc/*
或者
[root@RHEL6~]# chmod 666 /etc/*
如果目录中包含其他子目录,则必须使用-R(Recursive)参数来同时设置所有文件及子目录的权限。
2.利用chmod命令也可以修改文件的特殊权限
例如,要设置/etc/file文件的SUID权限的方法如下(先了解,后面会详细介绍):
[root@RHEL6~]# chmod u+s /etc/file [root@RHEL6~]# ll 总计 0 -rwSr--r-- 1 root root 0 11-27 11:42 file
特殊权限也可以采用数字表示法。SUID、SGID和sticky权限分别为4、2和1。使用chmod命令设置文件权限时,可以在普通权限的数字前面加上一位数字来表示特殊权限。例如:
[root@RHEL6~]# chmod 6664 /etc/file [root@RHEL6~]# ll 总计 22 -rwSrwSr-- 1 root root 22 11-27 11:42 file
3.使用文字表示法的有趣实例
【例5-1】 假如我们要设定一个文件的权限成为-rwxr-xr-x时,所表述的含义如下。
• user(u):具有可读、可写、可执行的权限。
• group与others(g/o):具有可读与执行的权限。
命令的执行结果如下:
[root@RHEL6~]# chmod u=rwx, go=rx .bashrc #注意!"u=rwx, go=rx"是连在一起的,中间并没有任何空格 [root@RHEL6~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45.bashrc
【例5-2】 对于-rwxr-xr--这样的权限又该如何设置呢?可以使用“chmod u=rwx, g=rx, o=r filename”来设定。此外,如果不知道原先的文件属性,而只想要增加.bashrc这个文件的每个人均有写入的权限,那么就可以使用如下命令:
[root@RHEL6~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45.bashrc [root@RHEL6~]# chmod a+w.bashrc [root@RHEL6~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45.bashrc
【例5-3】 如果要将权限去掉而不改动其他已存在的权限应该怎么办?例如,要去掉全部人的可执行权限,则可以使用如下命令:
[root@RHEL6~]#chmod a-x .bashrc [root@RHEL6~]#ls -al .bashrc -rw-rw-rw-1 root root 395 Jul 4 11:45.bashrc
提示:+与-的状态下,只要是没有指定到的项目,则该权限不会被变动,例如上面的例子中,由于仅是去掉x权限,则其他两个保持当时的值不变。举例来说,你想要让用户拥有执行的权限,但你又不知道该文件原来的权限是什么,此时,利用chmod a+x filename,就可以让该程序拥有执行的权限。
5.2.5 子任务5 理解权限与指令间的关系
我们知道权限对于使用者账号来说是非常重要的,因为其可以限制使用者能不能读取/建立/删除/修改文件或目录。
(1)让用户能进入某目录成为可工作目录的基本权限如下。
• 可使用的指令:如可以为cd等变换工作目录的指令。
• 目录所需权限:用户对这个目录至少需要具有执行(x)的权限。
• 额外需求:如果用户想要在这个目录内利用ls查阅文件名,则用户对此目录还需要可读(r)的权限。
(2)用户在某个目录内读取一个文件的基本权限如下。
• 可使用的指令:如cat、more、less等。
• 目录所需权限:用户对这个目录至少需要具有x权限。
• 文件所需权限:使用者对文件至少需要具有r权限。
(3)让使用者可以修改一个文件的基本权限如下。
• 可使用的指令:例如nano或后面要介绍的vim编辑器等。
• 目录所需权限:用户在该文件所在的目录至少要有x权限。
• 文件所需权限:使用者对该文件至少要有r、w权限。
(4)让一个使用者可以建立一个文件的基本权限如下。
• 目录所需权限:用户在该目录中要具有w、x的权限,重点在于w权限。
(5)让用户进入某目录并执行该目录下的某个指令的基本权限如下。
• 目录所需权限:用户在该目录至少要有x的权限。
• 文件所需权限:使用者在该文件至少需要有x的权限。
思考:让一个使用者Bobby能够执行“cp/dirl/filel/dir2”的指令时,请说明dirl、filel、dir2的最小所需权限是什么。
分析:执行cp时,Bobby要能够读取源文件并且写入目标文件,所以应参考上述第(2)点与第(4)点的说明。因此各文件/目录的最小权限应该如下。
• dirl:至少需要有x的权限。
• filel:至少需要有r的权限。
• dir2:至少需要有w、x的权限。