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下文件类型及其权限
文件的组成与类型
首先声明,文件由两部分组成
文件名
文件的属性和内容
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
中出现的权限,不会在文件的最终权限中出现:umask
是002
,二进制是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-x
,755
。
根目录下文件的创建者一定是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
查看文件时,others
的x
权限就变成了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
系统管理与权限控制提供了完整知识框架。
以上就是本文的所有内容了,如果觉得文章写的不错,还请留下免费的赞和收藏,也欢迎各位大佬在评论区交流
分享到此结束啦
一键三连,好运连连!