6.2 Linux文件权限
大致了解了Linux的用户与用户组之后,接下来,我们要来谈一谈,要如何针对这些所谓的“用户”与“用户组”来设置该文件的权限呢?这个部分相当重要,尤其对于初学者来说,因为文件的权限与属性是学习Linux的一个相当重要的关卡,如果没有这部分的概念,那么将听不懂别人在讲什么。如果屏幕前面出现了“Permission deny”的时候,就表明“是权限设置错误”。
6.2.1 Linux文件属性
既然要了解Linux的文件属性,那么有个重要的也是常用的命令就必须要先说。“ls”这个列出文件的命令。在以root的身份登入Linux之后,输入“ls -al”看看,会看到下面的内容:
[root@linux ~]# ls -al
total 248
drwxr-x--- 9 root root 4096 Jul 11 14:58 .
drwxr-xr-x 24 root root 4096 Jul 9 17:25 ..
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 13823 Jul 10 23:12 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 100 Dec 4 2004 .cshrc
drwx------ 3 root root 4096 Jun 25 08:35 .ssh
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
[ 1][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 属性 ][连接][拥有者][用户组][文件容量][ 修改日期 ][ 文件名 ]
ls是“list”的意思,与早期DOS的命令dir功能类似。参数“-al”则表示列出所有的文件(包含隐藏文件,就是文件名前面第一个字符为 . 的文件)。如上所示,在第一次以root身份登入Linux时,如果输入命令后,应该有上面的内容,先解释一下上面7个字段的意思,如图6-1所示。
图6-2 文件属性的示意图
1. 第一列表示这个文件的属性:这个地方最需要注意。仔细看的话,应该可以发现这一列其实共有10个属性,如图6-3所示。
图6-3 文件的10个属性内容
第一个属性表示这个文件是“目录、文件或连接文件等等”:
当为 [d] ,则是目录,例如上面列表的第11行。
当为 [-] ,则是文件,例如上面列表的第5行。
若是 [l] ,则表示为连接文件(link file)。
若是 [b] ,则表示为设备文件里可供存储的接口设备。
若是 [c] ,则表示为设备文件里的串行端口设备,例如键盘、鼠标。
接下来的属性中,三个为一组,且均为“rwx”3个参数的组合。其中,[r] 表示可读(read)、[w] 表示可写(write)、[x] 表示可执行(excute):
第一组为“拥有者的权限”,以第5行为例,该文件的拥有者可以读写,但不可执行。
第二组为“同用户组的权限”。
第三组为“其他非本用户组的权限”。
范例:若有一个文件的属性为“-rwxr-xr--”,说明如下:
[-][rwx][r-x][r--]
1 234 567 890
1:表示这个文件名为目录或文件(上面为文件)。
234:拥有者的权限(上面为可读、可写、可执行)。
567:同用户组用户权限(上面为可读可执行)。
890:其他用户权限(上面为仅可读)。
上面的属性情况表示一个文件、这个文件的拥有者可读、可写、可执行、但同用户组的人仅可读与执行,非同用户组的用户仅可读的意思。
除此之外,需要特别注意的是x。若文件名为一个目录的时候,例如.ssh目录:
drwx------ 3 root root 4096 Jun 25 08:35 .ssh
可以看到这是一个目录,而且只有root可以读写与执行。但是,若为下面的样式时,请问非root的其他人是否可以进入该目录呢?
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh
似乎是可以。因为有可读 [r] 存在。“错”。答案是非root账号的其他用户均不可进入 .ssh目录,为什么呢?因为x与目录的关系相当重要,如果在该目录下不能执行任何命令的话,那么自然也就无法进入了,因此,请特别注意,如果想要开放某个目录让一些人进来的话,请记住,开放该目录的x属性。至于目录的权限相关说明,我们会在下面继续介绍。
另外,要更加小心的是,在Windows下面,一个文件是否具有执行的能力是通过“扩展名”来判断的,例如.exe、.bat、.com等等,但在Linux中,文件是否执行,则是通过是否具有x属性来决定的。所以,与文件名没有绝对的关系。这点要特别注意。稍后我们还会针对目录来稍作说明。
1. 第2列表示连接占用的节点(i-node):这个与连接文件(link file)有关,我们在第8章会再介绍。如果是目录的话,那么就与该目录下还有多少目录有关。
2. 第3列表示这个文件(或目录)的“拥有者”。
3. 第4列表示拥有者的用户组。
这里再次解释一下,在Linux中,ID(如root或test等账号均是所谓的ID)即是你的身份,而且还可以附属在一个或多个用户组之下,例如我们上面提到的,你有一个团体(即用户组)代号为testgroup,且这个群体里有三个人,其代号分别是test1、test2与test3,则这三个人为同一用户组,即testgroup。那么,如果以图中的文件属性(-rwxrwx---)来看,如果该文件属于test1所有,那么test2、test3也有读、写、执行的权力,因为他们都属于同一个用户组。而如果你不是属于test1、test2、test3的任何一个人,也不属于testgroup这个用户组时,那么将不具备读、写、执行这个文件的权限了。
4. 第5列为这个文件的容量大小。
5. 第6列为这个文件的创建日期或者是最近的修改日期,分别为月份、日期及时间。请特别注意,如果是以中文来安装Linux,那么默认的语系可能会被改为中文。而由于中文无法显示在命令行类型的终端上,所以这一列会成为乱码,这个时候,请修改一下 /etc/sysconfig/i18n文件,将里面的“LC_TIME”修改为:“LC_TIME=en”再存储离开,再登入一次,就可以得到英文字形显示的日期了。如何修改该文件呢?以root身份用vi修改。另外,也可以使用“LANG=en ls -al”之类的语法来显示。
6. 第7列为这个文件的文件名,如果文件名之前多一个“.”,则表示这个文件为“隐藏文件”,例如第6行的“.bashrc_history”文件名即是隐藏文件,由于我们有下一个参数为ls -al,所以连隐藏文件都列出来,如果只输入ls,则文件名加“.”的文件就不会显示出来。
更详细的ls用法,还记得怎么查询吗?使用man ls或info ls看基础用法。自我学习很重要,因为“师傅带进门,修行在个人”。自古只有天才学生,没有天才老师。
这7个字段的意义是很重要的。务必清楚地知道各个字段表示的意义。尤其是第一个字段的10个权限,那是整个Linux文件权限的重点之一。下面我们来做几个简单的练习。假设test1、test2、test3同属于testgroup这个用户组:
例题1:如果有下面的两个文件,请说明两个文件的拥有者与其相关的权限是什么?
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt
-rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
答:
文件“test.txt”的拥有者为root,用户组为root。至于权限方面,则只有root这个账号可以存取此文件,其他人则仅能读此文件。
另一个文件“ping_tsai”的拥有者为test1,而用户组为testgroup。其中,test1可以针对此文件具有可读、可写、可执行的权力,而同用户组的test2、test3两个人与test1同样是testgroup的用户组账号,则仅可读、可执行,但不能写(即不能修改),至于非testgoup用户组的人则仅可以读,不能写,也不能执行。
例题2:如果我的目录为下面的样式,请问testgroup用户组的成员与其他人(others)是否可以进入本目录?
drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
答:
文件拥有者test1可以在本目录中进行任何工作。
testgroup用户组的账号,例如test2、test3也可以进入本目录进行工作,但不能在本目录下写入。
other的权限中虽然有r,但由于没有x的权限,因此others的用户,并不能进入此目录。
• Linux文件属性的重要性:与Windows系统不一样的是,在Linux系统(或者说类Unix-Like系统)中,每一个文件都多加了很多属性,尤其是用户组的概念,这有什么用途呢?基本上,最大的用途是“安全性”。举个简单的例子,在系统中,关于系统服务的文件,通常只有root才能读写,或者是执行,例如 /etc/shadow这个账号管理的文件,由于该文件记录了系统中所有账号的数据,因此是很重要的信息文件,当然不能让任何人读取,只有root才能读取。所以该文件的属性就会成为 [-rw-------] 。
那么,如果你有一个开发团队,在团队中,你希望每个人都可以使用某些目录下的文件,而非团队的其他人则不予以开放呢,怎么办?以上面的例子来说,testgroup的团队共有3个人,分别是test1、test2、test3。那么就可以将test1的文件属性设置为 [-rwxrwx---],提供给testgroup的工作团队使用。这相当重要。
再举例说明,如果目录权限没有做好,可能造成其他人都可以在系统上乱动。例如本来只有root才能做的开关机、ADSL的拨号、新增或删除用户等,若被改成任何人都可以执行的话,那么,如果用户不小心重新开机,重新拨号等等。那么,系统就会常常莫名其妙地死机。而且万一用户密码被其他不明身份的人获取,只要他登入你的系统,就可以轻而易举地执行一些root的工作。相当可怕。因此,在修改linux文件与目录的属性之前,一定要先清楚,什么是可变的,什么是不可变的。千万注意。