Shell 文件权限、所有权与粘滞位,文件权限和所有权是Unix/Linux文件系统的显著特性之一。这些特性能够在多用户环境中保护你的个人信息。不匹配的权限和所有权也会导致文件共享方面的难题。本章讲解了如何有效地设置文件的权限和所有权。
每一个文件都拥有多种类型的权限。在这些权限中,我们通常要和三组权限打交道(用户、用户组以及其他用户)。用户(user)是文件的所有者,通常拥有所有的访问权。用户组(group)是多个用户的集合(由系统管理员指定),可能拥有文件的部分访问权。其他用户(others)是除文件所有者或用户组成员之外的任何人。
ls
命令的-l
选项可以显示出包括文件类型、权限、所有者以及组在内的多方面信息:
-rw-r--r-- 1 slynux users 2497 2010-02-28 11:22 bot.py
drwxr-xr-x 2 slynux users 4096 2010-05-27 14:31 a.py
-rw-r--r-- 1 slynux users 539 2010-02-10 09:11 cl.pl
第1列表明了文件类型。
-
:普通文件。d
:目录。c
:字符设备。b
:块设备。l
:符号链接。s
:套接字。p
:管道。
接下来的9个字符可以划分成三组,每组3个字符(--- --- ---
)。第一组的3个字符对应用户权限(所有者),第二组对应用户组权限,第三组对应其他用户权限。这9个字符(即9个权限)中的每一个字符指明是否其设置了某种权限。如果已设置,对应位置上会出现一个字符,否则出现一个-
,表明没有设置对应的权限。
有3种常见的字符。
r
(read
):如果设置,表明该文件、设备或目录可读。w
(write
):如果设置,表明该文件、设备或目录可以被修改。对于目录而言,此权限指定了是否可以在目录下创建或删除文件。x
(execute
):如果设置,表明该文件可执行。对于目录而言,此权限指定了能否访问目录下的文件。
让我们来看一下每组权限对于用户、用户组以及其他用户的含义。
- 用户(权限序列:
rwx------
):定义了用户权限。通常来说,对于数据文件,用户权限是rw-
;对于脚本或可执行文件,用户权限是rwx
。用户还有一个称为setuid
(S
)的特殊权限,它出现在执行权限(x
)的位置。setuid
权限允许可执行文件以其拥有者的权限来执行,即使这个可执行文件是由其他用户运行的。具有setuid
权限文件的权限序列可以是这样的:-rwS------
。 -
用户组(权限序列:
---rwx---
):第二组字符指定了组权限。组权限中并没有setuid
,但是有一个setgid
(S
)位。它允许使用与可执行文件所属组权限相同的有效组来运行该文件。但是这个组和实际发起命令的用户组未必相同。例如,组权限的权限序列可以是这样的:----rwS---
。 -
其他用户(权限序列:
------rwx
):最后3个字符是其他用户权限。如果设置了相应的权限,其他用户也可以访问特定的文件或目录。作为一种规则,通常将这组权限设置为---
。
目录有一个叫作粘滞位(sticky bit)的特殊权限。如果目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,就算用户组和其他用户也有写权限,仍无能无力。粘滞位出现在其他用户权限组中的执行权限(x
)位置。它使用t
或T
来表示。如果没有设置执行权限,但设置了粘滞位,就使用T
;如果同时设置了执行权限和粘滞位,就使用t
。例如:
------rwt , ------rwT
设置目录粘滞位的一个典型例子就是/tmp
,也就是说任何人都可以在该目录中创建文件,但只有文件的所有者才能删除其所创建的文件。在ls -l
的每一行输出中,字符串slynux users
分别对应用户和用户组。在这里,slynux
是文件所有者,也是组成员之一。
实战演练
可使用chmod
命令设置文件权限。假设需要设置权限:rwx rw- r-
。可以像下面这样使用chmod
:
$ chmod u=rwx g=rw o=r filename
命令中用到的选项如下。
u
:指定用户权限。g
:指定用户组权限。o
:指定其他用户权限。
可以用+
为用户、用户组和其他用户添加权限,用-
取消权限。为已经具有权限rwx rw- r-
的文件添加可执行权限:
$ chmod o+x filename
该命令为其他用户添加了x
权限。给所有权限类别(即用户、用户组和其他用户)添加可执行权限:
$ chmod a+x filename
其中,a
表示全部(all),如果需要删除权限,则使用-
,例如:
$ chmod a-x filename
权限也可以使用3位八进制数来表示,每一位按顺序分别对应用户、用户组和其他用户。读、写和执行权限都有与之对应的唯一的八进制数:
r = 4
w = 2
x = 1
我们可以相加权限对应的八进制值得到所需的权限组合。例如:
rw- = 4 + 2 = 6
r-x = 4 + 1 = 5
权限rwx rw- r--
的数字表示形式如下:
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-- = 4
因此,rwx rw- r--
等于764,那么使用八进制值设置权限的命令为:
$ chmod 764 filename
补充内容
让我们再看一些其他有关文件和目录的操作。
- 更改所有权
可以使用chown
命令更改文件或目录的所有权:
$ chown user:group filename
例如:
$ chown slynux:users test.sh
在这里,slynux
是用户名,users
是组名。
- 设置粘滞位
粘滞位可以应用于目录。设置粘滞位后,只有目录的所有者才能够删除目录中的文件,即使其他人有该目录的写权限也无法执行删除操作。可以使用chmod
的+t
选项设置:
$ chmod a+t directory_name
- 以递归方式设置文件权限
有时候需要以递归的方式修改当前目录下的所有文件和子目录的权限。chmod
的-R
选项能够实现这种需求:
$ chmod 777 . -R
选项-R
指定以递归的方式修改权限,我们用.
指定当前工作目录,这等同于:
$ chmod 777 "$(pwd)" -R
- 以递归的方式设置所有权
用chown
命令的-R
能够以递归的方式设置所有权:
$ chown user:group . -R
- 以不同的身份运行可执行文件(setuid)
一些可执行文件需要以另一种身份来运行。例如,http服务器会在系统启动期间由root负责运行,但是该进程应该属于用户httpd
。setuid
权限允许其他用户以文件所有者的身份来执行文件。
首先将文件的所有权更改为需要执行该文件的用户,然后以该用户的身份登录。运行下面的命令:
$ chmod +s executable_file
# chown root:root executable_file
# chmod +s executable_file
$ ./executable_file
现在,无论是谁发起调用,该文件都是以root用户的身份来执行。setuid
只能应用在Linux ELF格式的二进制文件上。你不能对脚本设置setuid
。这是一种安全特性。