🕺作者: 主页
我的专栏 C语言从0到1 C++初阶 C++进阶 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言
🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!
Linux权限的概念
在讲述Linux权限管理之前,我们要了解什么是权限?
在生活中最常见的权限相关的例子就是给视频网站充会员,没有会员就不让看,只能试看3分钟,而且就算是会员还有铂金和白金之分,这里面体现的权限的意思就是:一件事是否允许被你做,权限认证的是你的身份(是否是会员),而且也和事物的“属性”相关(不同的属性需要不同的权限、身份)。
在Linux下有两种用户,分别是:
- 超级用户 root :它可以在Linux系统下做任何事情,不受限制,命令提示符是“#”。
- 普通用户:它只能在Linux下做有限的事情,命令提示符是“$”。
怎么切换用户?
命令:su [用户名]
举例 :
我的用户名是venus,要从root用户切换到普通用户venus,则使用 su venus。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
那么普通用户能不能使用root的权限呢?
假设我们要暂时对普通用户的一条命令进行提权
它的指令规范是:sudo command
我们假设对ls进行提权
它显示的是这样的
需要输入root的密码可以理解,毕竟要使用它的权限嘛,但是后面一行是什么意思呢?
venus 不在 sudoers 文件中。此事将被报告。
怎么理解?
这是因为我们目前的用户是adduser新建的用户,没有颁发执行sudo,系统不信任你,除非未来将普通用户添加到系统的信任白名单里面
怎么添加?(了解即可)
要授予用户执行 sudo
命令的权限,需要以具有管理员权限的用户登录,并编辑 /etc/sudoers
文件。使用以下命令打开 sudoers
文件:
sudo visudo
在 sudoers
文件中,找到以下行:
## Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
确保 %sudo
行处于注释符号(#
)之外。如果该行已经被注释掉,将其取消注释。
另外,如果想要单独授权用户 “venus” 执行 sudo
命令,可以添加以下行到 sudoers
文件中:
venus ALL=(ALL:ALL) ALL
请注意,在进行任何修改之前,务必小心并确保对文件进行适当的备份,以避免不必要的问题。
编辑完成后,保存并关闭文件。现在,用户 “venus” 应该能够使用 sudo
命令并输入其密码来执行特权操作。
Linux权限管理
文件访问者的分类
- 文件和文件目录的所有者:u–>user
- 文件和文件目录的所有者所在的组的用户:g—Group
- 其它用户:o—Others
这里有一个问题:
拥有着(user)、所属组(group)、其他人(others)和前面所说的 root 、普通用户之间的关系是什么?
如下图:
拥有着(user)、所属组(group)、其他人(others)表示的是身份或者说角色
root 、普通用户则表示的是“人”
文件类型和访问权限(事物属性)
文件类型包括哪些?
d:文件夹
-:普通文件(文本、可执行程序、库函数等基本都属于普通文件)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件(用来进行通信的)
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
那Linux中文件名后缀的含义是什么?
Linux系统中文件名后缀没有直接意义,当然,不代表不用,那该如何看待呢,那就要看用户需求了
在Linux系统中,文件名后缀没有直接的意义,这意味着文件的后缀名并不决定文件的类型或内容。
文件名后缀在Linux系统中通常用来表示文件的类型或格式,以便用户和应用程序能够更容易地识别和处理文件。例如,一个以.txt为后缀的文件通常被认为是文本文件,而以.jpg为后缀的文件通常是JPEG图像文件。
然而,Linux系统并不依赖于文件名后缀来确定文件的类型。事实上,文件类型是由文件的内容和元数据来确定的,而不是由文件名后缀来决定的。这种设计使得文件在更改后缀或没有后缀的情况下仍然可以正确识别和处理。
对于用户来说,文件名后缀可以作为一个视觉提示,帮助他们更方便地辨认和组织文件。此外,部分应用程序可能会使用文件名后缀来选择适当的工具或默认操作。
虽然文件名后缀在Linux系统中并非决定性因素,它主要作用在于有助于用户根据需求进行文件分类、识别和处理。
文件的基本权限有哪些?
i.读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“—”表示不具有该项权限
括号里面的r、w、x可以理解,那么4、2、1是什么意思?
举个例子:
假设有这么一个文件
拥有者的权限是
rw-
r对应在二进制里面的位置在100,也就是4
w对应在二进制里面的位置在010,也就是2
x对应在二进制里面的位置在001,也就是1
这也是我们下面要讲的文件权限值的表示方法
文件权限值的表示方法
字符表示方法
也就是r、w、x这种方式
8进制数值表示方法
了解了文件权限的相关表示方法以后,有个问题:
**怎么设置文件访问权限呢?**毕竟我们也会遇到要修改权限的情况,别急,接着看下去
文件访问权限的相关设置方法
1.chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
举个栗子
前面还讲过可以用八进制数字来表示权限,这就是第二中方法了
②三位8进制数字
举个栗子
chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
常用选项:-R 递归修改文件或目录的拥有者
示例:
# chown user1 f1
# chown -R user1 filegroup1
chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
chgrp users /abc/f2
好了,前面讲了这么多,假如没有权限会有什么现象呢?—无法读、无法修改…
umask
这是我之前创建的文件
为什么它们的默认权限是我们看到的那样?
普通文件:644
目录文件:755
在回答这个问题之前有些知识你需要了解:
- 默认给普通文件的起始权限是666
- 默认给目录文件的起始权限是777
想出来的吗?
其实这里有个权限掩码的东西,你一开始看到的并不是真的
最终权限 = 起始权限 & (~umask)
先看一下我这台虚拟机上的umask等于多少
在 Linux 中,umask 的值是一个八进制数,用于设置默认的文件和目录权限。umask 的格式为 4 位数字,其中第一个数字表示特殊权限(setuid、setgid、sticky bit),而后面的三个数字分别表示所有者、所在组和其他用户的权限。
对于 umask 值 0022
,第一个数字 0 意味着不设置特殊权限。特殊权限包括 setuid(s)、setgid(s)和 sticky bit(t)。如果第一个数字为 1,则表示启用 setuid,如果为 2,则表示启用 setgid,如果为 3,则表示同时启用 setuid 和 setgid。在这里,0 表示不启用任何特殊权限。
后面的三个数字 022
表示文件和目录权限的掩码。它们用于从默认的权限中屏蔽掉特定的权限位。每个数字都代表一组权限:
- 第一个数字
0
表示所有者权限的掩码。在此示例中,它是0
,表示不屏蔽所有者权限。 - 第二个数字
2
表示所在组权限的掩码。在此示例中,它是2
,表示屏蔽了写权限。 - 第三个数字
2
表示其他用户权限的掩码。在此示例中,它是2
,表示屏蔽了写权限。
通过将掩码值从默认权限中屏蔽,在创建新文件或目录时,umask 值会影响所创建的文件和目录的默认权限。在这个例子中,具体的权限是:
- 文件的默认权限为
-rw-r--r--
(owner 可读写,group 和 others 只可读)。 - 目录的默认权限为
drwxr-xr-x
(owner 可读写执行,group 和 others 只可读执行)。
请注意,umask 的值可以在不同的用户环境中有所不同,并且可以通过更改 umask 值来调整默认权限。
比如
功能:
查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
file指令:
功能说明:辨识文件类型。
语法:file [选项] 文件或目录…
常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -z 尝试去解读压缩文件的内容。
使用 sudo分配权限
(1)修改/etc/sudoers 文件分配文件
# chmod 740 /etc/sudoers
# vi /etc/sudoe
格式:接受权限的用户登陆的主机 =(执行命令的用户) 命令
(2)使用 sudo 调用授权的命令
$ sudo –u 用户名 命令
实例:
$sudo -u root /usr/sbin/useradd u2
目录文件的权限
在这里我们可以发现:
- 普通用户自己的家目录的权限是700,也就是说我在我家目录下创建的文件,别人都看不到
- 但是有时候我们多个用户想进行文件数据的共享
========
这两点就说明了我们所建立的共享文件不能在任何一个人的家目录下 - 一个文件是否能删除并不由文件本身决定,而由这个文件所处的目录决定,如果该目录没有w权限,它目录里面的文件无论是什么情况都没有w权限,相当于覆盖
接下来介绍一下目录文件权限的具体内容:
- 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
- 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
于是, 问题来了~~
换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.
这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉? 我们用下面的过程印证一下.
[root@localhost ~]# chmod 0777 /home/
[root@localhost ~]# ls /home/ -ld
drwxrwxrwx. 4 root root 35 7月 27 20:10 /home/
[root@localhost ~]# touch /home/root.c
[root@localhost ~]# ls -l /home/
总用量 4
-rw-r--r--. 1 root root 0 7月 27 20:21 root.c
drwx------. 15 venus venus 4096 7月 25 15:16 venus
drwx------. 4 zhangsan zhangsan 92 7月 27 20:16 zhangsan
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ rm /home/root.c
rm:是否删除有写保护的普通空文件 '/home/root.c'?y
[zhangsan@localhost ~]$ exit
注销
[root@localhost ~]# cd /home
[root@localhost home]# ll
总用量 4
drwx------. 15 venus venus 4096 7月 25 15:16 venus
drwx------. 4 zhangsan zhangsan 113 7月 27 20:22 zhangsan
为了解决这个不科学的问题, Linux引入了粘滞位的概念.
粘滞位
[root@localhost ~]# chmod +t /home/ # 加上粘滞位
[root@localhost ~]# ls -ld /home/
drwxrwxrwt. 4 root root 35 7月 27 20:22 /home/
[root@localhost ~]# touch /home/abc.c
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ rm /home/abc.c
rm:是否删除有写保护的普通空文件 '/home/abc.c'?y # zhangsan不能删除别人的文件
rm: 无法删除 '/home/abc.c': 不允许的操作
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
关于权限的总结
目录的可执行权限是表示你可否在目录下执行命令。
如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这
个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读
权限,在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
题外话:如何新建用户?
在 Linux 虚拟机中创建新用户可以通过以下步骤进行:
-
以超级用户身份登录虚拟机,或者使用 sudo 执行以下步骤。
-
打开终端或命令行界面。
-
使用
useradd
命令创建新用户。例如,要创建一个名为 “newuser” 的用户,可以运行以下命令:sudo useradd newuser
-
设置新用户的密码。可以使用
passwd
命令来设置用户密码。运行以下命令并按照提示输入密码:sudo passwd newuser
-
(可选) 如果需要为新用户创建自定义的家目录,可以运行以下命令:
sudo mkdir /home/newuser sudo chown newuser:newuser /home/newuser
-
新用户已创建成功。现在可以切换到新用户账户进行测试:
su - newuser