【Linux我做主】文件权限完全指南:填补你的知识盲区

Linux中的文件类型和权限问题

github地址

有梦想的电信狗

前言

本文介绍Linux中的用户管理和文件的权限问题,同时介绍Linux下的文件类型。

Linux下的用户类型及相关操作

root用户

  • 系统超级用户,拥有最高权限UID=0
  • 可以执行任何系统操作,包括:
    • 修改系统配置文件
    • 安装/删除软件
    • 管理所有用户账户
  • 命令行提示符通常显示为 #(普通用户显示 $
  • 长期使用root账户存在安全风险,建议日常使用普通用户

普通用户

  • 受限权限用户(UID ≥ 1000
  • 只能操作:
    • 自己的家目录(/home/username
    • 被授权的文件和目录
  • 无法执行需要特权的系统操作
  • 默认通过/etc/passwd/etc/shadow管理账户信息

超级用户的命令提示符是#,普通用户的命令提示符是$

使用sudo临时提升权限

而在我们日常的使用中,不可避免的操作就是使用诸如yum的工具包安装软件,安装软件会向系统目录增加和改变文件。

这类在系统目录新增或修改文件的操作是需要root权限的。

那么问题来了:

  • 难道我们每次安装软件都要先切换成root用户吗?
  • 安装软件时切换成了root用户,在此期间不小心误删了系统环境该如何处理呢?

以上问题有很大的不便和风险。sudo就是用来解决这样的问题的。

很多时候,例如我们在安装软件时,只需要yum install pkgname这一条命令具有root权限,因此Linux设计了sudoers文件来管理sudo提权。该文件的路径如下:/etc/sudoers

ll /etc/sudoers   # 该命令可以查看该文件的属性。

在这里插入图片描述

原生的CentOS系统,只有root用户在sudoers文件中,普通用户需要root用户将其添加到该文件中。

su - # 输入root密码即可切换为root用户
vim /etc/sudoers 

打开后在命令模式下输入set nu显示行号。

大概在100行左右(CentOS7.6下),会有root ALL=(ALL) ALL 的字样

在这里插入图片描述

  • 复制这一行,将复制得到的内容中的root改为需要被提权的用户名即可,我这里的用户名是changan_memory
  • 保存退出即可。

接下来我们的sudo就可以使用了,使用时需要输入当前用户的password

在这里插入图片描述

  • 可以看到,使用sudo创建的文件所属者和所属组都是root

添加用户

使用adduser命令

# 需要root权限(使用sudo)
sudo adduser username

# 交互式流程示例:
正在创建用户 'test'...
输入新的 UNIX 密码:
再次输入新的 UNIX 密码:
[需要填写用户信息,可直接回车跳过]

注意:

  • adduser 是友好版用户创建工具(Debian/Ubuntu系)
  • useradd 是底层命令,需要手动配置更多参数
  • 新建用户默认加入同名用户组

passwd设置密码

语法passwd username
功能:重置名为username的用户的的密码。

passwd也用于新创建一个新用户时设置密码。

删除用户

语法userdel username
功能:用于删除一个用户(需要root权限)。

删除是一定要带上选项 -r。例如

#root身份删除用户test
userdel -r test   # 删除是一定要带上-r

切换用户

su 与 su - 的区别

命令环境继承工作目录环境变量
su username保留当前保持当前目录继承当前环境
su - username全新环境切换到用户家目录加载目标用户的环境

示例:

# 切换到root(需要root密码)
su - 
# 或
su - root

# root切换到普通用户(无需密码)
su - changan_memory

# 普通用户之间互相切换,需要对应用户的密码
su - username # 需要对应用户的密码
# 返回原用户
exit  # 或者 ctrl + D

在这里插入图片描述

快速切换

su -l username  # -l 参数等同 su -

用户验证

whoami

whoami  # 显示当前有效用户ID
示例输出:root

在这里插入图片描述

退出登录

  • 快捷键 Ctrl + D
  • 命令 exit
  • 将终止当前用户会话,返回上一级用户

安全提示:

  • 使用root权限后应及时退出
  • 多用户切换时注意提示符变化

Linux下文件类型及其权限

文件的组成与类型

首先声明,文件由两部分组成

  1. 文件名
  2. 文件的属性和内容

Linux下一切皆文件。我们通过命令ll查看到的所有内容,只有最后一列是文件名,其余内容都是文件的属性。
在这里插入图片描述

而文件的属性包括以下内容:

文件属性

  • 文件类型

  • 文件的权限

  • 文件的链接计数

  • 文件的所属用户

  • 文件的所属组

  • 文件的大小

  • 文件的最新修改日期。、

    文件的属性和ll查看到的结果之间的对应关系:
    在这里插入图片描述
    将文件名左边的部分分成了七个部分:
    从左向右依次表示:

  • 文件类型

  • 文件的权限

  • 文件所属用户

  • 文件所属用户组

  • 文件大小

  • 文件最新的修改日期

  • 文件名

以下主要介绍文件的类型及其权限。

windows中,我们通过文件的后缀来区分文件的类型。
而在Linux中,文件名的后缀没有直接的意义,文件的类型不通过后缀来区分,而是通过文件属性中给定的字符来区分。

但这并不能否认文件后缀的意义,我们在给文件命名时,可以给文件命名为带相应后缀的名字,这有助于我们开发者一眼就能判断出文件的类型。

只不过,在操作系统层面,是通过文件属性中的特定字符来判断文件类型的。

操作系统不需要文件后缀来标识文件类型,但不代表Linux上运行的其他软件不需要后缀名。例如编译工具gcc,是通过文件后缀.c/.cpp来区分源代码文件的。

文件类型

Linux下的文件类型主要有以下几种:

  • -:表示普通文件。例如.c/.cpp代码文件,文本文件、可执行程序、库都属普通文件。

  • d:表示目录文件

  • c:表示字符设备文件。例如键盘、显示器等文件。

  • b:表示块设备文件。例如:磁盘文件

  • l:表示软链接文件。

  • p:表示管道文件

  • s:表示套接字文件。用于通信的一种文件。

  • 其他未知文件:表示不属于上述任何类型的其他文件

  • 普通文件和目录文件
    在这里插入图片描述
    可以看到:命令ll会在第一列显示文件的类型,上面的显示中,除了目录,其余都是普通文件。

  • 块设备文件——磁盘

在这里插入图片描述

  • 字符设备文件——显示器_键盘
    在这里插入图片描述

文件的权限

如何看待权限

权限即为一件事情是否允许被你做。

  • 权限和人有关,不同的人有不同的权限(权限认证的是身份)
  • 权限也和事物本身的属性有关,即使人有权限,事物没有对应的功能,也无法完成一件事。

权限等于 人 + 文件的属性
但对于Linux中的文件来说,人只有三种人。分别是文件的:拥有者、所属组、others,这三种人有三种独立的权限。
拥有者,所属组,others均是由root和普通用户来扮演。但不论root用户对一个文件来说是什么身份,拥有什么权限,都不会受到任何权限的限制。

在这里插入图片描述

权限认证的是用户的身份

  • 对同一个文件来说不同的用户拥有不同的身份,因此权限就不同。
  • 对同一个用户来说面对不同的文件时拥有不同的身份,因此权限就不同
  • 权限在认证时,一个用户只会被认证成一种身份
    • 首先判断是否为当前文件的所有者
    • 如果不是,再判断是不是当前文件的所属组
    • 以上两个都不是,则认证成others
  • 整体的认证逻辑是if() elseif() else{}的逻辑

因此一个一个用户,要么是一个文件的拥有者,要么是所属组,要么是others

特殊的是,root用户不管被认证成什么身份,都不会受到权限的约束

在这里插入图片描述

  • 文件和文件目录的所有者:u---User
  • 文件和文件目录的所有者所在的用户组:g---Group
  • 其他用户:o---others
    在这里插入图片描述

Linux下文件权限的表示与理解

Linux中,一切皆文件。而一个文件对于一个用户(拥有者、所属组、其他)来说,只有三种权限

  • r:读。read

    • 对文件而言,具有读取文件内容的权限;
    • 对目录来说,是否允许用户查看该目录下的文件列表
  • w:写。write

    • 对文件而言,具有修改文件内容的权限;
    • 对目录来说,是否允许在当前目录下进行创建、更改、删除文件
  • x:执行。execute

    • 对文件而言,具有执行文件的权限;
    • 对目录来说,是否允许用户进入一个目录
  • -:表示该位置处没有权限。“-”表示不具有该项权限
    这三种权限有两种表示方法,rwx属于英文字母表示法,还有八进制数字表示法。

在这里插入图片描述
从左边看,除去第一列表示文件类型,剩下的九列:

  • 前三列表示所属用户的权限
  • 中间三列表示所属组的权限
  • 最后三列表示other的权限
英文字母表示权限

在这里插入图片描述
我们以一个用户来举例:
在这里插入图片描述

  • 对于文件d1来说:

    • 所属用户user拥有rwx权限,也就是读写执行权限
    • 所属用户组group拥有rwx权限,也就是读写执行权限
    • other拥有r-x权限,也就是只有读权限和执行权限,没有写权限。
  • 对于文件test2.txt来说:

    • 所属用户user拥有rw-权限,也就是只有读写权限,无执行权限。
    • 所属用户组group拥有rw-权限,也就是只有读写权限,无执行权限。
    • other拥有r--权限,也就是只有读权限,无写权限和执行权限。
  • r:读。Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

  • w:写。Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

  • x:执行。execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

关于每一位的理解

ll命令所得到的内容,关于权限的部分共有九位,遵循如下规则:

  • 每一位表示的含义是确定的,每一个位置只有是或者否,代表有无对应的权限
  • 每三位划分为一个模块。
    • 前三位表示所属用户的权限
    • 中间三位表示所属组的权限
    • 最后三位表示other的权限
  • 每三位中,每个位置的含义是固定的,且每一位只有两种可能(有或无):
    • 第一位:r/-r表示有读权限,-表示没有读权限
    • 第二位:w/-w表示有写权限,-表示没有写权限
    • 第三位;x/-x表示具有执行权限,-表示没有执行权限
八进制数字表示权限

Linux中,文件的权限还可以用八进制数字来表示

在前文中,我们提到,文件的属性有九位来表示,九位可以分成三组,分别表示所属用户所属组others的权限。

这三组中,每一组有三位,分别表示有无rwx权限,每一位上表示的权限是固定的,且只有两种状态,有权限和无权限。
以这三个文件为例:

touch test.c  
mkdir d1
sudo touch test.cpp

在这里插入图片描述

当我们用1表示有权限,0表示无权限时:

单看每一组,文件的权限就变成了:
在这里插入图片描述

我们知道,三位二进制可以转换为八进制(只表示0-7),因此我们可以将得到的二进制转换为八进制。结果如下图所示:

在这里插入图片描述

由这样的方法,文件权限的八进制表示法就诞生了

  • 九位二进制数转换成了三位八进制数。
  • 三位八进制数,从左向右,依次表示所有者所属组others的权限。
  • 这三位数字中,每一位的结果,只可能是0~7

下表列出了各个权限对应的八进制数字:

在这里插入图片描述

结合上表和我们的理解可以得出,每一位上的数字只会是0 1 2 4这四个数字的任意相加组合。每一位上的数字都必须有这四个数字中的三个相加得出,每个数字只能用一次。

  • 7:7 = 4 + 2 + 1。代表该身份拥有rwx权限,拥有所有权限
  • 6:6 = 4 + 2 + 0。代表该身份拥有rw-权限,仅有读写权限
  • 5:5 = 4 + 0 + 1。代表该身份拥有r-x权限,仅有读和执行权限
  • 4:4 = 4 + 0 + 0。代表该身份拥有r--权限,仅有读权限
  • 3:3 = 0 + 2 + 1。代表该身份拥有-wx权限,仅有写和执行权限
  • 2:2 = 0 + 2 + 0。代表该身份拥有-w-权限,仅有写权限
  • 1:1 = 0 + 0 + 1。代表该身份拥有--x权限,仅有执行权限
  • 0:0 = 0 + 0 + 0。代表该身份拥有---权限。没有任何权限
    • 此时普通用户对该文件没有任何权限。
    • root用户即使没有任何权限,也可以行使任何权限。root用户不受权限的约束。

Linux下文件权限的设置和修改

chmod命令

功能:设置文件的访问权限。chmod只有文件的所有者和root用户可以使用来修改文件的权限
格式chmod [参数] 权限 文件名

常用选项和用法:

  • -R递归修改目录文件的权限。

    说明:只有文件的拥有者和root才可以改变文件的权限

  • chmod [参数] 权限 文件名

    • chmod u/g/o +/-/=权限字符
    • +:向权限范围增加权限代号所表示的权限
      -:向权限范围取消权限代号所表示的权限
      =:向权限范围赋予权限代号所表示的权限
  • 用户符号

    • u:拥有者
    • g:拥有者所属组同组
    • o:其它用户
    • a:所有用户
通过字母修改
chmod u-x demo.txt  # 所属用户去除执行权限
chmod g-w demo.txt  # 所属组去除写权限
chmod a+x demo.txt  # 所有用户增加执行权限

在这里插入图片描述

  • 其他用法类似。
# 用逗号隔开一次修改多种身份的权限 

在这里插入图片描述

# a 加减 来一次修改所有身份的权限

在这里插入图片描述

# chmod = 来给特定的用户设置权限
chmod u=rwx  # 所属用户读写执行
chmod g=rx  # 所属组度和执行
chmod x=r  # 其他人只读

在这里插入图片描述

用八进制数来修改
chmod 644 demo.txt  # 644 代表 rw-r--r--
chmod 664 demo.txt  # 644 代表 rw-rw-r--

在这里插入图片描述

  • 我们想要让一个文件有怎样的权限,有两种修改方法:
    • 对原文件的权限进行+ - =,也就是对原文件的权限进行修改
    • 知道目标权限是怎样的,计算得出其八进制数字,直接对文件权限进行设置
  • 字母法更多的是修改,八进制数法是设置权限。
  • 字母法的chmod =也可用来设置权限
chown和chgrp

以上两命令是修改当前文件的所有者和所属组!

类比我们给别人东西,给别人东西需要征得别人的同意。

因此修改文件的所属用户和所属组也需要征得别人的同意。

而众所周知,root用户不受任何权限的约束,因此我们修改文件的所有者和所属组需要root权限。我们可以切换成root用户,也可以使用sudo提权来进行操作。切换成root比较麻烦,因此我们一般使用sudo提升权限。

chown
功能:修改文件的拥有者
格式chown [参数] 用户名 文件名

sudo chown users fileName

在这里插入图片描述

chgrp
功能:修改文件或目录的所属组
格式chgrp [参数] 用户组名 文件名
常用选项-R 递归修改文件或目录的所属组

sudo chgrp groupName fileName

在这里插入图片描述

一次性修改文件的所有者和所属组

# 使用 sudo chown命令,所有者和所属组名用 : 隔开,后面跟文件名
sudo chown userName:groupName fileName

在这里插入图片描述

文件的默认权限和umask掩码

执行如下指令:

touch test1.txt
touch test2.txt
mkdir dir1
mkdir dir2!

在这里插入图片描述

有这样的问题,为什么我们在创建文件和目录时,目录文件的起始权限是rwxrwxr-x,也就是八进制下的775,而普通文件的起始权限是rw-rw-r--,也就是八进制下的664

在这里我们补充知识:

  • Linux默认给普通文件的起始权限其实是666
  • Linux默认给目录文件的起始权限其实是777
  • 文件的最终权限 = 起始权限 & (~umask)

umask权限掩码机制是Linux在设计时,为文件权限提供的设计方案。

# 查看当前系统的umask权限掩码
umask   # 一般是 0002,第一个0表示是八进制,真正的权限掩码是 八进制的 002

在这里插入图片描述

如何计算
  • 公式文件的最终权限 = 起始权限 & (~umask)
  • Linux默认给普通文件的起始权限其实是666
  • Linux默认给目录文件的起始权限其实是777
  • 这里有一句话可以帮助理解**:凡是在umask中出现的权限,不会在文件的最终权限中出现。**

我们用例子来帮助理解:

普通文件

在这里插入图片描述

目录文件

在这里插入图片描述

综上:

  • 普通文件的初始权限是664
  • 目录文件的初始权限是775
  • 凡是在umask中出现的权限,不会在文件的最终权限中出现umask002,二进制是000 000 010,每三位看成一组,==第三组的第二位上出现了1。即在umask中,出现了others的写权限。==那么,普通文件和目录文件的最终权限分别为664(110 110 100)775(111 111 101)others的权限中均没有出现w(写权限)。
  • 这便是umask权限掩码的作用,用于控制创建文件的初始权限。

文件和目录的默认权限,是对应了以下用途

  • r:读。read

    • 对文件而言,具有读取文件内容的权限;
    • 对目录来说,是否允许用户查看该目录下的文件列表
  • w:写。write

    • 对文件而言,具有修改文件内容的权限;
    • 对目录来说,是否允许在当前目录下进行创建、更改、删除文件;
  • x:执行。execute

    • 对文件而言,具有执行文件的权限;
    • 对目录来说,是否允许用户进入一个目录;
  • -:表示该位置处没有权限。“-”表示不具有该项权限

  • 能不能删除一个文件,不由该文件的权限决定。而是由该文件所处的目录有无写权限决定


粘滞位

引入

对于普通用户来说,自己的家目录的权限是700

在这里插入图片描述

也就是说:

  • 任何一个普通用户对其他用户的目录没有任何权限,看不到其他用户家目录下的任何文件!
  • home目录下的用户实际是一个目录,只有所有者有读写执行权限,其他人无法进入,无法查看,无法修改

在这里插入图片描述

但有时会有多用户文件共享的需求,因此这就注定了用于共享文件的文件夹不能建立在任何一个用户的家目录下。

基于以上原因,共享数据的文件夹要建立在根目录(/)下

因此我们可以在根目录下建一个shared文件夹用于共享数据:

在这里插入图片描述

但是问题来了,shared文件夹的权限为rwxr-xr-x755

根目录下文件的创建者一定是root用户,普通用户想要进入、访问、创建文件,需要该文件夹对others用户有rwx权限,我们需要为其增加权限。

sudo chmod o+w shared

但问题又来了,others有了rwx权限,那么只要是该系统下的用户,便可以对当前目录下的内容进行修改和删除

在这里插入图片描述

  • 一个用户没有查看权限,却可以把该文件删了??? 去掉w权限的话,共享目录也就没意义的!!!
  • 这种情况不是我们所期望的。因此Linux引入了粘滞位的设计。

概念

粘滞位:

  • 粘滞位是一个特殊的权限位,用于给目录设置权限,一般是共享目录

  • 设有粘滞位的目录,不同用户可以在目录进行各自文件的增删改查。只允许文件的拥有者或者root用户可以删除该文件,其他人一概不允许!!!

  • 粘滞位用t来表示

  • 设置方法:

    •   sudo chmod o+t fileName
      

    在这里插入图片描述

执行完chmod o+t shared命令后,shared就成了真正意义上的共享文件夹了。

ll查看文件时,othersx权限就变成了t,t是一种特殊的x权限。

  • 其实我们没必要自己创建共享文件夹,Linux根目录下自带一个共享文件夹tmp

在这里插入图片描述

在该文件夹下,我们可以方便的进行多用户的文件共享。

file指令

功能说明:辨识文件类型。
语法file [选项] 文件或目录... 常用选项

  • -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -z 尝试去解读压缩文件的内容

关于file指令的使用场景,还请读者自行探索!

总结

​ 本文系统阐述了Linux的用户管理机制与文件权限体系,重点解析了root用户的超级权限与普通用户的受限操作、通过sudo实现临时提权的方法,以及文件类型的符号标识(如-表普通文件、d为目录),深入讲解了rwx权限的字母与八进制(如755对应rwxr-xr-x)两种表示形式,演示了chmod/chown权限修改命令,揭示了umask掩码控制默认权限的原理(如普通文件默认664),并针对共享目录安全问题引入粘滞位机制(chmod +t),强调该特性可防止非所有者删除文件,最后给出权限验证逻辑(依次匹配所有者→组→其他人)及日常操作的安全建议,为Linux系统管理与权限控制提供了完整知识框架。

以上就是本文的所有内容了,如果觉得文章写的不错,还请留下免费的赞和收藏,也欢迎各位大佬在评论区交流

分享到此结束啦
一键三连,好运连连!

评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有梦想的电信狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值