Linux文件的所有权与权限
要了解Linux的权限,需要和Linux的用户与组的概念一并理解,不了解的同学请参考Linux的用户和组
简介
在Linux中,每个文件除了有用户和组的信息以外,还有其对应的权限。可使用来查看。
[root@C7 ~]# ls -l /etc/fstab -rw-r--r--. 1 root root 465 Sep 27 15:49 /etc/fstab
看第一个字段的第二位至第十位,一共九位。
-rw-r--r--.
左三位(rw-):表示文件所有者的权限。
中三位(r--):表示文件所有组的权限。
右三位(r--):表示其他人的权限。
注意:某个进程对于文件是否具备足够的权限,取决于运行该进程的用户对其的权限!
进程安全上下文
进程对文件的访问权限应用模型:
- 检查进程的属主是否与文件的属主一致,若一致则应用文件属主权限;否则下一步。
- 检查进程的属组是否与文件的属组一致,若一致则应用文件属组权限;否则下一步。
- 应用文件其他人权限。
读写执行
对于文件:
- 读(readable,简写r):可以获取文件的数据。
- 写(writable,简写w):可以增删改文件的数据。
- 执行(executable,简写x):若文件为可执行的格式,例如bash脚本、PHP文件等,则可以执行文件。
对于目录:
- 读:可以使用ls命令获取目录的内容,不包含ls -l。
- 写:可以修改目录列表,即增加、删除和重命名目录下的文件。
- 执行:可以对目录使用cd和ls -l命令。
权限组合机制
Linux的权限除了使用rwx字母表示以外,还可以使用八进制数字表示,如下表所示。
一般我们在使用过程中,也习惯使用八进制表示法。
权限 | 二进制 | 八进制 |
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
chmod命令
简介
chmod用于修改文件的权限。
普通用户只能修改属主为自己的文件,root可以修改所有文件。
语法格式
第一种语法格式表示以字符表示法设置权限;第二种语法格式表示以八进制表示法设置权限;第三种语法格式表示参照某个文件设置权限。
在选项当中,基本只会用到递归-R, --recursive(用于修改目录及其子文件的权限)和--reference=RFILE(见下文“权限复制”)
chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --reference=RFILE FILE...
描述
chmod可以根据mode来修改文件的权限,文件的权限也叫作mode bits。mode可以是以字符表示法修改权限或者是以八进制表示法来重置新的权限。
字符表示法
字符表示法的格式如下。
[ugoa...][[+-=][perms...]...]
ugoa分别表示所有者(user)、所有组(group)、其他(other)和所有人(all)。
perms是具体的权限,可以为空(表示无权限)或者为rwxXst中的任意字母。Xst是特殊的权限,目前暂时不做介绍。
[root@C7 ~]# ls -l mode.txt -rw-r--r-- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod u+x mode.txt [root@C7 ~]# ls -l mode.txt -rwxr--r-- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod o-r mode.txt [root@C7 ~]# ls -l mode.txt -rwxr----- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod g=rw mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw---- 1 root root 0 Dec 7 16:58 mode.txt
[root@C7 ~]# ls -l mode.txt -rwxrw-rw- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod a= mode.txt [root@C7 ~]# ls -l mode.txt ---------- 1 root root 0 Dec 7 16:58 mode.txt
也可以是ugo的任意字母。表示参照其他成员配置权限。
[root@C7 ~]# ls -l mode.txt -rwxrw---- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod o=g mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw-rw- 1 root root 0 Dec 7 16:58 mode.txt
字符表示法可以有多个,使用逗号隔开。
[root@C7 ~]# chmod u=rwx,g=rw,o=r mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw-r-- 1 root root 0 Dec 7 16:58 mode.txt
如果省略了ugoa的话,那么默认表示a,但是如此设置权限会受到umask的影响。umask后面会做介绍。
[root@C7 ~]# chmod =rwx mode.txt [root@C7 ~]# ls -l mode.txt -rwxr-xr-x 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# umask 0022
操作符“+”表示增加权限;操作符“-”表示减少权限;操作符“=”表示增加权限并删除没提到的权限,除了目录的SUID和SGID。
八进制表示法
八进制表示法由4位八进制组成,第一位是特殊权限位表示SUID(4)、SGID(2)或者sticky(1),第二位表示用户,第三位表示组,第四位表示其他。
不一定要4位都写出来,省略的话表示前置0。例如
chmod 755 等价于 chmod 0755
chmod 7 不等价于 chmod 0700 而等价于 chmod 0007
chmod与字符链接文件
chmod不会修改字符链接文件的权限(因为chmod的系统调用无法做到),而是修改字符链接文件所指向的文件的权限。但是,如果是递归修改目录的话,那么就会忽略掉目录下字符连接文件了。
权限复制
chmod可以以某个文件作为参照物来设置权限,类似于将某个文件的权限复制到一个或多个文件上。
[root@C7 ~]# ls -l {1,2,3,refer}.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 1.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 2.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 3.txt -rwxrwxrwx 1 root root 0 Dec 10 15:22 refer.txt [root@C7 ~]# chmod --reference=refer.txt {1,2,3}.txt [root@C7 ~]# ls -l {1,2,3,refer}.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 1.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 2.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 3.txt -rwxrwxrwx 1 root root 0 Dec 10 15:22 refer.txt [root@C7 ~]# ls -ld testdir drwxr-xr-x 2 root root 6 Dec 10 15:24 testdir [root@C7 ~]# chmod --reference=refer.txt testdir [root@C7 ~]# ls -ld testdir drwxrwxrwx 2 root root 6 Dec 10 15:24 testdir
chown命令
简介
用于修改文件的属主/所有者(owner)和属组/所有组(group),属主和属组合起来也称为ownership。
语法格式
chown [OPTION]... [OWNER][:[GROUP]] FILE... chown [OPTION]... --reference=RFILE FILE...
第一种格式有以下几种情况:
- 仅修改文件的属主。
# chown OWNER FILE
- 修改文件的属主和属组。
# chown OWNER:GROUP FILE
- 修改文件的属主和属组,且属组为属主的GID。
# chown OWNER: FILE
- 仅修改文件的属组,效果等同于chgrp,因此本博文不会讨论chgrp命令。
# chown :GROUP FILE
常用选项
--from=[CURRENT_OWNER]:[CURRENT_GROUP]:当且仅当文件的ownership为这里指定的属主和属组的时候,才会修改文件的权限;如果属主和属组都指定了,那么必须同时满足才会修改;如果省略了属主或者属组,那么只要满足了给出的属主或者属组,就算会发生修改操作。这个选项在结合-R选项递归修改的时候比较有用。
[root@C7 ~]# ls -l 1.txt -rwxrwxrwx 1 test03 test03 0 Dec 10 15:23 1.txt [root@C7 ~]# chown --from=:test03 test01:test01 1.txt [root@C7 ~]# ls -l 1.txt -rwxrwxrwx 1 test01 test01 0 Dec 10 15:23 1.txt
-H、-L和-P:影响当递归一个目录的时候,如何处理字符链接文件的。
umask
在Linux上,当用户创建文件或者目录的时候,会自动为文件或者目录创建一个权限。
[root@C7 ~]# touch 1.txt [root@C7 ~]# ls -l 1.txt -rw-r--r-- 1 root root 0 Dec 10 16:54 1.txt [root@C7 ~]# mkdir umask_dir [root@C7 ~]# ls -ld umask_dir drwxr-xr-x 2 root root 6 Dec 10 16:55 umask_dir
这种机制,我们就叫做Linux的umask。
umask中的u表示user,mask表示掩码。也就是说umask设置的是创建文件或者目录的时候,应该被剥夺的权限。
umask是shell的内置命令,语法格式如下:
umask [-p] [-S] [mode]
不带选项和参数的时候,是以八进制表示法显示当前shell中的umask值。
-p和-S也是用于显示umask的值的。前者的输出格式可用于再次作为命令执行,后者的输出格式是字符表示法。
如果加上-S选项以字符表示法显示的话,那么显示的就是ugo目前所具备的权限,而不是被拿掉的权限了。
[root@C7 ~]# umask 0022 [root@C7 ~]# umask -p umask 0022 [root@C7 ~]# umask -S u=rwx,g=rx,o=rx
只有当需要重新设置umask的时候,才会带上mode参数。
[root@C7 ~]# umask 0022 [root@C7 ~]# umask 027 [root@C7 ~]# umask 0027
在Linux中,默认不允许文件具备执行的权限。因此,对于文件的默认创建权限为“666-umask”,对于目录的默认创建权限为“777-umask”。
即便我们设置的umask刚好可以使得文件具备可执行权限,也是不行的。权限具体是如何计算的,可以看一下参考资料,涉及一些数学知识,我不太懂。
[root@C7 ~]# umask 023 [root@C7 ~]# touch umask.txt [root@C7 ~]# ls -l umask.txt -rw-r--r-- 1 root root 0 Dec 11 16:50 umask.txt
在Linux中,umask只会影响新建文件的ugo的rwx权限,不会影响新建文件的suid、sgid和sticky权限。因此umask中的第一个0表示的是八进制,可以省略,而不是表示用来设置suid、sgid和sticky权限。
[root@C7 ~]# umask 7022 -bash: umask: 7022: octal number out of range [root@C7 ~]# umask 1022 -bash: umask: 1022: octal number out of range
在当前会话中设置的umask只会在当前的shell(bash)进程中有效,退出会话后就无效了。
要想使其永久生效的话,一般是写入相关的配置文件中。