1.权限的常规表示
文件和目录的权限
文 件 | 目 录 |
无权限(-) | 无权限(-) |
读(r):允许读文件的内容 | 读(r):允许查看目录中 有哪些文件和目录 |
写(w):允许向文件中写入数据 | 写(w):允许在目录下创建 (或删除)文件和目录 |
执行(x):允许将文件作为程序执行 | 执行(x):允许访问目录 (用cd 命令进入该目录, 并查看目录中可读文件的内容) |
权限的表示方法与含义
符号表示 | 八进制表示 | 含 义 |
- | 0 | 没有权限 |
r | 4 | read的缩写,拥有读权限 |
w | 2 | write的缩写,拥有写权限 |
x | 1 | execute的缩写,拥有执行权限 |
s、S、t、T |
| 特殊权限 |
权限的作用范围
符号表示 | 含 义 |
u | user的缩写,文件所有者(文件的创建者) |
g | group的缩写,同组用户(与文件所有 者同组的用户) |
o | other的缩写,其他用户(系统中除所有者、 同组用户以外的用户) |
a | all的缩写,全部的用户,包括所有者、 同组用户及其他用户 |
文件和目录的权限字段
位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
值 | - | r或- | w或- | x或- | r或- | w或- | x或- | r或- | w或- | r或- |
说明 | 文件 类型 | 属主的权限 | 组权限 | 其他用户的权限 |
2.使用chmod命令进行权限设置
可以使用命令chmod来为文件或目录赋予权限。chmod 命令格式如下:
- chmod [选项] [模式] [参考文件=文件名]
其中各可用选项的意义如下。
-c, --changes:与verbose相反,只在有更改时才显示结果。
-f, --silent, --quiet:去除大部分的错误信息,静默模式。
-v, --verbose:显示全部信息,冗余模式。
--reference=file:不再使用自行指定权限的模式进行权限赋值,而使用[参考文件]的模式。
-R, --recursive:以递归方式更改所有的文件及子目录。
-help:显示帮助信息并退出。
-version:显示版本信息并退出。
1.八进制模式
chmod命令中的[模式]可以是八进制模式,即八进制数字表示的权限,同表6.11所示。例如预设置普通文件ABC.exe的属主权限为读、写、执行,组权限为读、写,其他用户的权限为读,即文件ABC.exe的权限为rwxrw-r--,转化为八进制可表示为764。使用命令如下:
- #chmod 764 ABC.exe
- #ls -l ABC.exe
- -rwxrx-r-- 1 root root 224 07-21 23:10 ABC.exe
再如把/home/teacher目录的权限设为属主可以读、写、执行,用户组也可以读、写、执行,其他用户只能读,则权限应设置为rwxrwxr--,转化为数字表示应为774。命令如下所示:
- #chmod 774 /home/teacher
- #ls -l
- drwxrwxr-- 2 root root 224 07-21 23:30 teacher
- … …
上例中的命令只能修改/home/teacher目录的权限,如果需要将/home/teacher目录及其目录中的文件和子目录的权限一并进行修改,使用递归参数"-R"即可。例如将/home/teacher中的所有文件及子目录一并修改为rwxrwxrwx,命令如下所示:
- # chmod -R 777 teacher1
- # ls -l teacher1
- drwxrwxrwx 2 root root 4096 07-26 15:58 homework
- -rwxrwxrwx 1 root root 0 07-26 15:58 pp.c
- #cd ..
- # ls -l
- drwxrwxrwx 4 teacher1 teacher1 4096 07-26 15:58 teacher1
- … …
可以看到目录teacher、子目录homework,以及teacher下的文件pp.c具有相同的权限。
2.字符模式
chmod的权限模式既可以用八进制数字的方式表示,也可以使用字符方式,配合运算符"+"、" "、"=",增加、减少权限或指定权限。修改权限可选用的字符选项如表6.12所示。
表6.12 权限的字符选项
用户对象表 | 修改操作 | 权限表示 |
u 文件所有者 g 同组用户 o 其他用户 a 所有用户 | + 赋予权限 - 拒绝权限 = 设置权限 | r 读权限 w 写权限 x 执行权限 - 无权限 s,S 设置set-UID和set-GID t,T 粘滞位 |
例如给文件ABC.exe的属主增加执行权限,命令行如下:
- # ls -l
- -rw-r--r-- 1 root root 0 07-26 08:16 ABC.exe
- # chmod u+x ABC.exe
- # ls -l
- -rwxr--r-- 1 root root 0 07-26 08:16 ABC.exe
- 又如去掉同组和其他用户的读权限,可以使用命令:
- # ls -l
- -rwxr--r-- 1 root root 0 07-26 08:16 ABC.exe
- # chmod g-r,o-r ABC.exe
- # ls -l
- -rwx------ 1 root root 0 07-26 08:16 ABC.exe
注意:设置的各权限之间用","分隔,且","前后不可有空格,否则无法执行命令。
例如重新设定文件ABC.exe的其他用户的权限为读取,可以使用命令:
- # ls -l
- -rwx------ 1 root root 0 07-26 08:16 ABC.exe
- # chmod o=r ABC.exe
- # ls -l
- -rwx---r-- 1 root root 0 07-26 08:16 ABC.exe
又如重新设定文件ABC.exe的其他用户的权限为读取、写入和执行,可以使用命令:
- # ls -l
- -rwx---r-- 1 root root 0 07-26 08:16 ABC.exe
- # chmod o=rwx ABC.exe
- # ls -l
- -rwx---rwx 1 root root 0 07-26 08:16 ABC.exe
再如为所有用户(包括属主、组和其他)赋予写权限,可以使用命令:
- # ls -l
- -r-x---r-- 1 root root 0 07-26 08:16 ABC.exe
- # chmod a+w ABC.exe
- # ls -l
- -rwx-w-rwx 1 root root 0 07-26 08:16 ABC.exe
利用chmod的[reference=file]选项可以对文件的权限进行复制,将"reference(参考)"文件的权限直接复制给指定文件。例如:
- # ls -l
- -rwx---r-- 1 root root 0 07-26 08:16 ABC.exe
- # chmod -reference=ABC.exe copy.x
- # ls -l
- -rwx---rwx 1 root root 0 07-26 08:19 ABC.exe
- -rwx---rwx 1 root root 0 07-26 08:19 copy. x
- … …
可以看到copy. x文件与ABC.exe文件拥有了相同的权限。
3.设置特殊权限
除了读、写和执行权限之外,在Red Hat Enterprise Linux 文件系统中还有特殊权限,包括set-UID、set-GID及黏滞位(sticky)。
从表6.11中可以看到,使用chmod命令可以对特殊权限进行设置。如果要加上特殊权限,chmod命令必须使用4位八进制数字格式。其中第1位表示特殊权限,set-UID对应值为"4",set-GID对应值为"2",黏滞位对应值为"1"。其余三位表示普通权限(包括属主、用户组及其他用户的权限)。
1.设置set-UID
如果文件的权限被设置为set-UID,则表示如果该文件是可执行的,则运行该文件的用户将在程序运行期间拥有与该文件的属主相同的权限。例如,假设有下面的Shell脚本程序被存储到test.exe文件中:
- #cat test.exe
- #!/bin/bash
- echo $PATH
- ps -aux >>/home/process
- #
使用chown命令设置test脚本的属主,使用chmod命令设定脚本的权限:
- #chown root:root test.exe
- #chmod 4777 test.exe
- # ls -l test.exe
- -rwsrwxrwx 1 root root 0 07-26 08:19 test.exe
此时test.exe的属主是root,由于设置了set-UID位,任何运行该文件的用户都会临时具有root身份,这无疑是非常危险的,所以应慎重使用set-UID权限。
2.设置set-GID
与set-UID类似,如果文件的权限被设置为set-GID,则表示如果该文件是可执行的,则运行该文件的用户会在运行期间拥有与该文件的用户组相同的权限。例如可以对文件test1.exe设定set-GID:
- #chown root:nobody test1.exe
- #chmod 2775 test1.exe
- # ls -l test1.exe
- -rwxrwsr-x 1 root root 0 07-26 09:19 test1.exe
3.设置黏滞位
如果文件被设置了黏滞位(sticky-bit),则表示如果该文件是可执行的,一旦其被装载进内存就将一直驻留内存。例如对文件test2.exe设定黏滞位,命令如下:
- #chmod 1775 test2.exe
- # ls -l test2.exe
- -rwxrwxr-t 1 root root 0 07-26 10:19 test1.exe
注意:只需将特殊权限所对应的值相加,就可一次完成文件的特殊权限设置。例如对文件text3.exe设置set-UID、set-GID及黏滞位,各值相累加结果为4+2+1=7,则命令行为:
- #chmod 7775 test3.exe
- # ls -l test2.exe
- -rwsrwsr-t 1 root root 0 07-23 13:19 test3.exe
- … …
4.设置文件或目录的默认权限
对每一个新创建的文件或目录,系统都会自动赋予一个默认的权限。可以使用umask命令设置文件或目录的默认权限。umask命令的格式如下所示:
- umask [mask]
其中[mask]可以是由4个8进制数字组成的权限掩码,直接使用umask命令可以显示系统默认的权限掩码:
- #umask
- 0022
通常新建文件的默认权限值为0666,新建目录的默认权限值为0777,与当前的权限掩码0022相减,即可得到每个新增加的文件的最终权限值为0666-0022=0644,而新建目录的最终权限值为0777-0022=0755。例如新建文件test,新建目录T,通过ls命令可以看到生成的最终权限:
- #umask
- 0022
- # touch test
- # ls -l test
- -rw-r--r-- 1 root root 0 07-26 09:06 test //test的权限为rw-r--r--,即644
- # mkdir T
- # ls
- T test
- # ls -l
- drwxr-xr-x 2 root root 4096 07-26 09:07 T //T的权限为rwxr-xr-x,即755
- -rw-r--r-- 1 root root 0 07-26 09:06 test
可以使用umask命令重新设置权限掩码。例如将系统默认的权限掩码设为0002,则新建文件的最终权限为0666-0002=0664(即rw-rw-r--),新建目录的最终权限为0777-0002=0775(即rwxrwxr-x),如下所示:
- # umask 0002
- # touch test3
- # ls -l test3
- -rw-rw-r-- 1 root root 0 07-26 09:40 test3
- # mkdir new
- # ls -l
- drwxrwxr-x 2 root root 4096 07-26 09:42 new
- -rw-rw-r-- 1 root root 0 07-26 09:40 test3
umask命令也可以通过表6.12的权限参数直接设置新建文件或目录的默认权限。例如将默认权限改为属主读、写、执行,同组用户读,其他用户读、执行,可以使用如下命令:
- # umask u=rwx,g=r,o=rw
- # umask
- 0031
- # touch p
- # ls -l p
- -rw-r--rw- 1 root root 0 07-26 09:14 p
- # mkdir M
- # ls -l
- drwxr--rw- 2 root root 4096 07-26 09:15 M
- -rw-r--rw- 1 root root 0 07-26 09:14 p
从本例可以看出,"umask u=rwx,g=r,o=rw"与"umask 0031"作用相同,但文件的执行权限不可由umask命令的"x"选项进行指定。
5.访问控制列表ACL
基于用户和用户组的权限机制奠定了Linux系统安全的基础,但在十几年的应用中也暴露出了一些不足,例如权限只能基于用户或用户组进行设定,无法为用户组中的个别用户设定不同的权限。为了增加文件或目录权限管理的灵活性,从Red Hat Enterprise Linux 3开始,访问控制列表(ACL)被引入到系统中。ACL可以根据需要对用户的权限进行定制,支持标准的Ext3文件系统、NTFS文件系统及Samba文件系统。
启动ACL之前首先应对需要进行访问控制的分区或目录进行挂载,具体语法可以参照mount命令,格式如下:
- mount -o acl <device> <mount point>
例如在/myfile目录上挂载带有ACL支持的/dev/sda1分区,命令行如下:
- #mount -o acl /dev/sda1 /myfile
ACL在分区中成功启动后,可以使用setfacl命令来添加、修改或删除访问权限。setfacl常用选项格式及说明如表6.13所示。
表6.13 setfacl常用选项格式及说明
setfacl选项格式 | 说 明 |
[d[efault]:] [u[ser]:]uid [:perms] | 设置用户的权限,4个字段分别 表示默认设置,用户名,用户ID和权限 |
[d[efault]:] g[roup]:gid [:perms] | 设置用户组的权限,4个字段分 别表示默认设置,用户组名, 用户组ID和权限 |
[d[efault]:] m[ask][:] [:perms] | 设置权限掩码,3个字段分别表 示默认设置,掩码和权限 |
[d[efault]:] o[ther][:] [:perms] | 设置其他用户的权限,4个字段分 别表示默认设置,其他用户名, 其他用户名ID和权限 |
可以使用"-m"参数来添加用户或用户组的权限。例如为用户teacher1和teacher2设置对/homework目录的读、写和执行权限,可以运行下面的命令:
- #setfacl -m u:teacher1:rwx /home/homework
- #setfacl -m u:teacher2:rwx /home/homework
为用户student1和student2设置对/homework目录的读、写权限,可以运行下面的命令:
- #setfacl -m u:student1:rw /home/homework
- #setfacl -m u: student2:rw /home/homework
再如为用户组director设置对/home/director目录的读权限,命令行如下:
- #setfacl -m u: director:r /home/director
要对权限进行修改,与添加ACL相同,可以使用带"-m"选项的setfacl命令。例如修改上例中的director用户组的权限为读、写和执行,命令如下:
- #setfacl -m u: director:rwx /home/director
可以使用"-x"参数来删除一个用户或用户组的权限。例如删除上例中director用户组的权限可以使用如下命令:
- #setfacl -x u: director /home/director
使用"-d"选项可以为一个文件或目录设置默认的ACL。例如对使用/home/ftp目录的用户组设定默认的权限为读、写入,命令如下:
- #setfacl-m d:g:rw /home/ftp
注意:若为组中用户重新指定权限,则默认的组权限被覆盖,即具体指定的ACL权限优先于默认ACL权限。
6.权限的图形化管理
在Red Hat Enterprise Linux 5环境下,如果要使用X-Window修改一个文件或目录的权限,需首先打开Nautilus文件管理器。Nautilus文件管理器与Windows资源管理器类似,可以浏览系统的目录结构,可以查找、打开、移动、复制和删除文件或目录,还可以运行脚本程序。
(1)在Nautilus中找到需要修改权限的文件或目录,单击鼠标右键,在快捷菜单中选择【属性】选项,如图6.5所示。
(2)在打开的属性对话框中,可以设置文件或目录的图标、名称和打开方式等。选择【权限】标签,打开【权限】选项卡,如图6.6所示。可以在【权限】选项卡中对文件或目录的所有者、用户组的权限进行修改。
(3)单击【所有者】下拉菜单,会显示目前系统中的所有用户。重新选择一个用户即可更改该文件或目录的属主。同样单击【群组】下拉菜单,也可以更改文件或目录所属的用户组。如图6.7所示。
(4)在【权限】选项卡中单击【访问】下拉菜单,可以对所有者、用户组及其他用户的访问权限进行重新设定,所图6.8所示。
(5)单击【关闭】按钮,完成权限的设置。
在Red Hat Enterprise Linux 4的【权限】选项卡中还可以对特殊权限进行设定。由于特殊权限的设定很可能带来安全隐患,Red Hat Enterprise Linux 5已将该选项从【权限】选项卡中去掉。同时在图6.8中可以看到Red Hat Enterprise Linux 5中加入了SELinux来加强安全控制。
图6.5 在Nautilus文件管理器右键菜单中选择【属性】 |
图6.6 在属性窗口中选择【权限】选项卡 |
图6.7 修改文件或目录的所有者 |
图6.8 修改文件或目录的访问权限 |