Linux文件权限与chmod命令简介
2020-07-13 本文已影响0人
LittleMagic
前言
最近一段时间忙大项目,抽空写篇流水账,然后趁早休息。
Linux系统的文件权限用来决定哪些用户和组可以对文件执行何种操作,以保证安全性。笔者试图不参考其他资料,按照记忆快速总结之。
文件权限
我们都知道,通过ls -l
/ll
命令能够以长形式显示出文件的各种属性。例:
~ ll -h /etc
total 1.6M
# 类型和权限|链接数|所有者|所属组|大小|最后修改时间|名称
-rw-r--r--. 1 root root 16 Dec 3 2018 adjtime
-rw-r--r--. 1 root root 1.5K Jun 7 2013 aliases
-rw-r--r-- 1 root root 12K Nov 29 2018 aliases.db
drwxr-xr-x. 2 root root 4.0K Jun 4 17:57 alternatives
-rw-------. 1 root root 541 Apr 11 2018 anacrontab
-rw-r--r--. 1 root root 55 Apr 11 2018 asound.conf
-rw-r--r-- 1 root root 1 Apr 11 2018 at.deny
drwxr-x---. 3 root root 4.0K Nov 29 2018 audisp
drwxr-x---. 3 root root 4.0K Nov 29 2018 audit
drwxr-xr-x. 2 root root 4.0K Jul 2 14:41 bash_completion.d
-rw-r--r--. 1 root root 2.8K Apr 11 2018 bashrc
drwxr-xr-x. 2 root root 4.0K Sep 27 2018 binfmt.d
-rw-r--r-- 1 root root 38 Oct 8 2018 centos-release
-rw-r--r-- 1 root root 51 Oct 8 2018 centos-release-upstream
drwxr-xr-x. 2 root root 4.0K Aug 4 2017 chkconfig.d
-rw-r--r--. 1 root root 1.9K Jun 4 11:01 chrony.conf
-rw-r-----. 1 root chrony 481 Sep 15 2017 chrony.keys
drwxr-xr-x 3 clickhouse clickhouse 4.0K Jul 6 15:45 clickhouse-client
我们要关心的是第1列,以drwxr-xr-x
为例:
- 第1个字符表示文件类型——如
-
表示普通文件,d
表示目录,l
表示软链接等等,不多废话。 - 第2~4个字符表示文件所有者(第3列示出)的权限——
r
表示可读,w
表示可写,x
表示可执行。如果没有某个权限,会以-
来占位。 - 第5~7个字符表示文件所属组(第4列示出)的权限,含义同上。
- 第8~10个字符表示系统内其他用户的权限,含义同上。
- 最后一个可能存在的字符
.
(也有可能是+
)表示该文件受到SELinux或ACL的控制,不在讨论范围内。
所以,drwxr-xr-x
就意味着文件所有者拥有目录的读、写、执行权限,文件所属组拥有读、执行权限,其他用户拥有读、执行权限。
多说一句,只有用户对目录拥有执行权限,才能使用cd
命令进入目录,以及访问目录下的文件数据,所以我们看到的绝大多数目录都会带有x
。如果只有r
的话,那么用户仅能通过ls
命令列出目录的文件清单,其他什么都做不了。
八进制表示法
对于每一组rwx
,将拥有的权限视为二进制1,不拥有的权限视为二进制0,即可形成一个八进制数字,如:
-
rwx
= 111 = 7 -
rw-
= 110 = 6 -
r-x
= 101 = 5 -
r--
= 100 = 4 -
---
= 000 = 0
将文件所有者、文件所属组和其他用户的权限排列起来,就是完整的数字权限表示,如上文的drwxr-xr-x
就是755。
多说第二句,Linux系统中创建新文件时的默认权限就是由八进制表示法的掩码决定,可以通过umask
命令获取及设置此掩码。一般来讲,这个掩码是0022(最高位表示附加权限,本文不表)。所以:
- 普通文件的默认权限是666 - 022 = 644 =
rw-r--r--
- 目录的默认权限是777 - 022 = 755 =
rwxr-xr-x
chmod命令
chmod命令用于更改文件权限,它有两种使用方式。
字符串设定
此种方式的语法为:
chmod [role][+|-|=][mode] [filename]
其中,role表示要更改权限的角色,可以是如下字符或它们的组合:
-
u
:文件所有者 -
g
:文件所属组 -
o
:其他用户 -
a
:全部用户(默认值)
后面的符号则比较容易理解,+
表示添加权限,-
表示取消权限,=
表示直接赋予权限。举例:
- 为my_script.sh添加所有用户的执行权限
# 等同于chmod +x my_script.sh
chmod a+x my_script.sh
- 为my_script.sh取消所有者、所属组的写权限,并设定其他用户只读权限
chmod ug-w,o=r my_script.sh
八进制设定
此种方式不提供上一种方式的+
、-
语义,只有=
语义,其语法为:
chmod [octal] filename
octal就是上面说过的八进制表示法,举例:
- 为my_script.sh设定所有者全部权限,所属组可读和执行权限,其他用户无权限
# rwxr-x---
chmod 750 my_script.sh
最后,如果要递归地改变目录与其所有子目录以及文件的权限,在chmod后紧跟-R
即可。
The End
零散写了一点,各位当睡前读物随便看看吧。
晚安晚安。