Linux文件系统权限
通过文件权限控制用户对文件的访问。
文件具有三个应用权限的用户类别:文件归用户所有,通常是创建文件的用户;文件还归单个组所有,通常是创建该文件的主要用户组所有,但是可以进行更改;文件可以为系统上的非所属用户和非所属组的其他用户设置权限。
用户权限覆盖组权限,从而覆盖其他权限。
[root@linuxprobe Desktop]# ll
total 20
drwxr-xr-x 3 root root 17 May 21 23:10 dir1
-rw-r--r-- 1 root root 16 May 30 14:44 test1.txt
-rw-r--r-- 1 root root 16 May 30 14:45 test2.txt
-rw-r--r-- 1 root root 16 May 30 14:45 test3.txt
-rw-r--r-- 1 root root 20 Jun 4 22:57 test.txt
-rw-r--r-- 1 root root 101 May 30 10:25 test.txt~
[root@linuxprobe Desktop]#
r(read)代表读;w(write)代表写;x(execute)代表执行;
上面的示例中第一条:权限开头的第一位标识文件类型,d为目录、-为文件,当然还有其他的类型。再3位标识所属用户的权限为rwx,再3位标识所属用户组权限r-x,最后3位标识其他用户的权限为r-x。第三第四个字段分别代表所属用户和所属组。
文件和目录权限的影像
权限 | 对文件的影像 | 对目录的影像 |
---|---|---|
r(读取) | 可以读取文件的内容 | 可以列出目录的内容 |
w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件 |
x(执行) | 可以作为命令执行文件 | 可以访问目录的内容(取决于目录中文件的权限) |
请注意:用户通常对只读目录具有read和exec权限,因此他们可以列出目录并访问其内容。如果用户对某目录具只有read权限,可以列出其中文件的名称,但是其他信息(包括权限和时间戳)都不可用,也不可访问。如果用户对某目录只有exec权限,则他们不能列出该目录中文件的名称,但是如果它们已知道对其具有读取权限的文件的名称,那么它们可以通过明确地指定文件名来访问文件的内容。
在文件所在的目录中拥有目录写入权限的任何人都可以删除此文件,不论此文件本身的所有权或者权限如何。
查看文件/目录权限和所有权
ls
命令的-l
选项将展开文件列表,以包括文件的权限和所有权;
[root@linuxprobe dir3]# ls -l
total 0
drwxr-xr-x 2 root root 6 Jun 24 11:07 dir4
[root@linuxprobe dir3]#
ls -l directoryname
命令将显示驻留在该目录中所有文件的拓展列表。若要阻止下降至该目录,但可以看到目录本身的信息列表,可在ls
命令上添加上-d
选项:
[root@linuxprobe dir3]# ls -l /home
total 12
drwx------ 3 db2fenc1 db2fadm1 87 Feb 21 12:36 db2fenc1
drwxr-xr-x 9 db2inst1 db2iadm1 4096 Feb 22 17:23 db2inst1
drwx------. 14 linuxprobe linuxprobe 4096 Jun 5 22:36 linuxprobe
drwx------ 15 rwas qlb 4096 Jun 24 10:54 rwas
[root@linuxprobe dir3]# ls -ld /home
drwxr-xr-x. 6 root root 64 Feb 22 10:05 /home
[root@linuxprobe dir3]#
注意:与NTFS权限不同,Linux权限仅适用于设置了Linux权限的目录或文件。目录中的子目录和文件不会继承目录的权限。(但是,目录的权限可能会有效的阻止对其内容的访问。)在每个文件或目录上直接设置Linux中的所有权限。
Linux中目录的读取权限大致等同于Windows中的列出文件夹内容。
Linux中目录的写入权限等同于Windows中的修改;意味着可以新增删除文件和子目录。在Linux中,如果对某目录同时设置了写入和粘滞位,则只有文件或目录的拥有者才可以删除该目录,这与Windows的写入权限行为接近。
从命令行管理文件系统权限
更改文件/目录的权限
用于从命令行更改权限的命令为chmod
,是“change mode(更改模式)”的缩写。chmod
命令在要更改的文件或目录列表后面列出了权限说明。可使用符号(符号法)或数值(数值法)来说明权限。
符号法关键字
chmod WhoWhatWitch file|dorectory
- Who是指u、g、o、a(代表用户、组、其他、全部)
- What是指+、-、=(代表添加、删除、精确设置,可以替换一组权限的整个权限集)
- Witch是指r、w、x(代表读取、写入、可执行)
数值法
chmod ### file|directory
- 每个数字代表一个访问级别:用户、组、其他
- # 是r=4、w=2、x=1的和。
检查权限-rwxr-x---
。对于用户,rwx计算为4+2+1=7。对于组,r-x计算为4+0+1=5,而对于其他用户,—用0+0+0=0表示。将这三个放在一起,这些权限的数值表示是750。
这一计算也可按相反的方向执行。我们来看一下权限640。对于用户权限,6表示读取(4)和写入(2),其显示为rw-。对于组部分,4仅包含读取(4),显示为r–。对于其他用户使用的0表示无权限(—),因此这一文件最终的符号权限集为-rw-r-----。
示例
对test.txt的组和其他用户的权限,删除读取和写入权限:
[root@linuxprobe Desktop]# ls -l test.txt
-rw-rw-rw- 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]# chmod go-rw test.txt
[root@linuxprobe Desktop]# ls -l test.txt
-rw------- 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]#
对test.txt中的每个人添加执行权限:
[root@linuxprobe Desktop]# ls -l test.txt
-rw------- 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]# chmod a+x test.txt
[root@linuxprobe Desktop]# ls -l test.txt
-rwx--x--x 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]#
对test.txt设置用户有读取、写入权限,对组有读取权限,对其他用户设置读取权限:
[root@linuxprobe Desktop]# ls -l test.txt
-rwx--x--x 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]# chmod 644 test.txt
[root@linuxprobe Desktop]# ls -l test.txt
-rw-r--r-- 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]#
注意:对于在整个目录树中递归的权限,
chmod
命令支持-R选项。当使用此选项时,务必要使用X权限,而不是x权限,表示应仅对目录而不是普通文件设置执行权限。例如,以下命令将递归的设置对dir及其子目录设置读取和下入权限,而仅将执行权限应用于目录而非普通文件
[root@linuxprobe Desktop]# chmod -R g+wX dir1/
更改文件/目录的所属用户或所属组
新建的文件由创建该文件的用户所有。默认情况下,新文件的所属组为创建该文件的主要用户的主要用户组。由于红帽企业Linux使用用户专有组,因此该组通常为仅有该用户作为组成员的组。要根据组成员资格授予访问权限,需要更改文件的所有者或者所属组。
使用chown
命令可以更改文件的所有权。例如要将text.txt的所有者更改为rwas,可使用以下命令:
[root@linuxprobe Desktop]# ls -l test.txt
-rw-r--r-- 1 root root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]# chown rwas test.txt
[root@linuxprobe Desktop]# ls -l test.txt
-rw-r--r-- 1 rwas root 20 Jun 4 22:57 test.txt
[root@linuxprobe Desktop]#
chown
可与-R选项配合使用,以递归更改整个目录树的所有权。以下命令可将dir1的所有权及此目录书中的所有文件和子目录授予给rwas:
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# ls -l dir1/
total 0
drwxrwxr-x 3 root root 33 May 22 20:50 dir2
[root@linuxprobe Desktop]# chown -R rwas dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 rwas root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# ls -l dir1/
total 0
drwxrwxr-x 3 rwas root 33 May 22 20:50 dir2
[root@linuxprobe Desktop]#
chown
命令也可以用于更改文件的组所有权,只需在组名称之前加上冒号(:)。例如,下列命令将dir1的所属组更改为qlb:
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 rwas root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# chown :qlb dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 rwas qlb 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]#
chowm
命令也可用于同时修改所有者和所属组,此时可使用语法owner:group。例如,要将dir1的所有权更改回root,同时组更改回root,可使用以下命令:
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 rwas qlb 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# chown root:root dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]#
只有root用户可以更改文件的所有者。但是,root或者文件的所有者可设置文件的所属组。root用户可以将所有权授予任何组,但是非root用户只能将所有权授予给他们的所属组。
注意:除了使用
chown
外,部分用户通过chgrp
命令更改文件所属组;此命令的工作方式与chown
命令完全相同,也可使用-R选项来作用于整个目录树。
管理默认权限和文件访问
特殊权限
对可执行文件的setuid(或setgid)权限表示将以文件的用户(或组)身份运行命令,而不是以运行命令的用户身份。以passwd命令为例,注意观察用户权限位:
[root@linuxprobe Desktop]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 30 2014 /usr/bin/passwd
[root@linuxprobe Desktop]#
目录的粘滞位可以为文件删除设置特殊限制:仅文件所有者(和root)用户可以删除目录中的文件。以/tmp为例:
[root@linuxprobe Desktop]# ls -dl /tmp/
drwxrwxrwt. 14 root root 4096 Jun 25 21:40 /tmp/
[root@linuxprobe Desktop]#
最后,对某目录的setgid权限表示在该目录中创建的文件将继承该目录的组所属关系,而不是继承自创建用户。这通常用于组协作目录,将文件从默认的专有组自动更改为共享组。
特殊权限对文件和目录的影响
特殊权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
u+s(suid) | 需以文件所有者的身份,而不是以运行文件的用户身份执行文件。 | 无影响 |
g+s(sgid) | 以拥有文件的组身份执行文件。 | 在目录中最新创建的文件将其所属组设置为与目录的所属组相同。 |
o+t(sticky) | 无影响 | 对目录具有写入权限的用户可以删除其所拥有的文件,而无法删除或强制保存到其他用户所拥有的文件。 |
设置特殊权限
- 用符号表示:setuid = u+s;setgid = g+s;sticky = o+t;
- 用数值表示:setuid = 4;setgid = 2;sticky = 1;
示例
在dir1目录上添加setgid位:
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# chmod g+s dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwsr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]#
设置setgid位,并对dir1的用户和组设置读取/写入/执行权限:
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwsr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# chmod g-s dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrwxr-x 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]# chmod 2770 dir1/
[root@linuxprobe Desktop]# ls -dl dir1/
drwxrws--- 3 root root 17 May 21 23:10 dir1/
[root@linuxprobe Desktop]#
默认文件权限
文件的默认权限由创建他们的进程设置。例如,文本编辑器创建的文件可由所有者读取和写入,但不可执行。shell重定向也是如此。此外,二进制可执行文件由创建他们的编译器设置为可执行权限。mkdir命令创建新的目录,并设置读取/写入/执行权限。
经验显示,这些权限通常不是在文件和目录创建时予以设置的。这是因为其中一些权限被shell进程的umask清除。不带参数运行umask
命令将显示shell的umask的当前值。
[root@linuxprobe Desktop]# umask
0022
[root@linuxprobe Desktop]#
系统的每个进程都具有umask,他是一个八进制位掩码,用于清除由该进程创建的新文件和目录的权限。如果在umask中设置了一个位,则新文件中对应的权限将被删除。例如,前面的umask 0002清除其他用户的写入位。前导零表示特殊的用户和组权限被清除。umask为077时,清除新创建文件的所有组和其他用户的权限。
通过一个数字参数使用umask
命令,可以更改当前shell的umask。该数字参数应当是与新umask值对应的八进制值。如果少于3位,则假定带有前导0.
Bash shell用户的系统默认umask在/etc/profile和/etc/bashrc文件中定义。用户可以在它们的.bash_profile和.bashrc文件中覆盖系统默认值。