在正式谈Linux权限之前,我们首先来看看Linux文件类型的话题~首先想一想在Windows操作系统中,我们是使用什么来区分文件类型的~
答案是Windows操作系统使用文件名后缀来区分文件类型~
Windows操作系统中文件名后缀(扩展名)用于标识文件的类型和用途。下面是一些常用的文件名后缀及其说明:
Windows操作系统我们经常使用,相信大家也就并不陌生了~
那么Linux是使用什么区分文件类型呢?
Linux区分文件类型,不是使用文件名后缀,而是用文件的属性列区分的!
说明:Linux系统在文件类型的区分上,与Windows系统有着本质的不同。Windows系统主要通过文件名后缀来识别文件类型,而Linux系统则更多地依赖于文件的属性列,通过【ls -l】/【ll】命令列出的文件信息中的第一个字符来表示(普通文件以“-”表示,是常见的文件类型;目录以“d”开头,代表文件夹;链接文件以“l”开头,指向其他文件或目录;字符设备文件“c”(比如显示器和键盘,不支持随机读取,按照字符为单位)和块设备文件“b”(比如硬盘)分别用于访问字符设备和块设备;“p”表示管道文件用于进程间通信;“s”表示套接口文件用于网络通信。)。尽管Linux不以文件后缀作为区分文件类型的主要依据,但用户仍然可以根据习惯或需要为文件添加后缀,以便更容易地识别文件的内容或用途。然而,在某些特定情况下,如使用某些工具或程序处理文件时,可能需要明确文件的类型(比如gcc编译)。这时,这些工具或程序可能会参考文件的后缀或实际内容来判断。因此,虽然Linux系统本身不依赖文件后缀来区分文件类型,但文件后缀在Linux中仍然具有一定的辅助作用,可以帮助用户更好地管理和识别文件。

补充:在 Linux 系统中,普通文件(Regular File)是指不具有特殊文件类型属性的文件,通常包含 文本、二进制数据、图像、音频、视频、可执行程序、库文件、源代码等各种用户数据。
前面我们提到了Linux用户包括root用户和普通用户~
在 Linux 系统中,用户是访问和管理系统资源的基本实体。Linux 是一个多用户、多任务的操作系统,意味着它可以同时支持多个用户,并且每个用户可以同时执行多个任务。
简单介绍两个用户类型:
接下来我们来细细讲解Linux操作系统的用户知识:
这一个话题在前面的博客中提到过,我们重新复盘一下:
adduser xiaodu会创建一个新用户,但不会自动创建用户的主目录。adduser -m username。
passwd命令为用户设置密码。例如,passwd xiaodu会提示你输入并确认新密码。

usermod命令修改用户信息。例如,usermod -l newname oldname可以修改用户名。usermod -aG groupname username可以将用户添加到附加组。userdel命令删除用户。例如,userdel username会删除用户,但不会删除其主目录。userdel -r username】,我们更加建议使用这一个,避免出现问题~
小编这里已经创建了一个xiaodu/username这两个普通用户

接下来就是用户切换问题:
1、普通用户——>超级用户 操作:命令行输入【su root】,输入超级用户密码 效果如下:

回到普通用户:【Ctrl+d】

2、普通用户——>普通用户 这里有两种情况 ①如果已经知道想登陆的普通用户密码 操作:命令行输入【su 登录用户名】,输入想登陆的普通用户密码 效果如下:

回到原来普通用户:【Ctrl+d】

②不知道想登陆的普通用户密码,但是知道超级用户密码 操作:命令行输入【su root】,输入超级用户密码,再【su 登录用户名】,不需要输入普通用户密码直接登录~ 效果如下:

回到原来普通用户:两次【Ctrl+d】

3、超级用户——>普通用户 操作:命令行输入【su 登录用户名】,不需要输入普通用户密码直接登录~ 回到超级用户:【Ctrl+d】

事实上,普通用户登录超级用户还有一种方法是命令行输入【su - root】,输入超级用户密码~
接下来,我们进行简单操作对比:

画表对比:
特性 | su root | su - root 或 su -l root |
|---|---|---|
工作目录 | 保持原目录不变 | 切换到 root 的主目录(/root) |
环境变量 | 继承原用户的环境变量 | 加载 root 的环境变量和配置文件 |
适用场景 | 临时执行命令,保留原环境 | 完全切换到 root 环境,执行系统级任务 |
有些知识比如环境变量后面会进行讲解~
我们知道超级用户拥有最高权限,有些操作普通用户是无法进行的,比如下面尝试将当前目录中的 gol.tx 文件复制到 /usr/bin 目录,但是输出显示了一个错误信息:cp: cannot create regular file '/usr/bin/gol.tx': Permission denied,这意味着当前用户(普通用户)没有足够的权限将文件复制到 /usr/bin 目录。【通常,/usr/bin 目录需要超级用户权限(root 权限)才能写入】

那么怎么进行普通用户权限提升呢?
操作:使用
sudo命令来提升权限

我们发现sudo之后还是不能进行操作,这是因为用户 xiaodu 没有被添加到 sudoers 文件中,因此无法使用 sudo 命令来提升权限~
那么我们就需要把用户 xiaodu 没有被添加到 sudoers 文件(相当于Linux中的用户白名单)中,怎么操作呢?
操作:找到管理员(超级用户root),将用户
xiaodu添加到sudoers文件中~


这个时候普通用户xiaodu就可以使用sudo命令了~


总结: 默认新增的用户,无法直接执行sudo,新用户不受系统信任!如果想让新用户使用sudo,我们需要找到管理员(超级用户root),将新增的用户添加到
sudoers文件中~使用sudo也就是对普通用户的权限提升(以root的身份执行命令)~
我们知道什么是权限?首先来看看权限的本质~
重点解释x权限: 一个文件并不是有了x权限就可以执行,可执行文件 = 有可执行权限 + 本身可以执行【两者缺一不可】~也就是说可执行权限和能够执行是两码事~
注意点: 在进行角色/身份匹配的时候只会按拥有者,所属组,其他用户的顺序,匹配成功一次确定身份,也就确定了权限~
权限通过
rwx字母组合表示(-表示没有该权限),例如:
rwxr-xr-- 表示(三个为一组): 知道了这些,我们通过命令行输入【ll】显示的文件/目录的详细属性进行解析:

755 对应 rwxr-xr-x)每个权限对应一个二进制位和八进制值:
4(二进制 100)2(二进制 010)1(二进制 001)0(二进制 000)通过将权限值相加,可组合出任意权限:
rwx = 4 + 2 + 1 = 7rw- = 4 + 2 + 0 = 6r-x = 4 + 0 + 1 = 5r-- = 4 + 0 + 0 = 4同样三个角色,那么就使用三个数字就可以表示它们的权限了~
例如: 755 对应 rwxr-xr-x
755 对应权限 rwxr-xr-x:首位 7(拥有者权限=读+写+执行),中间 5(所属组权限=读+执行),末位 5(其他用户=读+执行)
使用数字简写表示就较为方便,用3个数字替代复杂的符号组合~
前面已经提到了权限的一些基础概念,接下来我们来对权限属性进行实践操作~
进行权限属性的修改,我们需要使用相关的命令~首先来看看chmod
chmod语法:
chmod [参数] 权限 文件名功能:设置文件的访问权限
常用选项:
R:递归修改目录文件的权限修改权限格式:
+:向用户权限范围增加权限代号所表示的权限-:向用户权限范围取消权限代号所表示的权限=:向用户权限范围赋予权限代号所表示的权限u:拥有者g:拥有者同组用户o:其它用户a:所有用户实际操作:
我们新创建一个testfile.txt来进行测试:

首先我们试一试给拥有者修改权限:

可以看到通过chmod可以给拥有者增加或者删除多个权限,那么再看看其他角色呢?

可以看到进行类似的操作,也可以修改所属组和其他用户的权限,同时如果需要同时修改多个角色权限,可以中间使用【,】进行隔开~
如果对所有的用户/角色进行一样的修改,可以使用用户表示符【a】,例:

除了使用rwx,我们还可以使用八进制模式进行权限修改~
八进制修改权限格式: chmod 【八进制值】 文件名
例【需要注意的是八进制模式会直接覆盖原有权限,而非增减操作(与符号模式的 +/- 不同)】


chown 功能:修改文件的拥有者 语法格式:chown [参数] 用户名 文件名 常用选项:-R 递归修改文件或目录的拥有者
chgrp 功能:修改文件的所属组 语法格式:chgrp [参数] 用户名 文件名 常用选项:-R 递归修改文件或目录的所属组
比如小编当前有username,xiaodu,root三个用户

如果我想把xiaodu账号的testfile.txt文件给username账号,也就相当于修改文件拥有者~
但是当我们操作的时候请求被拒绝~

这是因为就像平时我们给别人东西一样,也需要看对方是否接受,如果接受才可以给对方,还有一种解决办法就是进行权限提升,也就是以root权限强制给别人,我们也就可以使用前面的sudo进行普通用户权限提升~

同样可以进行权限提升修改文件所属组:

修改回去:

除了分别修改以外,还有一种方法可以同时修改拥有者和所属组:
命令行输入:chown 拥有者:所属组 文件名


前面我们都是对普通文件进行操作,那么对于目录这样比较特殊的文件应该怎么操作呢?
首先我们来看看,我们进入一个目录,需要什么权限呢?我们来实际操作一下:

1、进入一个目录,需要r权限吗?

所以进入一个目录不需要r权限,但是我们可以看到也无法查看目录里面的文件信息。这是因为【 r 权限决定是否允许用户查看执行目录下的文件信息!】
2、进入一个目录,需要w权限吗?

所以进入一个目录不需要w权限,但是我们可以看到不可以在当前目录下新建文件。这是因为【 w权限决定该用户是否可以修改(属性)或者删除/新建执行目录下的文件】
3、进入一个目录,需要x权限吗?
答案应该显而易见了,我们一样实际操作:

所以我们得到答案,进入目录需要x权限~
总结:
权限标识 | 权限名称 | 目录上的核心作用 | 典型场景说明 |
|---|---|---|---|
x | 执行权限 | 进入目录的必选条件 (无x权限时,即使有r权限也无法使用cd命令进入目录) | 必须同时拥有目录的x权限和文件的r权限才能执行文件 |
r | 读权限 | 允许查看目录内文件列表(通过ls命令) 但无法进入目录或操作文件 | 可列出/etc目录下的文件,但无法进入该目录修改配置 |
w | 写权限 | 允许在目录内执行以下操作: ✅ 新建文件 ✅ 删除文件 ✅ 重命名文件 ✅ 修改文件属性 | 可在/tmp目录自由创建/删除临时文件(需配合x权限) |
我们可以看到当我们新建一个文件/目录的时候都会有默认的权限,那么这个默认的权限是怎么得到的呢?

Linux文件/目录默认权限生成机制
666(rw-rw-rw-)777(rwxrwxrwx)umask 0002

umask值可能不同,小编的Centos的umask值为0002
接下来我们尝试修改权限掩码:

那么如何恢复默认权限掩码呢?
方法一:重新设置为002

方法二:关掉Xshell重新登录
普通用户如果需要进行协作,那么有时候我们就需要进行普通文件共享~
这里给出一种方法:使用公共目录实现普通用户文件共享~
首先root账号在根目录下创建一个共享目录:

该目录拥有者和所属组都是root,现在为其他用户增加rwx权限:

那么其他用户就可以在该目录下进行操作,普通用户之间就实现了数据共享:




username为xiaodu.txt文件其他用户,具有r权限,可以读取文件内容,但是不可以写入~
接下来我们可以看一个神奇的现象:

username作为xiaodu.txt文件其他用户,只具有r权限,但是可以删除xiaodu.txt文件,这是因为在shared-dir目录下,xiaodu和username都是其他用户,root都给了它们w权限,都可以在该目录下进行文件的新建或者删除~
这样虽然实现了普通用户文件共享,但是也就会存在互删的情况,如果把该目录其他用户权限修改为r-x,那么就没有办法新建文件了,所以为了解决这个问题,就有了粘滞位的概念~

w),也无法删除非自身拥有的文件/tmp 默认权限为 1777实际操作:
//设置方法一(符号设置)
chmod +t directory_name # 启用粘滞位
chmod -t directory_name # 禁用粘滞位
//设置方法二(数字设置)
chmod 1777 directory_name # 设置粘滞位(1xxx)
# 权限解析:
# 第一个数字1表示粘滞位
# 后续777表示传统权限(rwxrwxrwx)
当目录对other有x权限时显示为t,否则显示为T


简单对比:
特性 | 传统权限(无粘滞位) | 粘滞位生效时 |
|---|---|---|
目录写权限(w) | 允许删除所有文件 | 仅允许删除自身文件 |
文件删除控制 | 依赖文件所有权 | 强制所有权验证 |
典型应用场景 | 私有目录 | 公共共享目录 |
file命令是可以用于检测文件类型,它通过分析文件的内容特征(而非仅依赖文件扩展名)来判断文件的实际类型~
使用:

