① root:超级用户
② 普通用户:我们新建的用户(adduser)
语法:su [用户名]
功能:切换用户
例如,
①添加普通用户,使用adduser
②从root用户切换到普通用户user,使用 su user
。
③从普通用户切换root用户:su root
或 su
(此时系统会提示输入root用户的口令。)
④删除普通用户(当前一定要root用户): userdel -r user
su
只是切换了root身份(获得root的执行权限),但Shell环境(环境变量)仍然是普通用户的Shell;su -
连用户和Shell环境一起切换成root身份了。(获得了root的环境变量及执行权限)→只有切换了Shell环境才不会出现PATH环境变量错误。
超级用户的命令提示符是“#
”,普通用户的命令提示符是“$
”
⭐Linux 中的root权限比 Windows中root的权限高
语法:sudo < command >
功能:暂时的对一条命令进行提权
(目前我们用adduser新建的用户,没法执行这条指令,因为系统默认不信任(新建的用户不在/etc/sudoers里),除非未来将普通用户添加到系统的信任白名单(/etc/sudoers里)里)
什么叫做“权限”?一件事情是否允许被某个人做
①权限认证的是身份(权限和“人”有关)
②权限也和事物的属性有关(比如,我C盘里的某个.txt文件不能像面包一样被我吃了,因为它不具备这个属性)
超级用户:可以再linux系统下做任何事情,基本不受权限的约束
普通用户:受权限约束,可以在Linux下做有限的事情
任何一个人,不论是root还是普通用户,都有可能是拥有者、所属组、其他人
对于一个被创建出来的文件,总会有被访问的一天,在Linux下的访问者(身份)分为三类:拥有者、所属组、other
(注意Linux不会记录other是谁)
文件和文件目录的所有者:这个文件/文件目录是拥有者的,
外界的访问者,除了拥有者和所属组,其余的都是“others”
文件和文件目录的所有者所在的组的用户
我们需要组内协同,又不想让other看到
如上图所示
第一个字符表示文件类型
其余的字符从左到右每三个一组,分别代表拥有者权限、所属组权限、other权限,且每个位置的含义是确定的,(r是读权限,w是写权限,x是可执行权限),如果没有对应权限,要将r
或w
或x
替换成-
我们用来学习租的云服务器大部分都是自己在用,所以我们既是拥有者也是所属组, 当我们一某一个身份去访问某一个文件时, 会自动匹配是拥有者和所属组,若都不是那么就是other
注意❗:如果某个人同时是拥有者和所属组,则匹配拥有者的权限而不是所属组的权限,如下图
→ 文件属性一定要包含:是否可读,是否可写,是否可执行
Windows中,文件的类型是通过文件后缀来区分的(比如:.exe/ .mp4/ .txt等等)
而Linux系统中,不以文件名后缀区分文件类型,而是通过ll指令显示的第一个字符区分文件类型的,文件名后缀没有直接的意义(但是不代表它不用这个后缀)如何看待后缀?——看用户需求
-
:普通文件(文本,源代码,可执行程序,库基本都属于普通文件)
d
:目录文件(目录,directory → d)
b
:块设备文件(块,block → b。一般的磁盘文件(例如硬盘、光驱等)都是块设备文件)
c
:字符设备文件(字符,character → c。键盘,显示器文件等)
p
:管道文件(管道,pipe → p。用来进行通信的文件)
(上面这些最为常见,当然还有其他类型的文件,如l
:软链接(类似Windows的快捷方式)、s
:套接口文件 等)
示例:
块设备文件
字符设备文件
管道文件
读,r
:Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写,w
:Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行,x
:execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
’ -
':对应权限位置,相当于占位符号,表示不具有该项权限
Linux表示 | 说明 |
---|---|
r - - | 只读 |
- w - | 只写 |
- - x | 仅可执行 |
r w - | 可读可写 |
r - x | 可读可执行 |
- w x | 可写可执行 |
r w x | 可读可写可执行 |
- - - | 无权限 |
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为对应权限,要么为-
,我们把有对应权限的记作1,没有的记作0 → 因此我们可以将这三个字符换为三个二进制位,再换为八进制,如下:
权限符号(读写执行) | 对应二进制 | 八进制 |
---|---|---|
r - - | 100 | 4 |
- w - | 010 | 2 |
- - x | 001 | 1 |
r w - | 110 | 6 |
r - x | 101 | 5 |
- w x | 011 | 3 |
r w x | 111 | 7 |
- - - | 000 | 0 |
能更改文件权限的人只能是:
①文件的拥有者
②root
语法:chmod [参数] 权限 文件名
功能:设置文件的访问权限
常用选项:
R -> 递归修改目录文件的权限
注意:只有文件的 拥有者 和 root 才可以改变文件的权限
chmod命令权限值的格式
① 用户表示符+/-/=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u
:拥有者
g
:拥有者同组用
o
:其它用户
a
:所有用户
初始:
将u,g,o设置成无权限,-
给u可读可写可执行权限+
给g可读可写可执行权限+
;
让g只有可读可写权限=
给所有人的权限设置成可读可写可执行
②三位8进制数字
相当于直接给权限赋值
例如chmod 777 test.c
,相当于chmod u=rwx,g=rwx,o=rwx test.c
chmod 664 test.c
,相当于chmod u=rw-,g=rw-,o=r-- test.c
chmod 775 empty
,相当于chmod u=rwx,g=rwx,o=r-x empty
语法:chown [参数] 用户名 文件名
功能:修改文件的拥有者
注意:给别人文件需要征得别人同意,但是root不需要征得别人同意
常用选项:
-R
递归修改文件或目录的所属组
语法:chgrp [参数] 用户组名 文件名
功能:修改文件或目录的所属组
常用选项:
-R
递归修改文件或目录的所属组
权限掩码:凡是在umask中出现的权限,不会在最终的文件权限中出现!
语法:umask 权限值
功能:查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上我们创建的文件和目录,看到的权限往往不是上面这个值:
新建普通文件默认权限=0666
新建目录文件默认权限=0777
为什么我们创建文件的默认权限是我们上面看到的这样???
为什么普通文件: 664
为什么目录文件: 775
原因就是创建文件或目录的时候还要受到umask的影响
已知掩码=0002(对应二进制是10)
看上去好像是减法——默认权限 - 掩码 = 文件创建好后实际的默认权限
但是对于root:
root下普通文件:
实际644(如上图)对应二进制:110100100
初始: 110110110
umask:000100010
假设是减法
最终应该为110010100,显然与实际110100100不符
root下目录文件:
实际755(如上图)对应二进制:111101101
初始: 111111111
umask:000100010
假设是减法
最终应该为111011101,显然与实际111101101不符
显然,不是简单的减法
实际创建的文件权限 = 起始权限 &( ~umask)
(先把umask按位取反,再和起始权限按位与)
再对照一开始讲的权限掩码的定义,是不是就更好理解了?
对于目录文件:
① 可读权限(r
),不影响进入(cd
)这个目录,影响的是→是否允许我们(用ls等命令)查看指定目录下的文件内容
②可写权限(w
),是否允许我们在当前目录下进行创建,更改,删除
③可执行权限(x
):是否允许用户进入(cd
)该目录
⭐为什么普通文件起始是666?(没有x权限)普通文件不需要可执行,给不能执行的文件 可执行权限没意义,需要的话可以手动给它加上这个权限,毕竟可执行的普通文件是少数
⭐为什么目录文件起始是777?所有的目录都要cd进去,没有可执行权限就进不去
t粘滞位是给目录设置的(一般是共享目录)大家可以在目录中进行各自文件的增删查改,只有文件拥有者和root能删除这个文件,其他人一概不允许,t是一种特殊的x权限!
如下图的tmp目录, 该目录的拥有者和所属组都是root,且other其它人的权限都是没有限制的,也就是说任何人都可以在里头读写文件。唯一与其他目录的不同在于,可执行权限在这里是t (t是一种特殊的x权限)
当一个目录被设置为"粘滞位"(chmod +t),则该目录下的文件只能由
①超级管理员root
删除
②该目录的所有者删除(所有者有w权限时)
③该文件的所有者删除