概念:
在计算机系统中,权限是指用户或进程对系统资源(如文件、目录、设备、网络等)可以执行的操作的授权
。权限的设计目的是为了保障系统的安全性,防止未经授权的访问或操作。
权限的关键要素:
1、资源
权限总是针对某个具体资源,如:
文件或目录
数据库记录
网络端口
系统配置
2、操作类型
不同资源支持不同的操作类型。如:
对文件:读(Read)、写(Write)、执行(Execute)
对数据库:查询、插入、更新、删除
对网络:连接、发送、接收
3、 主体
权限控制需要明确操作的主体,主体可以是:
用户(User)
用户组(Group)
进程(Process)
角色(Role)
简单来说,权限就是能或者不能去做一件事
权限设计的核心目的是保护系统资源
,确保只有授权的用户或进程可以访问或修改特定的文件、程序或数据!
具体来说有以下原因:
提升系统安全性:
限制未授权用户访问敏感数据或系统资源,防止数据泄露和恶意操作。精细化访问控制:
根据用户角色分配权限,确保最小权限原则,避免误操作和资源浪费。保障资源完整性:
防止重要文件和数据被修改或破坏。支持多用户环境:
确保用户之间的资源隔离,保护个人数据和协作权限。遵守合规要求:
满足行业法规和数据保护要求,提供审计追踪功能。提升系统可维护性:
通过角色和用户组简化权限管理,提高系统扩展性。减少潜在漏洞:
通过严格的权限控制,降低系统漏洞带来的风险。不同操作系统下的权限设计方式有所不同,以下是主要操作系统的权限管理概述:
文件权限
:
每个文件和目录都有三种基本权限:读(r)、写(w)、执行(x),这些权限分别对文件的拥有者、所属用户组和其他用户有效。 每个文件和目录有三个权限组:
文件权限表示
:
SELinux和AppArmor
:
ACL(Access Control Lists)
:
命令行管理
:
根用户(root)
:
NTFS 权限
:
用户和组
:
-访问控制列表(ACL)
:
-继承权限
:
用户账户控制(UAC)
:
UNIX 权限
:
用户和组
:
系统完整性保护(SIP)
:
ACL
:
iOS 是基于 Unix(Darwin)的操作系统,具有严格的权限管理机制,确保应用沙盒隔离,并保护用户数据和设备的安全:
应用沙盒
:
权限请求
:
App Store 审核
:
System Integrity Protection (SIP)
:
Android 是基于 Linux 内核的 ,因此它的权限管理方式也继承了 Linux 的一些特性,但在移动环境下做了很多调整:
应用权限
:
权限模型
:
运行时权限
:
SELinux
:
小结:
操作系统 | 权限管理模型 | 特点 |
---|---|---|
Linux/Unix | 基于文件权限模型(r, w, x)和用户、组、其他权限控制;使用命令行管理工具(chmod, chown, chgrp);支持 SELinux 和 AppArmor | 类 Unix 系统,支持精细权限控制,适用于服务器和开发环境,强制访问控制(MAC) |
Windows | 基于用户和组的权限管理,访问控制列表(ACL)控制文件权限,NTFS 文件系统 | 权限管理通过图形界面和命令行工具(如 icacls)进行,较为简单直观,广泛用于桌面环境 |
macOS | 基于 Unix 系统(Darwin);文件权限管理与 Linux 相似,支持 ACL 和 System Integrity Protection(SIP) | 通过沙盒机制、SIP 和 Gatekeeper 提供安全保护,限制恶意软件和非授权访问,应用需通过严格审核 |
Android | 基于 Linux 内核,但加入了应用沙盒和运行时权限管理;使用 SELinux 提高安全性 | 动态权限请求,注重移动设备安全,应用被沙盒化,用户控制权限的授予 |
iOS | 基于 Unix 系统(Darwin);应用沙盒机制,严格的权限控制;系统完整性保护(SIP)和审查机制 | 强化安全性,通过沙盒机制隔离应用,严格的权限管理和审查机制,防止恶意行为和泄漏敏感数据 |
这些操作系统在权限管理上的主要差异在于它们的架构设计和使用场景,移动操作系统更注重用户隐私和安全,而桌面系统则更多地依赖于文件系统和用户账户管理。
定义:
权限:
文件和目录权限:
命令执行:
例如使用 sudo
)。常见用途:
用户管理:
普通用户的命令行提示符:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$
定义:
权限:
文件和目录权限:
命令执行:
常见用途:
安全性:
普通用户切换为超级用户:
使用su -
命令:
su -
命令后,系统会提示你输入root用户的密码,密码输入正确后,将会切换为root用户,并且默认处在root用户的家目录
。[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ pwd
/home/zwy
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ su -
Password:
Last login: Thu Jan 23 18:52:22 CST 2025 on pts/0
[root@iZbp1dkpw5hx2lyh7vjopaZ ~]# pwd
/root
使用su
命令:
su
命令后,系统同样会提示你输入root用户的密码,密码输入正确后,将会切换为root用户,并且会保留在切换身份前的目录中
。[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ pwd
/home/zwy/code/test
[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ su
Password:
[root@iZbp1dkpw5hx2lyh7vjopaZ test]# pwd
/home/zwy/code/test
超级用户切换为其他普通用户:
使用exit
命令:
su
或者su -
命令从普通用户切换为超级用户,那么使用exit
命令退出当前的 root 会话,返回到之前的普通用户会话。[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ su -
Password:
Last login: Thu Jan 23 18:55:53 CST 2025 on pts/0
[root@iZbp1dkpw5hx2lyh7vjopaZ ~]# exit
logout
[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$
使用su
命令:
su uesrname
命令即可切换到任意一个普通用户,username代表要切换到的用户名,由于root的权限为最高级别,所以无需密码即可切换。[root@iZbp1dkpw5hx2lyh7vjopaZ ~]# su zwy
[zwy@iZbp1dkpw5hx2lyh7vjopaZ root]$ pwd
/root
切换后不会改变当前路径,仍然停留在切换为普通用户前,root用户所在的目录
普通文件(Regular File)
-
示例:/home/user/document.txt、/usr/bin/program
目录文件(Directory File)
d
示例:/home/user/、/etc/
符号链接文件(Symbolic Link File)
l
示例:/home/user/symlink(指向 /home/user/target_file)
字符设备文件(Character Device File)
c
示例:/dev/tty1(终端设备),/dev/random(随机设备)
块设备文件(Block Device File)
b
示例:/dev/sda(硬盘),/dev/sdb1(硬盘分区)
命名管道文件(FIFO File)
p
示例:/tmp/myfifo(管道文件)
套接字文件(Socket File)
s
示例:/tmp/mysocket(套接字文件)
设备文件(Device File)
字符设备文件(c)
:用于与字符设备(如终端、串口等)进行交互。块设备文件(b)
:用于与块设备(如硬盘、USB 驱动器等)进行交互。符号链接(Symbolic Link)
l
示例:ln -s /path/to/target /path/to/symlink
文件类型查看
ls -l
命令查看文件的类型。输出示例:
-rw-r--r-- 1 user group 1048576 Jan 23 10:00 example.txt # 普通文件
drwxr-xr-x 2 user group 4096 Jan 23 10:00 myfolder # 目录文件
lrwxrwxrwx 1 user group 10 Jan 23 10:00 symlink -> file.txt # 符号链接
crw-rw-rw- 1 root root 10, 1 Jan 23 10:00 /dev/tty1 # 字符设备文件
brw-rw-rw- 1 root root 8, 0 Jan 23 10:00 /dev/sda # 块设备文件
prw-r--r-- 1 user group 0 Jan 23 10:00 myfifo # FIFO 文件
srw-rw-rw- 1 user group 0 Jan 23 10:00 mysocket # 套接字文件
文件类型总结
文件类型 | 表示符号 | 说明 | 示例 |
---|---|---|---|
普通文件 | - | 包含文本、图像、程序等数据 | /home/user/document.txt |
目录文件 | d | 存放其他文件或目录 | /home/user/ |
符号链接 | l | 指向其他文件的快捷方式 | /home/user/symlink -> /home/user/target_file |
字符设备文件 | c | 与字符设备(如终端、鼠标)交互的文件 | /dev/tty1 |
块设备文件 | b | 与硬盘等块设备交互的文件 | /dev/sda |
FIFO 文件 | p | 用于进程间通信的文件 | /tmp/myfifo |
套接字文件 | s | 用于进程间或网络通信的文件 | /tmp/mysocket |
设备文件 | c、b | 用于与硬件设备交互的文件,字符设备和块设备 | /dev/sda(块设备),/dev/tty1(字符设备) |
符号链接文件(软链接) | l | 文件系统中的快捷方式,指向其他文件或目录 | /home/user/symlink -> /home/user/target_file |
文件访问用户的分类:
文件的拥有者(User)
与文件拥有者同组的用户(Group)称为所属组
其他用户(Others)
文件访问的权限:
r:读权限
w:写权限
x:执行权限
如果没有某项权限,则该位置为 -
文件的权限=访问角色+目标文件属性
角色就是文件访问者的身份
目标属性就是目标文件本身的属性
说明:
通俗的说,给你机会你也不中用啊,即便系统给你执行该文件的权限,但是该文件本来就不具备可执行属性,那么最终文件的权限还是不可执行
再次理解,文件的权限=访问角色+目标文件属性
例如:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ls -l
total 0
-rw-r--r-- 1 root root 0 Jan 22 21:40 root.txt
-rw-rw-r-- 1 zwy zwy 0 Jan 22 21:56 zwy.txt
对如上文件权限分析:
根据上述分析:
-
,拥有者为root
,所属组为root
,拥有者的权限为rw-
,可读可写不可执行
,所属组的权限为r--
,只可读不可写不可执行
,其他用户other的权限为r--
,只可读不可写不可执行
-
,拥有者为zwy
,所属组为zwy
,拥有者的权限为rw-
,可读可写不可执行
,所属组的权限为rw-
,可读可写不可执行
,其他用户other的权限为r--
,只可读不可写不可执行
文件权限的八进制表示:
0表示没有该权限,1表示拥有该权限
。则每3个二进制位可以表示该用户的权限,而3个二进制位刚好可以表示一个八进制数,共3组八进制数就构成了文件权限的八进制表示。例如:
权限 | 拥有者(Owner) | 所属组(Group) | 其他用户(Others) | 二进制表示 | 八进制表示 |
---|---|---|---|---|---|
rwxr-xr-x | rwx (7) | r-x (5) | r-x (5) | 111 101 101 | 755 |
rw-r--r-- | rw- (6) | r-- (4) | r-- (4) | 110 100 100 | 644 |
rwx------ | rwx (7) | — (0) | — (0) | 111 000 000 | 700 |
r--r--r-- | r-- (4) | r-- (4) | r-- (4) | 100 100 100 | 444 |
rwxrwxrwx | rwx (7) | rwx (7) | rwx (7) | 111 111 111 | 777 |
---rwx--- | — (0) | rwx (7) | — (0) | 000 111 000 | 070 |
r-x------ | r-x (5) | — (0) | — (0) | 101 000 000 | 500 |
rw------- | rw- (6) | — (0) | — (0) | 110 000 000 | 600 |
r--r-xr-- | r-- (4) | r-x (5) | r-- (4) | 100 101 100 | 454 |
使用chmod
指令修改文件的权限
操作符:
+:添加权限
。-:移除权限
。=:设置精确权限(覆盖现有权限)
。用户类别:
u:拥有者(User)
g:所属组组(Group)
o:其他用户(Others)
a:所有用户(All,包含 u、g 和 o)
权限字符:
r:读权限
w:写权限
x:执行权限
命令格式:
chmod 用户 操作符 权限 文件名
添加权限:
chmod u+x filename:#给文件的拥有者添加执行权限。
chmod g+r filename:#给文件的所属组添加读权限。
chmod o+w filename:#给其他用户添加写权限。
移除权限:
chmod u-x filename:#给文件的拥有者移除执行权限。
chmod g-w filename:#给文件的所属组移除写权限。
chmod o-r filename:#给文件其他用户移除读权限。
精确设置权限:
chmod u=rwx filename:#将文件的拥有者的权限设置为读、写、执行。
chmod g=rx filename:#将文件的所属组权限设置为读和执行。
chmod o=r filename:#将文件其他用户权限设置为只读。
使用八进制表示法
修改文件的权限
示例:
chmod 755 filename
说明:所有者有读、写、执行权限(7),用户组和其他用户有读和执行权限(5)。
chmod 644 filename
说明:所有者有读和写权限(6),用户组和其他用户有只读权限(4)。
chmod 700 filename
说明:所有者有读、写、执行权限(7),用户组和其他用户没有任何权限(0)。
chmod 444 filename
说明:所有者、用户组和其他用户只有读权限(4)。
chmod 777 filename
说明:所有者、用户组和其他用户都有读、写、执行权限(7)。
chmod 555 filename
说明:所有者、用户组和其他用户都有读和执行权限(5),没有写权限。
递归修改权限
chmod -R 755 /path/to/directory #指定目录
这将会递归地将指定目录及其所有内容的权限设置为 rwxr-xr-x(755)
在 Linux 系统中,文件的 拥有者(owner)和 所属组(group)可以通过命令进行修改。这对于文件的管理和权限控制非常重要。
chown 命令
chown
(change owner)命令用于更改文件或目录的拥有者和所属组。
chown [OPTIONS] USER:GROUP FILE
USER: 新的文件拥有者(用户)。
GROUP: 新的文件所属组(组)。
FILE: 目标文件或目录的路径。
如果你只需要更改文件的 拥有者 或 所属组,可以省略 GROUP 或 USER。
修改文件的拥有者:
file.txt
的拥有者改为用户 Sam
,可以执行以下命令:chown Sam file.txt
修改文件的所属组:
file.txt
的所属组改为Bob
,可以执行以下命令:chown :Bob file.txt
chgrp
命令:chown Bob file.txt
同时修改文件的拥有者和所属组:
要将文件 file.txt 的拥有者更改为Sam
,同时将所属组更改为 Bob
,可以执行以下命令:
chown Sam:Bob file.txt
或者也可以使用这种方式:
chown Sam.Bob file.txt
修改目录及其内部所有文件的拥有者和所属组
chown -R Sam:Bob /path/to/directory
这会将 /path/to/directory 目录及其所有内容(包括子目录和文件)的拥有者更改为 Sam,所属组更改为Bob。
修改文件的权限和拥有者时的注意事项:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ chown zyy:zyy zwy.txt
chown: changing ownership of ‘zwy.txt’: Operation not permitted
用户是文件的当前所有者。
用户属于目标组。
文件没有读取权限:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rwxrwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
--w-rw-rw- 1 zwy zwy 75 Jan 25 20:57 code.c
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ cat code.c
cat: code.c: Permission denied
这意味着用户无法查看文件的内容。
文件没有写入权限:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rwxrwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
----rw-rw- 1 zwy zwy 75 Jan 25 20:57 code.c
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ echo 'hello linux' >> code.c
-bash: code.c: Permission denied
这意味着用户无法对文件进行修改或写入操作。
文件没有执行权限: 如果文件是脚本或二进制文件,而没有执行权限,用户无法运行该文件作为程序。
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rw-rwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
-rw-rw-rw- 1 zwy zwy 75 Jan 26 11:59 code.c
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ./code
-bash: ./code: Permission denied
这意味着用户无法执行该文件。
文件没有修改权限:如果你尝试修改文件权限(例如使用 chmod)但没有足够的权限,你可能会收到如下系统反馈:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rw-rwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
-rw-rw-rw- 1 zwy zwy 75 Jan 26 11:59 code.c
-rw-r--r-- 1 root root 0 Jan 26 12:03 root.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ chmod o+w root.txt
chmod: changing permissions of ‘root.txt’: Operation not permitted
zwy
用户身份使用chmod
指令修改root
用户的文件权限,显然该操作不被系统允许,不具备足够的权限Linux下一切皆文件
目录也是一种特殊的文件 。由于目录权限的特殊性,我们将目录单独讲解
大家觉得用户能否进入一个目录,取决于目录的哪个权限呢?答对了!取决于是否拥有该目录的执行权限
允许用户进入(访问)该目录,执行与该目录相关的路径操作
。如果目录没有执行权限,用户无法进入该目录,甚至无法通过路径访问该目录的任何文件或子目录
。[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ ll
total 4
drw-rwxr-x 2 zwy zwy 4096 Jan 26 12:03 code
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ cd code/
-bash: cd: code/: Permission denied
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ ls -l code/
ls: cannot access code/root.txt: Permission denied
ls: cannot access code/code.c: Permission denied
ls: cannot access code/code: Permission denied
total 0
-????????? ? ? ? ? ? code
-????????? ? ? ? ? ? code.c
-????????? ? ? ? ? ? root.txt
执行权限
,用户无法通过cd
命令进入该目录,也无法通过ls
命令查看该目录的任何内容允许用户列出目录中的文件和子目录。
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ ll
total 4
drwxrwxr-x 2 zwy zwy 4096 Jan 26 12:03 code
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ ls -l code/
total 16
-rw-rwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
-rw-rw-rw- 1 zwy zwy 75 Jan 26 11:59 code.c
-rw-r--r-- 1 root root 0 Jan 26 12:03 root.txt
如果目录没有读取权限,尝试执行 ls 命令会返回权限拒绝的错误,即使你有进入该目录的权限,仍然无法列出其中的内容
。[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ chmod u-r code
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ ls -l code/
ls: cannot open directory code/: Permission denied
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ cd code/
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ls -l
ls: cannot open directory .: Permission denied
允许用户在该目录内创建、删除和重命名文件或子目录。
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rw-rwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
-rw-rw-rw- 1 zwy zwy 75 Jan 26 11:59 code.c
-rw-r--r-- 1 root root 0 Jan 26 12:03 root.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ touch log.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ mv code.c code.cpp
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 16
-rw-rwxrwx 1 zwy zwy 8360 Jan 25 16:13 code
-rw-rw-rw- 1 zwy zwy 75 Jan 26 11:59 code.cpp
-rw-rw-r-- 1 zwy zwy 0 Jan 26 12:39 log.txt
-rw-r--r-- 1 root root 0 Jan 26 12:03 root.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ chmod u-w code
[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ cd code/
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ touch test.c
touch: cannot touch ‘test.c’: Permission denied
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ rm -f log.txt
rm: cannot remove ‘log.txt’: Permission denied
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ mv code.cpp code.c
mv: cannot move ‘code.cpp’ to ‘code.c’: Permission denied
666(rw-rw-rw-)
,即所有者、组用户和其他用户都具有读写权限,但没有执行权限。777(rwxrwxrwx)
,即所有者、组用户和其他用户都可以读、写和执行,即可以进入该目录。 [zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ touch log.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ mkdir test-dir
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 4
-rw-rw-r-- 1 zwy zwy 0 Jan 26 21:14 log.txt
drwxrwxr-x 2 zwy zwy 4096 Jan 26 21:15 test-dir
但当我们在Linux下实际操作时发现:
664(rw-rw-r--)
,并不是666(rw-rw-rw-)
775(rwxrwxr-x)
,并不是777(rwxrwxrwx)
为什么会出现这种情况呢? 这是因为有umask的存在
什么是权限掩码?
权限掩码(umask) 是一个用于控制新创建文件和目录权限的机制
它定义了系统在创建文件或目录时,应该从默认权限中去除哪些权限。umask值通过位掩码的方式指定,影响文件和目录的读(r)、写(w)和执行(x)权限。
666(rw-rw-rw-)
777(rwxrwxrwx)
为什么要有权限掩码?
权限掩码的目的是为了 增强安全性 和 控制权限,因为不是所有用户或程序都应该对文件或目录拥有相同的访问权限。
怎么使用权限掩码?
查看umask:
umask
指令即可查看当前用户的umask设置[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask
0002
umask -S
查看当前用户的umask设置[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ umask -S
u=rwx,g=rwx,o=rx
更改umask:
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask 0022
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask
0022
注意:
/etc/profile
或用户的 ~/.bash_profile
文件,添加或修改 umask 设置。~/.bash_profile
或 ~/.bashrc
文件四位umask的含义:
四位umask的格式为:0ABC
其中:
控制特殊权限位(setuid、setgid、sticky bit)。
控制基本权限(所有者、组、其他用户的权限掩码)。
第一位数字用于屏蔽以下权限:
setuid(SUID):允许用户以文件所有者的权限执行程序。
setgid(SGID):对目录生效时,新建文件会继承目录的组;对文件生效时,以文件所属组的权限执行。
sticky bit:常见于目录(如/tmp),仅允许文件所有者删除自己的文件。
八进制值 | 二进制值 | 被屏蔽的权限 | 说明 |
---|---|---|---|
0 | 000 | 无 | 允许设置所有特殊权限 |
1 | 001 | Sticky Bit | 屏蔽 Sticky Bit |
2 | 010 | SGID | 屏蔽 SGID |
3 | 011 | SGID + Sticky Bit | 同时屏蔽 SGID 和 Sticky Bit |
4 | 100 | SUID | 屏蔽 SUID |
5 | 101 | SUID + Sticky Bit | 同时屏蔽 SUID 和 Sticky Bit |
6 | 110 | SUID + SGID | 同时屏蔽 SUID 和 SGID |
7 | 111 | SUID + SGID + Sticky Bit | 屏蔽所有特殊权限 |
后三位与三位umask一致,通过掩码屏蔽权限:
文件默认权限:666 - umask(文件默认无执行权限)。
目录默认权限:777 - umask(目录默认有执行权限)。
八进制值 | 二进制值 | 屏蔽的权限(rwx) |
---|---|---|
0 | 000 | 不屏蔽任何权限 |
1 | 001 | 屏蔽执行(x) |
2 | 010 | 屏蔽写(w) |
3 | 011 | 屏蔽写和执行 |
4 | 100 | 屏蔽读(r) |
5 | 101 | 屏蔽读和执行 |
6 | 110 | 屏蔽读和写 |
7 | 111 | 屏蔽所有权限 |
最终权限=缺省权限(默认权限)&(~umask) 如何理解?
默认权限:文件和目录的初始最大权限(文件 666,目录 777)。
umask:需要屏蔽(禁用)的权限位,通过 按位取反(~) 后与默认权限进行 按位与(&) 操作。
最终权限:实际生效的权限。
示例验证:
文件权限计算(默认 666,umask 022)
110 110 110
000 010 010
111 101 101
按位与(&):
110 110 110 (666)
&
111 101 101 (~022)
--------------------
110 100 100 → 八进制 `644`(rw-r--r--)
目录权限计算(默认 777,umask 027)
111 111 111
000 010 111
111 101 000
按位与(&):
111 111 111 (777)
&
111 101 000 (~027)
--------------------
111 101 000 → 八进制 `750`(rwxr-x---)
为什么看起来可以等价为“减法”?
示例:
默认权限 666(110 110 110)
,umask 022(000 010 010)
:
666 - 022 = 644 → 结果与按位与一致。
局限性:
公式的普遍适用性:
默认权限(含特殊位):7777(SUID/SGID/Sticky Bit + rwxrwxrwx)
umask 0777 → 屏蔽所有权限(包括特殊权限)。
方式 | 优点 | 缺点 |
---|---|---|
默认权限 - umask | 直观,适合简单场景 | 不适用于 umask 位超过默认权限的情况 |
默认权限 & (~umask) | 严格符合二进制逻辑,普适所有场景 | 需要理解位运算 |
思考一个问题:
drwxrwxrwx 2 root root 4096 Jan 27 12:44 temp-backup
如果有多人协同办公的需求,我们可以在在/
下创建临时目录temp-backup
来解决这样的场景,所有人对该目录都具有读写和执行的权限,我们知道,拥有目录的写权限就可以在目录内新建或者删除文件,那么如果不是我们的文件,可以删除吗?
[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ ll
total 4
-rw-r--r-- 1 root root 11 Jan 27 15:54 root.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ cat root.txt
helloworld
[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ echo 'hellolinux' >> root.txt
bash: root.txt: Permission denied
[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ rm -f root.txt
[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ ll
total 0
答案是可以的!
在这些共享目录中,如果有人恶意删除文件,那么即便不是他的文件他也有权力删除,就会导致一些不可预料的错误,针对这个问题,Linux中对目录增加了粘滞位
的概念。
在 Linux 和类 Unix 系统中,给目录设置 粘滞位(Sticky Bit)是一种常见的做法,尤其是在共享目录中。
为什么需要设置粘滞位?
防止非所有者删除文件
:
增强共享目录的安全性
:
常见应用场景:
粘滞位的查看:
ls -l
命令查看目录的权限,如果最后一个字符是 t
,说明目录已启用粘滞位:drwxrwxrwt. 8 root root 4096 Jan 27 03:28 tmp
根目录下的tmp
目录就是启用粘滞位的目录,用来存放临时文件多人协作办公
设置粘滞位:
chmod
命令可以设置或取消粘滞位。chmod +t /tmp
这样就会为 /tmp 目录启用粘滞位。[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 4
drwxrwxr-x 2 zwy zwy 4096 Jan 27 18:58 temp-backup
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ chmod +t temp-backup
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 4
drwxrwxr-t 2 zwy zwy 4096 Jan 27 18:58 temp-backup
取消粘滞位:
chmod -t /tmp
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 4
drwxrwxr-t 2 zwy zwy 4096 Jan 27 18:58 temp-backup
[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ll
total 4
drwxrwxr-x 2 zwy zwy 4096 Jan 27 18:58 temp-backup
总结:
在 Linux 系统中,每个用户都有一个 家目录(Home Directory),该目录是用户存储个人文件、配置文件和其他数据的地方。家目录通常位于 /home 目录下,每个用户都会有一个与其用户名相同的子目录。例如,用户 LA的家目录通常是 /home/LA
家目录的基本概念:
家目录是一个为每个用户分配的独立空间,包含该用户的文件、设置、配置文件等。家目录为用户提供一个隔离的环境,使得他们可以自由地管理自己的文件,而不影响其他用户的文件。
家目录的默认位置: 默认情况下,Linux 系统为每个用户创建一个家目录,通常位于 /home 目录下。 例如:
/home/la
/home/hq
/root
,这是 root 用户的默认工作目录。家目录的权限通常为 700
,即仅允许该用户自己访问,其他用户无法查看或修改其家目录。这样就做到了多用户彼此隔离,互不干扰
[root@iZbp1dkpw5hx2lyh7vjopaZ home]# ls -l
total 8
drwx------ 3 zwy zwy 4096 Jan 26 22:32 zwy
drwx------ 2 zyy zyy 4096 Jan 27 19:48 zyy
家目录中的内容: 家目录通常包含以下内容:
~/.bashrc、
~/.profile
等。创建用户时的家目录:
当使用 useradd
命令创建新用户时,系统会默认为用户创建一个家目录。默认情况下,该目录位于 /home
下,目录名与用户的用户名相同。
例如,创建一个名为 xxn 的用户时:
sudo useradd xxn
/home/xxn
目录,并将其设置为该用户的家目录。设置家目录:
如果你希望为某个用户设置一个不同的位置作为家目录,可以使用 -d
选项:
sudo useradd -d /custom/path/username username
访问家目录: 用户可以通过 cd 命令进入自己的家目录:
cd ~
或者
cd /home/username
~
是一个快捷方式,表示当前用户的家目录。echo $HOME
命令查看当前用户的家目录路径。删除用户及其家目录:
如果你想删除用户以及他们的家目录,可以使用 userdel 命令的 -r
选项:
sudo userdel -r alice
这会删除用户 alice 和其家目录 /home/alice
。
权限 | 含义 | 数字表示 | 示例 |
---|---|---|---|
r | 读权限 | 4 | r--(只读) |
w | 写权限 | 2 | rw-(读写) |
x | 执行权限 | 1 | rwx(完全权限) |
权限组合 | 含义 | 数字表示 |
---|---|---|
rwx | 所有者:读、写、执行 | 7 |
r-x | 所有者:读、执行 | 5 |
rw- | 所有者:读、写 | 6 |
r– | 所有者:读 | 4 |
操作 | 文件权限 | 目录权限 |
---|---|---|
r | 读取文件内容 | 列出目录中的文件 |
w | 修改文件内容 | 创建、删除文件 |
x | 执行文件 | 进入目录(cd) |
命令 | 说明 |
---|---|
ls -l | 查看文件权限 |
chmod 755 file.txt | 修改文件权限 |
chown alice:staff file.txt | 更改文件的拥有者和所属组 |
useradd alice | 创建新用户 |
usermod -aG devs john | 将用户添加到组 |