Subsections


1 权限

GNU 和 Unix 系统是被设置为可以多人使用同一部计算机,但亦能把某些文件设定为私人的,或是可以使某些人不能更改某些文件。您可以试一试去验证。用您自己的账号登入,即是要使用 root。

whoami
这个指令证实您不是 root。跟着输入以下的指令:

rm /etc/resolv.conf
您应会 被警告 Permission denied(没有权限)。/etc/resolv.conf 是系统的一个重要的配置文件,除非您是 root,您没有能力更改或删除它。这样就能防止您不慎把系统弄坏。假若那部计算机是公众使用的(例如在办公室里或学校里),这样可以防止用者刻意弄坏系统。

现在输入 ls -l /etc/resolv.conf

您会得到类似这样的输出:

-rw-r--r-- 1 root root 119 Feb 23 1997 /etc/resolv.conf

ls 的参数 -l 是用来引出额外的资料。右边的资料比较简单:文件的大小是 119 个字节 (bytes),文件的最后更改日期是 1997 年 2 月 23 日,文件名字是 /etc/resolv.conf。左边的资料就比较复杂了。

首先,来个简短的技术性解释:-rw-r--r-- 是文件的状态1 是指着这个文件的硬性连结 (hard link)(或是一个目录中的文件数目),而那两个 root 是分别指拥有这个文件的用户 (user) 和群组 (group)。

是的,这是有点难以理解,现在就让我们慢慢地解释吧。

1 文件附属权 (file ownership)

每一个文件都有两个拥有者:用户和群组。先前的那个例子有点混淆,因为除了用户 root 之外还有一个群组叫做 root。群组只是一些被一同容许存取系统某部份的用户。games 群组就是一个好例子。

这是一个比较实际的例子。幻想您现在正为一所学校架设一部计算机,您可能想设置某些文件为只可以让老师存取,而学生是不可以的,因此您把所有的老师都放到同一个群组里去。跟着您便告诉系统哪些文件是属于群组 teachers 的成员,而其他人就不能接触到这些文件的。

现在就让我们探索一下系统中的群组。首先,您可以在 shell prompt 用指令 groups,这样会显示您所属于的群组。例子如下:

groups

username dialout cdrom floppy audio

很大机会您只是一个群组的成员,而那个群组的名称和您的用户名称是一样的。不过,root 可以加您到别的群组中。以上的例子表示那个用者是五个群组的成员。

less /etc/group
这个文件列出您的系统中的群组。要留意的是 root 群组(root 是这个群组的唯一成员)和与您的用户名称一样的那个群组。还有其它的群组如 dialout(能够使用 modem 打出的用户)和 floppy(能够使用软磁盘机的用户)。不过您的系统有可能还未设置成利用这些群组,所以,很可能现在只有 root 才能使用软磁盘机和 modem。有关这个文件的详情,请参阅 man group

ls -l /home
这个命令显示,所有用户的目录都是由那个用户及他所属的私人群组所拥有。
提示: 如果您是刚安装 Debian 的,您可能是唯一的用户。您可以使用 adduser 指令来增加用户。

2 状态 (mode)

文件和目录除了是被用户及群组所拥有之外,它们还有一个状态。状态决定谁可以读、写、和执行那个文件(如果它是一个程序)。其实还有其它的东西决定文件的状态,但这些是较深的课题,所以我们亦不会在此讨论。

ls 的输出里,我们可以看到文件的状态是:-rw-r--r--。我们会把它分成九部份来看:拥有文件的用户群组、和其他用户(others,即是系统的所有用户,有时会称这个为world)的 (read), (write),及执行 (execute) 权限。

在状态一行中,第一个“元素”是文件种类 (file type)。这里的 - 表示这是一个普通的文件。如果它是 d,那么我们就是在检查一个目录。还有其它的种类,因太复杂所以不会在这里解说。详细资料可看第 [*] 页的第 13.2.2 节。

剩下来的九个元素是用来显示文件的状态,那九个位(用户、群组、和其他用户的读、写和执行权)是由三组 rwx 来表示。

所以如果文件所有的权限都被许可,而它又是一个普通的档,状态将会是类似这样:-rwxrwxrwx。如果它是一个目录,而所有其他用户的权限都被释放,但用户和群组都被赋予所有权限,那么状态将会是:drwxrwx---


表 7.1: Linux 上的权限

名称 对于文件可做的动作 对于目录可做的动作
r 读取 (read) 察看文件内容 列引目录的内容
w 写入 (write) 更改文件 加减目录里的文件
x 执行 (execute) 执行一个指令 存取目录内的文件


7.1 形容对于文件及目录的读、写、及执行权限的意思。

目录的状态的意义可能有点混淆,所以这里有一些例子用来阐明不同组合的效果:

r--
用户、群组、和其他用户如拥有这个权限,则表示他们可以列出目录的内容,但除此之外不能做其它的事。目录里的文件不能被读取、更改、删除、以及任何方式的处理。唯一可以做的就是读取这个目录,亦即是观看它包含的内容。

rw-
在没有执行权限的时候,写入权限是没有作用的,所以这个状态和上面的那个是一样的。

r-x
这个状态允许列印目录内的文件,以及存取这些文件,但不可以建立或删除文件。存取的意思是您可以观看,更改,及执行这些文件(如果文件本身的权限允许您这样做)。

--x
目录内的文件可以被存取,但它的内容不能被列印,所以您必须事先知道目录中文件的名称(除非您料事如神,能够猜中它们的名字)。您不能建立或删除文件。

rwx
您可以对目录内的文件做任何事,只要文件本身的权限允许您这么做。

目录的写入权限决定了您是否可以删除目录中的文件,如果您有权写入一个目录,您亦可以把内里的一个唯读文件删除掉;然而您不可以删除一个唯读目录中的文件,就算您有权更改那些文件。

亦即是说,如果您拥有一个目录,您就一定可以删除内里的文件,就算那些文件是属于 root 的。

目录的执行权限决定您是否有权存取文件──亦因此决定文件权限的用处。如果您拥有一个目录的执行权限,这个目录类文件的权限就会变得有关系了,否则,文件权限是什么也没有所谓的,因为反正您也不能存取得到那些文件。

3 权限的练习

在这一节我们会看看一个示范怎样使用权限的例子,以下会利用到 chmod 这个指令去改变权限的。

cd; touch myfile
这里有几个有趣的技俩。第一个,是您可以用 ; 来把两个命令放在一行上。您可以把上述的命令打成:

cd 

touch myfile 

或是:

cd; touch myfile
无论那种方法都能达到同样效果。

若您还记得,用 cd 可以立即回到您自己的 home 目录; touch 通常是用来把文件的更新日期 (modification time) 改为现在的时间。但它有另一个有趣的特点:如果文件不存在,touch 便会制造它。所以您是用它来制造一个作练习用的文件。用 ls -l 来确定文件真的已被建立,并且记住它的权限模状态:

ls -l 

-rw-r--r-- 1 user user 0 Nov 18 22:04 myfile

当然,在您试的时候,时间及用户 / 群组都会有别于上述的。文件的大小是 0,因为 touch 建立的是个空的文件。-rw-r--r-- 是 Debian 上的默认权限。

chmod u+x myfile
这个指令的意思是添加 (+) 执行 (x) 权限给拥有该文件的用户 (u)。用 ls -l 去看看它的效果。

chmod go-r myfile
这样做会从拥有该文件的群组 (g) 以及其他用户 (others, o) 的手中夺去 (-) 读取权限 (r)。同样地,使用 ls -l 去验证它的效果。

chmod ugo=rx myfile
这样做会把用户、群组、和其他用户设为拥有读取及执行的权限。这个设定是和您所输入的一模一样,之前的权限将不会保留。所以所有的 rx 都会被设置,而所有的 w 都会被取消。现在,任何人也不能写入这个文件的了。

chmod a-x myfile
augo,或 ``all'' 的简写。因此,所有的 x 权限都会被夺去。

rm myfile
用这个指令来删除文件,但因为您没有写入的权限,所以 rm 会询问以下的问题来确定您是否真的要这样做:

rm: remove `myfile', overriding mode 0444?
您应回答 y,再按 Enter。这个是 rm 的特点,并不关乎权限的问题。能否删除文件取决于它所在的目录的权限。您拥有写入目录的权限,但 rm 发觉您不想改那个文件(因为您已移去了写入权限),所以它认为您也不希望把文件删除,因此它就顺便询问您以确定。

但在问题里出现的那个 0444 究竟是什么呢?其实权限是由一个 12 个位的二进制数字所组成,如 000100100100044 就是这个二进制数字的八进制写法,八进制是填写状态的惯用写法。所以除了输入 chmod ugo=r myfile 之外,您还可以键入 chmod 444 myfile


John Goerzen / Ossama Othman / Debian 中文计划