文章目录
- 一、Linux权限的概念
- 1. Linux中的用户分类
- 2. 不同用户之间的转换
- (1) 普通用户->root
- (2) root->普通用户
- (3) 普通用户->普通用户
- 二、Linux权限管理
- 1. 文件访问者的分类
- 2. 文件类型和访问权限
- (1)文件后缀在Linux中的作用
- (2)file指令
- 4. 文件权限值的表示方法
- 5. 文件访问权限的相关设置方法
- (1) chmod
- (2) chown
- (3) chgrp
- 三、目录的权限
- 1. 基本概念
- 2. 默认权限与权限掩码
- 四、粘滞位
一、Linux权限的概念
1. Linux中的用户分类
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制,只能有一个。
- 普通用户:在linux下做有限的事情,可以有多个。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su
root(root可以省略)此时系统会提示输入root用户的口令。
2. 不同用户之间的转换
(1) 普通用户->root
从普通用户转换成root用户有两种方法,如下:
- su——同一个bash下进行转换
- su -——使用root用户重新登陆bash
下图是su切换为root,输入密码后就可以切换到root用户下。
想要从root用户下,退回原来的用户只需要按Ctrl+D,就可以了,如下图所示。
下图是su -切换为root用户。
su与su -的区别
-
工作环境切换:
- su:默认情况下,
su
命令仅切换用户身份,而不切换工作环境。这意味着,虽然用户身份已经改变,但当前的工作目录、环境变量(如$PATH
)等仍然保持原样,这可能会导致一些命令因为找不到正确的路径而无法执行。 - su -:
su -
命令在切换用户身份的同时,还会切换工作环境。这包括切换到目标用户的家目录,并加载该用户的配置文件(如.bash_profile
、.bashrc
等),从而设置相应的环境变量。这样,用户就可以在一个与目标用户完全相同的工作环境中执行命令。
- su:默认情况下,
-
Shell类型:
- 使用
su
命令时,如果未明确指定shell类型,则通常会继承当前用户的shell环境,这通常是一个non-login shell。 - 使用
su -
命令时,会启动一个login shell,这意味着会读取用户的登录配置文件(如.bash_profile
、.profile
等),从而设置完整的工作环境。
- 使用
-
使用场景:
- 当只需要以另一个用户的身份执行单个命令时,可以使用
su
命令后跟-c
选项来指定该命令。 - 当需要以另一个用户的身份进行长时间的工作或需要完整的工作环境时,应使用
su -
命令。
- 当只需要以另一个用户的身份执行单个命令时,可以使用
假设有两个用户:普通用户user1
和root用户。
- 使用
su
命令切换到root用户后,当前工作目录仍然是qhz
的家目录,且环境变量可能与root用户的不一致。
- 使用
su -
命令切换到root用户后,当前工作目录会切换到root用户的家目录(通常是/root
),且环境变量也会被更新为root用户的设置。
(2) root->普通用户
- 从root用户下切换到普通用户,如果是上面内中使用su或者su -来切换成root用户的,只需要按Ctrl+D就可以返回原来的普通用户。
- 也可以直接使用su 用户名的方式来切换成任意用户,且不需要输入密码。
(3) 普通用户->普通用户
两个普通用户之间是不可以直接切换的,但是我们可以通过root用户做一个跳板,A用户先切换到root用户,root用户再切换到B用户。
二、Linux权限管理
1. 文件访问者的分类
对于一个创建出来的文件,总会被别人访问,在Linux中,把文件的访问者分为了三类:拥有者,所属组,other。
- 文件和文件目录的所有者:u—User,就是该文件是他的
- 文件和文件目录的所有者所在的组的用户:g—Group(不多说)相当于一个团队。
- 其它用户:o—Others (外国人)就是外界的访问者
对于所属组来说,就相当于如果你们要团队一起做某个项目,但是你创建出来的文件,只允许拥有者自己访问,即使是一个团队的也无法访问,那显然是不合理的,所以就可以把团队成员也加到所属组里来,这样在所属组里的成员就都能访问该文件了。
我们的云服务器大部分都是我们自己在用,所以我们既是拥有者也是所属组, 当我们一某一个身份去访问某一个文件时,每一个文件都会有拥有者和所属组, 会自动匹配是拥有者和所属组,若都不是那么就是other,Linux并不会记录other是谁。
2. 文件类型和访问权限
在Linux中主要有以下几种文件类型,其中大部分文件都是文件夹类型和普通文件。
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
我们可以直接使用ll命令去查看以下详细信息:
可以发现不是d类型的就是-类型的。
我们现阶段所碰到的大多数都是-
或者d
,学习到后面可能会碰到一些其他的文件类型,这里我们可以去查看以下其它类型的文件:
ls -l /dev/vda1
ls -l /dev/tty
mkfifo pipe
删除刚创建的管道的话输入下面指令即可:
ls -al /usr/lib64/
(1)文件后缀在Linux中的作用
在Linux中我们可以根据上面的方法查看文件是啥类型,那在Linux中文件的后缀有啥用呢?
下面整个小实验,我们可以看到,后缀名随便改,都不影响程序的正常输出,
由此可以看出,在Linux环境下,对于文件的后缀没有多大区分,你如何修改操作系统都不管,但是对于gcc这种编译软件,若是识别到编译的文件不是一个后缀.c的文件,那么就会出现下面的状况,因为gcc这是一个Linux中自带的编译软件,并不是属于Linux的组成部分,是独立开来的,就相当于我们Windows中自带的一些软件一样,有着它们自己对文件类型的识别格式
(2)file指令
功能说明:辨识文件类型
语法:file [选项] 文件或目录…
-
常用选项:
-
-c 详细显示指令执行过程,便于排错或分析程序执行的情形
-
-z 尝试去解读压缩文件的内容
4. 文件权限值的表示方法
上面只是谈到了文件的类型,那后面这一大串又是什么呢?
大家可以参考这张图,一一对应。
文件访问者的三种权限rwx
- 读 r:Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写 w:Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行 x:execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “—”表示不具有该项权限
以下图为例,分别表示文件拥有者对该文件有rwx权限,也就是可读,可写,可执行、文件所属组对文件有rwx权限,也就是可读,可写,可执行、other对该文件只有rx权限,没有写权限。
文件权限值的表示方法:
- 字符表示法
Linux表示 | 说明 |
---|---|
r - - | 只读 |
- w - | 仅可写 |
- - x | 仅可执行 |
r w - | 可读可写 |
r - x | 可读和可执行 |
- w x | 可写和可执行 |
r w x | 可读可写可执行 |
- - - | 无权限 |
注意:在Linux系统中,文件权限通常由三组字符表示,分别代表文件所有者的权限、与文件所有者同组的用户的权限、以及其他用户的权限。上述表格仅展示了单个用户(或组)的权限情况,但在实际应用中,这些权限是成组出现的,例如
rwxrw-r--
表示文件所有者具有读、写、执行权限,与文件所有者同组的用户具有读和执行权限,而其他用户只有读权限。
- 八进制表示法和二进制表示法
权限符号 | 八进制 | 二进制 |
---|---|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
r w | 6 | 110 |
r x | 5 | 101 |
w x | 3 | 011 |
r w x | 7 | 111 |
- - - | 0 | 000 |
5. 文件访问权限的相关设置方法
(1) chmod
chmod
- 功能:设置文件的访问权限
- 格式:chmod [参数] 权限 文件名
- 常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
修改访问者权限的两种方式:
① 用户表示符+/-=权限字符
用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
②八进制操作
给拥有者、所属组、other都添加读
的权限—— 444
给拥有者、所属组、other都添加执行
的权限—— 111
给拥有者、所属组、other都添加读、写
的权限—— 666
将拥有者、所属组、other的所有权限都删除—— 000
給拥有者添加读写,所属组添加读,other添加可执行。
(2) chown
讲完了chmod,知道了如何修改一个文件的访问者权限,现在我们来尝试修改一下这个文件的访问者。首先就是修改文件的拥有者
,使用的是chown
chown
- 功能:修改文件的拥有者
- 格式:chown [参数] 用户名 文件名
实例
这里我们将hello.cc这个文件的拥有者修改成ubuntu,但是这里却显示操作不允许,这是为什么呢?实际上如果你用普通用户将文件的拥有者修改为其他用户,是需要其它用户同意的。
但是这里我们可以直接使用root,强行转换,管你要不要呢。
(3) chgrp
可以更改文件的拥有者,那对于所属组来说当让也是可以修改的,使用chgrp
chgrp
- 功能:修改文件或目录的所属组
- 格式:chgrp [参数] 用户组名 文件名
- 常用选项:-R 递归修改文件或目录的所属组
- 实例:
同样,普通用户还是不行。
使用root进行操作就好了,当然在普通用户下用sudo提权也行。
三、目录的权限
1. 基本概念
普通的文件可读可写可执行比较容易理解,那对于目录(类似于文件夹)来说,可读可写可执行又代表什么呢?
- 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
- 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
ls 查看目录中的文件内容,需要读r
权限
touch、echo 在目录中创建文件;rm 删除文件,需要写w
权限
cd 进入到一个目录,需要可执行x
权限
可以看到去掉x
权限之后就无法进入改目录了。
可以看到没去掉r
权限之前是可以查看目录中的内容的,但去除r
权限之后就不能显示了。
可以看到没去掉w
权限之前可以在这个目录下创建文件,但是去掉w
权限之后就不能创建文件了。
2. 默认权限与权限掩码
下图中我们可以看到在创建文件和目录时我们并没有指定相应的权限,但是在文件和目录刚创建后却有相应的权限,这是因为目录和权限在创建时是有默认权限的。
- 文件默认权限:0666
- 目录默认权限:0777
其中第一位的0与特殊权限有关,我们就不做探究了,后面三位是权限的八进制数值表示方法,我们将其翻译为字符表示方法。
但是如果按照默认权限666和777来创建文件的话应该是下图中的权限才对啊,但是实际生成的却和理论上的不一样,这是为什么呢?
原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)
- 语法: umask 权限值
- 功能: 查看或修改文件掩码。
这里可以看到默认的文件掩码是0002.
mask&(~umask) 之后如图
可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。
我们也可以通过修改umask来设置文件的访问权限。
这里我们把umask改为000,这样创建出来的文件就是默认的了,如下图:;
我们也可以把umask改为777,这样创建出来的文件权限应该是000,如图:
值得注意的是: 超级用户的默认掩码为0022,普通用户的默认掩码为0002
四、粘滞位
在上面的介绍中我们了解到目录的可写权限:
- 可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
但是这样就会造成一个问题,在一个目录下有众多文件,我们可以没有文件的可写权限,只需要有目录的可写权限,就能直接删除该目录下的文件,是不是显得非常不合理呢?
但是使用其他用户(这里使用ubuntu)却可以删除:
为了解决这个问题,Linux提出了粘滞位的方法来解决这个问题。
粘滞位
- 语法: chmod +t 目录名
- 功能: 给目录加上粘滞位。
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
当前目录已经被加上粘滞位,所以另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。
当一个目录被设置为粘滞位,则该目录下的文件只能由:
-
- 超级用户删除。
-
- 该目录的拥有者删除。
-
- 该文件的拥有者删除。
注意: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件
想要去掉目录的粘滞位只需要chmod -t 目录名
就好