Enghish Version

MandrakeUser.Org - Your Mandrake-Linux Knowledge Base!

* DocIndex - Basics

权限 第二篇

* 实例
* 改变权限
* 常用技巧

相关资源:

man chmod
man chown

LIGS, 3.1
RUTE, 16.1

Revision / Modified: April 21, 2002
Author: Tom Berger
Translator: Wu XiaoGuang

* 实例

有些糊涂吗?;-) 没关系,看看下面的例子就清楚了。

文件

‘slocate’包是一个很好的例子。如果您已经安装了这个包,那就打开一个终端并输入:

ls -l /usr/bin/updatedb

这是更新‘(s)locate’资料库的程序。您得到的结果类似于:

-rwxr-xr-x 1 root slocate [...] /usr/bin/updatedb*

前九个字符描述了存取权限(第一个‘-’标识了文件类型)

所有者(Owner) | 组(Group) | 其他人 (Others)= rwx | r-x | r-x

您应该还记得:‘r’表示读(read),‘w’表示写(write),而‘x’则表示执行(execute)‘-’指未设置,也就是没有这个权限。权限的顺序一般是‘rwx’。所以,上述字符串的含义是:

  • 文件可以被所有者读/写 - 或删除 - 和执行 (rwx) ,
  • 文件可被组员读和执行(r-x),
  • 文件可被其他人读和执行(r-x)。

现在您需要知道文件属于谁、属于哪个组。您可以在 inode 号(1)后找到这些信息:

root slocate

所有者是‘root’,组名是‘slocate’。

目录

目前为止很顺利,但如果您以普通用户执行上面的命令,将得到:

slocate: You are not authorized to create a default slocate database!

slocate 资料库在‘/var/lib/slocate’,让我们来看一看:

ls -l /var/lib/
drwxr-x--- 2 root slocate [...] slocate/

这个目录的权限看起来有些不同:

  • 所有者(这里是‘root’)可以进入这个目录(rx),可以添加或删除里面的内容 (w) ,
  • ‘slocate’组中的成员可以进入这个目录读取内容 (rx) ,
  • 其他人没有任何权利 (---) 。

(请记住:对于目录,读和执行的权限必须成对出现,也就是如果想进入某个目录,您必须有这两个权利!)
由于您不是‘root’,也就不能运行‘updatedb’:您缺少改变‘/var/lib/slocate’内容的权利。
现在您可能会想:“我没有权利获取 slocate 资料库,但为什么就可以用普通用户的身份来运行‘locate’呢?这当然也需要从资料库中获取!” 没错。

setUID, setGID

如果您运行 ls -l /usr/bin/locate ,得到的结果类似于:

-rwxr-sr-x 1 root slocate [...] /usr/bin/locate*

请注意:在组权限的行中,‘s’已经替代了‘x’。这就是您先前听说过的另一重要机制: setUID/setGID 。这种机制允许用户以另一 User 或 Group ID 来运行程序。
由于操作系统更喜欢与数字而不是名称打交道,每个帐号和组都有唯一的 ID 号。您使用名称,而系统将其转换成数字。对此您不必担忧,我在这里提到这些只是为了说明‘setUID’和‘setGID’的由来。如果您真的感到好奇,试着运行

id

但如果您运行‘locate’,由于‘setGID’(set Group ID)使得对于‘slocate’组员可执行,系统将认为您是‘slocate’的组员,因此您也就可以读取‘/var/lib/slocate’的资料库。
对于‘setUID’(set User ID)的程序也是如此,经常是‘setuid root’,比如前面提到的‘Xwrapper’:

-rws--x--x 1 root root [...] /usr/X11R6/bin/Xwrapper*

当您启动 X 时,由于‘Xwrapper’的权限设置,操作系统误以为您是‘root’。这样的优点是,您不必是‘root’就可以运行 X ,及 X 下的程序 (请看 进程介绍

* section index * top

* 改变权限

请记住:权限包括了两个概念:所有权和 accessibility (获取程度)。因此您可以通过两种方式影响权限:用命令‘chown’(CHange OWNer)改变所有者,或用‘chmod’’(CHange MODus)改变获取程度。

用‘chown’改变所有者

‘chown’是个比较简单的命令:

chown tom:users test.txt

将文件‘test.txt’改为归用户‘tom’、组‘users’所有。您只能改变属于您的文件的所有权(只有‘root’可以改变不属于自己的目录或文件的权限)。如果您只想改变文件属于的组别可以用‘chgrp’。添上‘-R’可选项后,您可以递归地来执行这个命令(也就是改变目录下所有文件、目录的权限)

chown -R tom:users docs

将目录‘docs’下的所有文件和目录设成属于‘tom’、组‘users’。

用‘chmod’改变获取程度

‘chmod’就有些复杂了。这里有三个部分:用户(user)、组(group)及其他(others),分别取头一个字母:u 、g 、o 。有三种权利:读(read)、写(write)、执行(execute),也就是‘rwx’。简化的‘chmod’语法如下所示:

chmod [ugo] [+-] [rwx] file

我们假设您想授给(+)其他人(others,o)对文件‘test.txt’有读(read,r)的权利。命令就是:

chmod o+r file.txt

您如果想除去组员(group,g)对程序‘/usr/bin/runme’执行(execute,x)的权利,就用:

chmod g-x /usr/bin/runme

(很多情况下,您得用‘root’身份来完成这些……)。
您希望拒绝除了所有者以外任何人对‘secure’目录的访问:

chmod go-rwx secure

‘chmod’还有一些实用的变通,如‘a’(对于所有,all),因此

chmod a+r test.txt

将允许所有者、组员及其他人读取该文件。
另一个是设置 UID 或 GID 用的‘s’:

chmod a+x,u+s file

将‘file’设成‘setUID root’,对所有人都可执行。
和‘chown’类似,您可以用‘-R’(大写的‘R’!)可选项使‘chmod’递归执行。但要注意下面的警告!

‘chmod’也接受由三个八进制数定义的权限:‘4’指‘可读’,‘2’指‘可写’、‘1’指‘可执行’。如果哪个没有被赋值,就设成‘0’。对应的表示是有,‘setuid’(4)、‘setgid’(2) 或‘sticky bit’(1):

chmod 750 file

将赋予所有者读+写+执行(4+2+1=7)‘file’的权利,组员有权读+执行 (4+0+1=5),其他人不能进行任何操作 (0+0+0=0)

这两种方法有区别吗?有区别,第一种是设置相对的权限,而第二种是绝对的权限。
例子:

ls -l some.txt
-rw-r----- (...) some.txt

现在假设您想赋给其他人(others)读这个文件的权利,用第一个方法,就需要命令:

chmod o+r some.txt

得到的结果是:

-rw-r--r-- (...) some.txt

用第二个方法的话,同样可以满足要求,但结果可以不同:

chmod 444 some.txt
-r--r--r-- (...) some.txt

第一种方法保留了所有者写的权利,但用了第二种方法后,您还得确认所有者、组员及其他人的绝对权限,以使得符合最初的愿望,在这里是:

chmod 644 some.txt

您最好熟悉其中的一种,以免混淆。

* section index * top

* 常用技巧

处理权限时要小心了!由于这关系到 Linux 的安全,轻率的举动可能导致一些问题,下面就有些例子:

chmod -R a-x text 这是很常见的一种。您从 MS Windows 分区中复制了一个名为‘text’的目录,由于在文件处理上的差异,这个目录下的所有文件都被设成了可执行(x)。您觉得上面的命令没有问题,但下次您想进入这个目录时,将得到:

bash: cd: text: Permission denied

您用‘su’切换到‘root’帐号,再运行:

bash: cd: text: Permission denied

这是怎么回事?您不仅除去了‘text’目录下文件的可执行权,而且还影响了目录本身!这意味着即使是‘root’也不能进入这个目录!只能再将目录设成可执行:

chmod ug+x test

如果您希望除去目录结构下文件的可执行权限,而又想不影响目录,您可以用:

find . -type f -exec chmod a-x {} \;

这将寻找所有文本文件(-type f),然后对这些文件运行(-exec)‘chmod a-x’。

chmod a+rw /dev/... 这是为绕过设备文件的权限冲突的常见小办法。一般来讲,将权限赋给‘others’组时要特别小心。如果这个组包含任何人,那对方可能是您系统的合法用户,但也可能是无聊的入侵者。如果程序配置要求这么做,那这样的程序一定存在某些问题。如果实在没有其他办法,最好用下面的办法:

1) ‘su’为‘root’,然后对那个设备文件运行 chmod g+rw,o-rwx
2) 对那个文件运行 chgrp group
3) 通过‘/etc/group’,将用户加到对应的中。

对于要求 setUID root 的程序,方法类似。如果您觉得一定要将某个程序设为‘uid root’,那就可以用我在 关于 PPP 的文章 中介绍的办法。

请注意:将设备文件改变权限可能没有效果,或只有短期作用,这要取决于 devfs 或 PAM 。

在‘chmod’前执行‘chown’,这是个坏主意,因为‘chmod’将使先前运行的‘chown’多余。‘chmod’根据运行这个命令的用户的 GID 和 UID ,来设置文件所有者和组员的权限。所以请运行‘chmod’,然后在执行‘chown’!

* section index * top

别紧张,这里讲的其实比实际应用要复杂些。如果您感到疑惑,没关系,因为我也有些弄不清楚(而且不是一点半点 ;-) )


Legal: All texts on this site are covered by the GNU Free Documentation License.
Standard disclaimers of warranty apply.