|
有些糊涂吗?;-) 没关系,看看下面的例子就清楚了。
文件
‘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
别紧张,这里讲的其实比实际应用要复杂些。如果您感到疑惑,没关系,因为我也有些弄不清楚(而且不是一点半点 ;-) )。
|