Linux系统大体来说只有两种角色:用户、文件。从权限管理上说,用户只是文件的一种属性。
一个用户可以访问哪些文件,一个文件可以被哪些用户访问?从这个问题展开,就诞生出了Linux的权限管理思想。
理解权限管理的思想,需要站在文件的角度上看用户。从文件角度看用户,用户分为三类:用户、用户组、其它用户。
一个文件只能属于一个用户,也只能属于一个用户组,除此之外的所有用户,对文件来讲都是其它用户。
因此,讨论一个文件的访问权限,需要分为三种情况:
使用命令ls -al
查看文件属性,可以看到文件的权限信息:
dr-xr-x---. 15 root root 4096 5月 19 23:42 .
dr-xr-xr-x. 18 root root 4096 7月 14 2020 ..
-rw------- 1 root root 17723 5月 20 02:04 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r-- 1 root root 194 8月 28 2017 .bashrc
drwxr-xr-- 9 git git 4096 11月 9 2019 nginx-1.16.1
每一行就是一个文件(目录也是文件的一种类型),其对应的权限信息包含在第一列中,类似于drwxr-xr--
这样的字符串。
第一个字母d
表示文件类型,可以先忽略不看。
从第二个字母开始往后数九个rwxr-xr--
,就是文件的权限信息,每三个字母一组:
rwx
:文件所属用户对该文件的访问权限r-x
:文件所属用户组对该文件的访问权限r--
:除此之外的其它用户对该文件的访问权限其中,每组的三个字母分别代表“读权限(r
)”、“写权限(w
)”、“执行权限(x
)”,字母-
代表没有权限。
rwx
表示用户对该文件拥有“读、写、执行权限”。r-x
表示用户组对该文件拥有“读、执行权限”,没有“写权限”。r--
表示其它用户对该文件拥有“读权限”,没有“写、执行权限”。理解了Linux权限管理的思想,以后登陆系统对文件进行访问操作时,就要时刻明白当前登陆用户对具体文件来说,他是个什么身份。是文件的所属用户,还是文件的所属用户组内的用户,又或者其它用户?不同身份对应着不同的权限!
在Linux系统中,还有一个非常特殊的用户root
,这个用户是系统诞生时就会产生的用户,具有最高权限!啥事儿都能做!记住,root
用户是拿来管理整个系统的,慎重使用!
命令: chown # change owner 的含义
用法:
chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:组名 文件或目录
参数:
-R : 递归(recursive)作用,即连同子目录下的所有文件都更改
范例:
chown bin install.log
chown root:root install.log
注意一点,用户必须是已经存在于系统中的账号,也就是在/etc/passwd
中有记录的账户名称
命令: chgrp # change group 的含义
用法:
chgrp [-R] 用户组名 文件或目录
参数:
-R : 递归(recursive)作用,即连同子目录下的所有文件和目录都更改
范例:
chgrp users install.log
chgrp users running.log startup.sh # 多个文件同时改变
注意一点,用户组必须是已经存在于系统中的组,也就是在/etc/group
中有记录的组名
改变文件权限稍微复杂一点,有两种方式:
实际效果都是一样的,只是写法上略有区别而已。
大道至简,文件权限的精髓只有一句话:
Linux文件的基本权限就9个,分别是owner、group、others三种身份各有自己的read、write、execute权限
权限字符由此衍生:读权限r
,写权限w
,执行权限x
,没有权限-
。
权限数字对应产生:读权限4
,写权限2
,执行权限1
,没有权限0
。
每种身份(owner、group、others)各自的三个权限(r、w、x)数字相加,可以得出一个唯一的值。
例如,要将文件startup.sh
设置成这样的权限集合:
owner = rwx = 4+2+1 = 7 # 可读、可写、可执行
group = rwx = 4+2+1 = 7 # 可读、可写、可执行
others = --- = 0+0+0 = 0 # 不可读、不可写、不可执行
可以说该文件的权限是rwxrwx---
(字符形式),也可以更简单的表达成770
(数字形式)。
所以,数字类型改变文件权限的语法:
命令: chmod
用法:
chmod [-R] xyz 文件或目录
参数:
-R : 递归(recursive)作用,即连同子目录下的所有文件和目录都更改
xyz : 数字类型的权限属性,就是每种身份rwx权限数值相加的结果
范例:
# 文件 startup.sh 设置 rwxrwx--- 权限
chmod 770 startup.sh
# 文件 startup.sh 设置 rwxr-xr-x 权限
chmod 755 startup.sh
这种方式更语义化些,也更加符合人类思考问题的方式。
要点就是两个:
u
代表user
身份,用g
代表group
身份,用o
代表others
身份,用a
代表全部身份+
代表添加权限,用-
代表除去权限,用=
代表设置权限所以,符号类型改变文件权限的语法:
命令: chmod
用法:
chmod [-R] 身份字母=符号权限 文件或目录
参数:
-R : 递归(recursive)作用,即连同子目录下的所有文件和目录都更改
范例:
# 文件 startup.sh 设置 rwxr-xr-x 权限
chmod u=rwx,g=rx,o=rx startup.sh
chmod u=rwx,go=rx startup.sh # 权限一样,g和o可以简写到一起
# 文件 startup.sh 给所属用户组添加写权限
chmod g+w startup.sh
# 文件 startup.sh 除去所有人的执行权限
chmod a-x startup.sh
Linux
的世界,一切皆是文件,目录也是文件。
但是站在用户实际使用的角度上,把文件和目录区分对待,还是很有好处的。
区分文件和目录,可做如下定义:
系统寻找文件是根据文件名称去搜索的,文件名称就相当于文件的指针。
文件名称和目录有强烈的关联性,一个文件名称必然要存放于一个具体目录中。
同理,目录也是一种特殊的文件,所以一个目录名称必然也会存在于一个父目录中。
以此类推,最终可以到达Linux
顶层的根目录/
,根目录是一个非常特殊的存在,可以说/
就是Linux
世界的起源!
可读取该文件的实际内容,这个很好理解,没什么好解释的。
执行cat
命令需要文件的读权限。
可以编辑、新增、修改该文件内容,但是不能删除该文件。
因为对于文件来说,rwx
权限都是针对“文件内容”来说的,而删除文件需要的是能够删除“文件名称”的权限,文件名称是不属于文件内容的。
执行vim
命令需要文件的写权限。
该文件可以被系统执行!更确切的说,是该文件的实际内容可以被系统执行。通俗理解,就是文件内容是可以被系统理解的一段程序代码。
最常见的可被执行文件通常都是类似于xxx.sh
这样的,文件名称会习惯性的以.sh
作为后缀结尾,但这只是一种人为的习惯,跟执行权限x
没有任何联系!
文件名称无论怎么命名,只要用户对这个文件有x
权限,就可以让系统执行该文件,前提是系统认识该文件的实际内容。
执行bash
命令需要文件的执行权限。
可以读取目录结构列表,也就是目录中的存放的文件名称,以及文件的一些基本属性。
执行ls
命令需要目录的读权限。
可以更改该目录的结构列表,也就是对该目录存放的文件名称进行变更操作。
执行mkdir
命令需要目录的写权限。
目录执行权限和文件执行权限完全不是一个概念,没有可比性。
用户对某个目录具有执行权限,其意思是用户可以通过cd
命令进入该目录,将这个目录变成工作目录。
所谓工作目录就是用户当前所在的目录,可以通过命令pwd
显示出来。
如果用户不具备该目录的x
权限,就不能切换到该目录下,也就无法让系统执行该目录下的可执行文件。