Linux下的基本权限
目录
引入
✍当谈到计算机操作系统时,Linux是一种强大的选择。它是一种开源的操作系统,可以自由使用和修改。Linux系统以其高度的可定制性和安全性而闻名,是许多网站、服务器和个人电脑的首选操作系统。为了更好地管理您的Linux系统,了解基本的权限是必不可少的。在本文中,我们将探讨Linux中的基本权限,包括文件和目录的访问权限,以及如何在Linux系统中管理和授予这些权限
1、shell命令及原理
Shell是一种命令解释器,它是操作系统与用户之间的接口!
Linux作为操作系统,我们称之为核心(Kernel),一般用户不能直接访问核心(Kernel)。而是通过Kernel的“外壳”程序,也就是所谓的shell,来与Kernel沟通;Shell的存在,完成了:
将使用者的命令翻译给核心(Kernel)处理
将核心的处理结果翻译给使用者
对于windows系统而言,我们操作windows不是直接操作windows内核,而是通过图形接口,点击图标,从而实现我们的操作,它们都有相同的运行模式,即是:
用户命令—>Shell:解析命令—>传递给操作系统(内核)—>操作系统反馈结果—>Shell:将结果解析给用户
因此,Shell的存在变相的保护了操作系统!
2、Linux下的两类用户
在Linux系统中,一般可以分为两类用户:普通用户和超级用户
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:受Linux中权限约束的用户
在Linux系统中,为了保证系统的安全性和稳定性,普通用户只能访问自己的家目录和一些公共目录,不能访问系统的核心文件和目录。其命令提示符区别如下:
其中涉及到的指令如下:
useradd
创建一个新用户(使用时可能需要sudo提权/root);
语法:useradd -[选项] [用户名]
adduser tmpuser #创建名为tmpuser的用户
passwd tmpuser #为该用户设置密码
userdel
删除一个用户(使用时可能需要sudo提权/root);
语法:userdel -[选项] [用户名]
userdel tmpuser
su
切换用户(默认切换为root)
语法:su [用户名]
su root #切换为超级用户(root可省略)
su userName #切换为普通用户
普通用户通过使用su
,输入root密码后即可进入root用户,而从root用户切换回普通用户,通过输入su+用户名
的方式可直接完成切换;
可以看到root超级用户权限非常大,因此我们一定要注重对root密码的保护!
exit #可以从root用户退回到普通用户
sudo
不切换用户,让普通用户短暂的提权,即短暂以root用户的身份执行命令
语法:sudo [命令]
注意:sudo提权必须是系统信任的用户。即需要用root用户将当前用户添加到/etc/sudoers中;若是非信任用户使用sudo
提权,会提示:
XX is not in the sudoers file. This incident will be reported.
在我们学习了vim
工具后,会详细介绍如何添加信任用户
3、Linux下的权限
3.1 理解权限
何为权限?例如在qq音乐app中,有普通用户和VIP用户,当我们使用它听歌时,有些歌每个人都能听,而有些歌只有VIP有权限听,VIP赋予我们能听VIP歌曲的权限
所谓权限,即某事情是否被允许被谁做
在Linux中,权限一般指文件权限:
文件权限 = ①角色 + ②文件属性
①角色
Linux中共有三种角色:拥有者(owner)
、所属组(grouper)
、其它人(other)
- 拥有者(owner): 文件或目录的创建者是它的拥有者。拥有者有权对文件或目录进行读、写、执行等操作,也可以授权给其他用户或组。拥有者的用户ID在文件或目录的属性中有明确的标识。
- 所属组(group): 在Linux系统中,每个用户都属于至少一个组。文件或目录的所属组是由其创建者指定的。所有属于该组的用户都有权对文件或目录进行读、写、执行等操作,而其他用户则可能没有该权限。
- 其它人(other): 其它人指的是系统中除了拥有者和所属组以外的所有用户。它们对于文件或目录的操作权限是由文件或目录的权限设置决定的。
②文件属性
Linux中共有四种文件属性:
r
(read,读)对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限;w
(write,写)对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限;e
(execute,执行)对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限;-
表示不具有该项权限
3.2 Linux下的文件类型
Windows中以文件的后缀来区分文件类型:
Linux和Window中文件类型差别很大,它不是以文件的后缀来区分文件类型。
需要注意的是,Linux中也可以使用后缀区分文件类型,但仅仅是给用户做一个提示符号来使用,后缀本质其实就是文件名的一部分!
通过ll
指令显示文件的众多属性,其中第一列字符即代表文件类型:
常见的Linux中的文件类型如下:
-
:普通文件(源代码、库文件、可执行程序、文档压缩包等等)
d
:目录文件
c
:字符设备文件(比如:键盘、显示器)
b
:块设备文件(磁盘)
l
:链接文件(快捷方式本质就是链接文件)
p
:管道文件()
s
:socet文件(基本不会见到)
3.3 角色权限
通过ll
指令显示的众多属性列中的第一列,一共有十个字符除去第一个字符还有九个字符,这九个字符三个三个为一组分别代表拥有者、所属组、其他人对于该文件的权限:
3.4 操作权限
01、chomd
设置文件的访问权限,只有文件的拥有者和root才可以改变文件的权限
格式:chmod [参数] 权限 文件名
方式1:
使用chmod
角色标识符 +
/-
/=
权限字符
角色标识符:
u
:拥有者g
:拥有者同组用o
:其它用户a
:所有用户
+
:向权限范围增加权限代号所表示的权限-
: 向权限范围取消权限代号所表示的权限=
:向权限范围赋予权限代号所表示的权限
示例如下:
①修改他人权限(在root下)
chmod o+wx test.txt
②修改个人权限
chmod u-rw test.txt
此时我们修改了个人权限,我们不能读取、写入、执行该文件:
cat test.txt
此时我们有个问题,虽然作为拥有者我们没有这个权限了,但我们同时是所属组,所属组有这个权限为何还不能读取该文件呢?
那是因为:在Linux系统中,匹配使用者会从左边拥有者的身份开始匹配,如果匹配上就不会再匹配之后的身份了
③修改所属组权限
chmod g+x test.txt
方式2:
每个权限位只有两种情况:具有和不具有该权限,因此我们可以用0
/1
来表示该位是否有这个权限,然后根据角色的分类,转化为八进制即可得到三位八进制数字表示的权限
chmod 777 test.txt
7
即代表该角色拥有可读、可写、可执行权限,下面列出八进制数对应权限的表格:
权限 | 对应八进制数 |
---|---|
r-- | 4 |
-w- | 2 |
--x | 1 |
rw- | 6 |
r-x | 5 |
-wx | 3 |
rwx | 7 |
--- | 0 |
02、chown
修改文件的拥有者,需要root权限
语法:chown [修改的拥有者用户名] [文件名]
sudo chown Kevin2 test.txt
03、chgrp
修改文件的所属组,需要root权限
语法:chown [修改的所属组名] [文件名]
sudo chgrp Kevin2 test.txt
04、umask
Linux规定,目录起始权限是777,而普通文件起始权限是666
我们分别创建一个目录和文件,其默认权限如下:
touch test.txt
mkdir dir
我们发现目录和文件的默认权限并不是777和666;这是因为在起始权限之下,系统还有一个umask我们称为权限掩码,起到修饰权限的作用
系统会默认配置好umask,权限掩码是也可以通过umask
指令修改的。
umask
我们发现系统默认配置好的umask为0002
,通过计算:
改变掩码:
umask 0000
👉最终权限的计算方式:
最终权限 = 起始权限 & (~umask)
最终权限等于起始权限与umask码按位取反作与运算
3.5 目录权限
目录的可执行权限是表示你可否在目录下执行命令
x
: 如果目录没有可执行权限, 则无法cd到目录中
r
: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
w
: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件;所有目录被创建出来,一般都要能被进入,所以系统规定一个目录权限必须是777开始。
【总结】:
如果目录没有
-x
权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件);而如果目录具有
-x
权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限;所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档;
4、粘滞位
场景引入:
加入某Linux系统中有多人使用,我们需要在一个公共的目录下,进行临时文件的操作(增删查改),在根目录中,我们可以找到这个公共目录:
由于公共目录是为多个普通用户共同使用的,因此公共目录的创建者为root
ll / #查看根目录
我们可以在根目录下创建我们自己的一个公共目录(需要root权限):
cd / #到根目录下
mkdir mytmp
把设置一下mytmp
目录权限:
sudo chmod 777 mytmp
下面我们用不同用户在这个公共目录下创建文件:
cd mytmp #进入公共目录
touch user1.txt #当前用户创建一个文件
#换一个用户
touch user2.txt #换一个用户
此时我们以Kevin2
用户,对user1
文件操作:
cat user1.txt
echo "hello user1,i am user2"->user1.txt
这是由于user1文件对其它用户的权限只有可读权限,然而:
rm user1
我们尝试删除user1文件,发现:
我们发现,只要用户具有目录的读权限, 用户就可以删除目录中的文件, 无论该用户是否有这个文件的写权限
上述情况暴露了这样的问题:
这时我们即需要设置粘滞位以解决该问题:
给目录加上粘滞位(权限的一种特殊情况)(需要root权限)
语法:chmod +t [目录名]
- +t 设置粘滞位
- -t 取消粘滞位
它的作用表现在,一个公共目录,大家各自可以进行rwx
操作,但是禁止大家互删对方的文件:
chmod +t mytmp
此时对于添加了粘滞位的目录,该目录下的文件只能由:
超级管理员删除
该目录的所有者删除
该文件的所有者删除