【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

1、计算机系统中的权限

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

1.1、什么是权限

概念:

在计算机系统中,权限是指用户或进程对系统资源(如文件、目录、设备、网络等)可以执行的操作的授权。权限的设计目的是为了保障系统的安全性,防止未经授权的访问或操作。

权限的关键要素:

1、资源

权限总是针对某个具体资源,如:

文件或目录数据库记录网络端口系统配置

2、操作类型

不同资源支持不同的操作类型。如:

对文件:读(Read)、写(Write)、执行(Execute) 对数据库:查询、插入、更新、删除 对网络:连接、发送、接收

3、 主体

权限控制需要明确操作的主体,主体可以是:

用户(User)用户组(Group)进程(Process)角色(Role)

简单来说,权限就是能或者不能去做一件事


1.2、为什么要有权限

权限设计的核心目的是保护系统资源,确保只有授权的用户或进程可以访问或修改特定的文件、程序或数据!

具体来说有以下原因:

提升系统安全性:限制未授权用户访问敏感数据或系统资源,防止数据泄露和恶意操作。精细化访问控制:根据用户角色分配权限,确保最小权限原则,避免误操作和资源浪费。保障资源完整性:防止重要文件和数据被修改或破坏。支持多用户环境:确保用户之间的资源隔离,保护个人数据和协作权限。遵守合规要求:满足行业法规和数据保护要求,提供审计追踪功能。提升系统可维护性:通过角色和用户组简化权限管理,提高系统扩展性。减少潜在漏洞:通过严格的权限控制,降低系统漏洞带来的风险。1.3、不同操作系统下的权限

不同操作系统下的权限设计方式有所不同,以下是主要操作系统的权限管理概述:


1.3.1、 linux/unix

文件权限:

每个文件和目录都有三种基本权限:读(r)、写(w)、执行(x),这些权限分别对文件的拥有者、所属用户组和其他用户有效。 每个文件和目录有三个权限组:

用户(Owner):文件的拥有者权限。组(Group):与文件所有者同一组的用户权限。其他(Others):其他用户的权限。

文件权限表示:

通过 ls -l显示的文件权限(例如:-rwxr-xr-x)。

SELinux和AppArmor:

增强访问控制机制,通过给资源分配安全上下文来细化权限,提供更细粒度的安全控制。

ACL(Access Control Lists):

提供比基本文件权限更细粒度的权限控制,允许为不同的用户或组单独设置不同的访问权限。

命令行管理:

使用 chmod、chown 和 chgrp等命令来设置文件或目录的权限。

根用户(root):

root 用户在类 Unix 系统中拥有完全的控制权限,不受权限控制,可以执行所有操作。


1.3.2、 windows

NTFS 权限:

Windows 使用 NTFS 文件系统来管理文件和文件夹权限,权限包括读取(Read)、写入(Write)、执行(Execute)、修改(Modify)等。

用户和组:

Windows 使用用户账户和用户组来管理权限,可以将权限分配给单个用户或用户组。

-访问控制列表(ACL):

文件和文件夹的访问控制通过 ACL 设置,ACL 记录哪些用户或组具有哪些权限。

-继承权限:

在 Windows 中,文件夹的权限通常可以被其子文件继承,这样可以简化大规模权限管理。

用户账户控制(UAC):

UAC 允许系统管理权限的请求,防止未授权应用程序或恶意软件获得系统管理员权限。


1.3.3、 macos

UNIX 权限:

macos 基于 Unix,使用类似于 Linux 的文件权限(读、写、执行)来管理文件。

用户和组:

macOS 使用用户和组进行权限分配,每个文件都可以有不同的所有者和所属用户组。

系统完整性保护(SIP):

macOS 引入了 SIP 来保护系统关键文件和目录,防止被修改。

ACL:

macOS 也支持访问控制列表,提供更细粒度的权限控制。


1.3.4、 ios

iOS 是基于 Unix(Darwin)的操作系统,具有严格的权限管理机制,确保应用沙盒隔离,并保护用户数据和设备的安全:

应用沙盒:

每个应用在 iOS 中都被隔离在自己的沙盒中,无法直接访问其他应用或系统文件。即使是同一应用的不同部分,也只能在有限的沙盒内运行。

权限请求:

iOS 使用类似 android 的权限请求机制,应用在使用摄像头、麦克风、位置、照片库等敏感信息时,需要请求用户授权。

App Store 审核:

iOS 应用必须经过严格的 App Store 审核,审核过程中会检查应用是否遵循 iOS 的权限管理规则。

System Integrity Protection (SIP):

类似于 macOS,iOS 也拥有系统完整性保护机制,防止恶意应用或代码篡改系统文件。


1.3.5、 Android

Android 是基于 Linux 内核的 ,因此它的权限管理方式也继承了 Linux 的一些特性,但在移动环境下做了很多调整:

应用权限:

Android 应用有一套权限管理系统,应用安装时会请求用户授权所需的权限,如访问摄像头、位置、存储等。

权限模型:

Android 使用基于角色的权限模型,系统级权限由 Android系统预定义,应用程序则需要显式声明权限,用户可以选择是否授予这些权限。

运行时权限:

Android6.0(Marshmallow)及更高版本引入了运行时权限模型。用户可以在应用运行时授予或撤销特定权限,而不仅仅是在安装时授权。

SELinux:

Android 也采用了 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)和审查机制

强化安全性,通过沙盒机制隔离应用,严格的权限管理和审查机制,防止恶意行为和泄漏敏感数据

类 Unix 系统(Linux 和 Unix):基于文件和目录权限,广泛使用命令行工具来进行权限控制,支持更多高级的安全机制(如 SELinux)。Android 和 iOS:作为移动操作系统,它们在传统的文件权限控制基础上增加了应用沙盒和动态权限管理,以提高安全性,避免应用之间的相互干扰。Windows:使用 ACL 和 NTFS 权限模型,主要依赖于用户和组管理,注重易用性,适合桌面操作系统的需求。macOS:与 Linux 相似的 Unix 权限模型,增强了系统完整性保护(SIP)和应用沙盒,提供多层次的安全防护机制。

这些操作系统在权限管理上的主要差异在于它们的架构设计和使用场景,移动操作系统更注重用户隐私和安全,而桌面系统则更多地依赖于文件系统和用户账户管理。


2、Linux中的权限2.1、Linux下的两种用户2.1.1、普通用户

定义:

普通用户是指拥有有限权限的用户。普通用户无法执行一些系统管理任务,如修改系统配置文件或安装软件等。

权限:

普通用户通常只能访问自己有权限的文件和资源,不能访问其他用户的文件,除非拥有相应的权限。

文件和目录权限:

普通用户通常只能对自己拥有的文件和目录进行读写操作,对其他用户的文件只能根据文件权限设置进行操作。

命令执行:

普通用户只能执行普通的命令或程序,不能执行系统管理命令,除非获得特殊权限(例如使用 sudo)。

常见用途:

普通用户主要用于日常使用,比如浏览网页、编辑文档、运行应用程序等。

用户管理:

在 Linux 中,每个普通用户都有一个唯一的用户 ID(UID)和一个与之关联的用户组。用户可以属于多个组,但每个文件和目录都有一个与之关联的所有者和所属组。

普通用户的命令行提示符:

代码语言:JavaScript代码运行次数:0运行复制

 [zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ 

2.1.2、超级用户(root用户)

定义:

超级用户(也叫 root 用户)是 Linux 系统中的管理员账户。root用户拥有系统的完全控制权限,可以执行所有操作,包括对系统进行修改、安装软件、配置网络等。

权限:

root 用户具有几乎无所不能的权限,能够访问所有文件、修改系统设置、安装和卸载程序、创建和删除用户等。root不受权限限制

文件和目录权限:

root 用户对所有文件和目录都拥有读写执行权限,不受任何权限限制。

命令执行:

root 用户可以执行所有系统级命令,包括管理系统、网络、硬件和用户等。

常见用途:

root 用户主要用于系统管理、安装软件、配置系统、修复系统问题等。普通用户不能执行的一些管理任务,通常需要 root 用户来执行。

安全性:

由于 root 用户具有极高的权限,滥用或误用 root 权限可能会对系统造成严重破坏。因此,一般建议避免长期以 root 用户身份进行工作,最好通过 sudo 命令临时获得 root 权限来执行需要的操作。2.1.3、用户之间的切换

普通用户切换为超级用户:

使用su -命令:

输入su – 命令后,系统会提示你输入root用户的密码,密码输入正确后,将会切换为root用户,并且默认处在root用户的家目录。代码语言:javascript代码运行次数:0运行复制

[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用户,并且会保留在切换身份前的目录中。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ pwd/home/zwy/code/test[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ suPassword: [root@iZbp1dkpw5hx2lyh7vjopaZ test]# pwd/home/zwy/code/test

超级用户切换为其他普通用户:

使用exit命令:

如果时使用 su或者su -命令从普通用户切换为超级用户,那么使用exit命令退出当前的 root 会话,返回到之前的普通用户会话。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ su -Password: Last login: Thu Jan 23 18:55:53 CST 2025 on pts/0[root@iZbp1dkpw5hx2lyh7vjopaZ ~]# exitlogout[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ 

使用su命令:

使用su uesrname命令即可切换到任意一个普通用户,username代表要切换到的用户名,由于root的权限为最高级别,所以无需密码即可切换。代码语言:javascript代码运行次数:0运行复制

[root@iZbp1dkpw5hx2lyh7vjopaZ ~]# su zwy[zwy@iZbp1dkpw5hx2lyh7vjopaZ root]$ pwd/root

切换后不会改变当前路径,仍然停留在切换为普通用户前,root用户所在的目录


2.2、文件的权限2.2.1、文件类型的划分

普通文件(Regular File)

普通文件是最常见的文件类型,通常包含文本、二进制数据、图像、音频等内容。普通文件不具备特殊的功能,它们仅存储数据。表示符号:-代码语言:javascript代码运行次数:0运行复制

示例:/home/user/document.txt、/usr/bin/program

目录文件(Directory File)

目录文件用于存储文件系统中的文件和其他目录。它实际上是一个特殊的文件,用于存储其他文件的名字和位置信息。目录本身不包含数据,而是充当文件夹的角色。表示符号:d代码语言:javascript代码运行次数:0运行复制

示例:/home/user/、/etc/

符号链接文件(Symbolic Link File)

符号链接(也叫软链接)是一个指向另一个文件或目录的引用。符号链接实际上只是一个路径,指向另一个文件或目录。它允许用户通过一个文件名访问另一个文件或目录,而不需要知道实际文件的位置。表示符号:l代码语言:javascript代码运行次数:0运行复制

示例:/home/user/symlink(指向 /home/user/target_file)

字符设备文件(Character Device File)

字符设备文件是与字符设备(如终端、键盘、鼠标等)相关的文件。这些设备通常按字符流的方式进行输入输出。字符设备文件没有缓存机制,每次输入/输出一个字符。表示符号:c代码语言:javascript代码运行次数:0运行复制

示例:/dev/tty1(终端设备),/dev/random(随机设备)

块设备文件(Block Device File)

块设备文件是与块设备(如硬盘、USB驱动器、光盘等)相关的文件。块设备将数据按块(如 512字节或更大的块)进行存储和传输。与字符设备不同,块设备通常具有缓存机制,可以在多个块上同时进行读写操作。表示符号:b代码语言:javascript代码运行次数:0运行复制

示例:/dev/sda(硬盘),/dev/sdb1(硬盘分区)

命名管道文件(FIFO File)

FIFO(First In, FirstOut)文件也叫命名管道,是一种用于进程间通信(IPC)的特殊文件。它允许一个进程将数据写入管道,另一个进程读取这些数据。管道文件的作用是建立进程之间的通信。表示符号:p代码语言:javascript代码运行次数:0运行复制

示例:/tmp/myfifo(管道文件)

套接字文件(Socket File)

套接字文件用于网络通信或进程间通信。它们提供了进程间数据交换的通道,特别适用于客户端-服务器通信。套接字通常用于建立网络连接。表示符号:s代码语言:javascript代码运行次数:0运行复制

示例:/tmp/mysocket(套接字文件)

设备文件(Device File)

设备文件是 Linux 中与硬件设备的交互接口。它们分为字符设备和块设备文件。设备文件一般位于 /dev 目录下。字符设备文件(c):用于与字符设备(如终端、串口等)进行交互。块设备文件(b):用于与块设备(如硬盘、USB 驱动器等)进行交互。

符号链接(Symbolic Link)

符号链接文件(软链接)是 Linux 系统中的一种特殊文件,实际上它只是一个指向另一个文件的路径引用。它允许用户通过不同的路径访问同一个文件或目录。表示符号:l代码语言:javascript代码运行次数:0运行复制

示例:ln -s /path/to/target /path/to/symlink

文件类型查看

你可以使用 ls -l 命令查看文件的类型。

输出示例:

代码语言:javascript代码运行次数:0运行复制

-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

2.2.2、文件权限的表示

文件访问用户的分类:

文件的拥有者(User)与文件拥有者同组的用户(Group)称为所属组其他用户(Others)

文件访问的权限:

r:读权限w:写权限x:执行权限如果没有某项权限,则该位置为 –

文件的权限=访问角色+目标文件属性

角色就是文件访问者的身份目标属性就是目标文件本身的属性

说明:

文本文件本身不具备可执行的属性,那么即使文件访问者具备执行该文件的权限,由于该文件本身不可执行,最终文件的权限表示为不可执行可执行文件本身就具备可执行的属性,那么如果文件访问者具备执行该文件的权限,那么文件的权限就表示为可执行,如果文件访问者不具备执行该文件的权限,那么文件的权限就表示为不可执行

通俗的说,给你机会你也不中用啊,即便系统给你执行该文件的权限,但是该文件本来就不具备可执行属性,那么最终文件的权限还是不可执行

再次理解,文件的权限=访问角色+目标文件属性

例如:

代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ ls -ltotal 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

对如上文件权限分析:

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

根据上述分析:

root.txt: 该文件为普通文件,文件本身不具备可执行的属性,标识符为-,拥有者为root,所属组为root,拥有者的权限为rw-,可读可写不可执行,所属组的权限为r–,只可读不可写不可执行,其他用户other的权限为r–,只可读不可写不可执行zwy.txt: 该文件也为普通文件,文件本身不具备可执行的属性,标识符为-,拥有者为zwy,所属组为zwy,拥有者的权限为rw-,可读可写不可执行,所属组的权限为rw-,可读可写不可执行,其他用户other的权限为r–,只可读不可写不可执行

文件权限的八进制表示:

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

每个用户类别的权限是独立的,因此可以用二进制的0或1来表示每个用户的权限,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


2.2.3、文件权限的修改

使用chmod指令修改文件的权限

操作符:

+:添加权限。-:移除权限。=:设置精确权限(覆盖现有权限)。

用户类别:

u:拥有者(User)g:所属组组(Group)o:其他用户(Others)a:所有用户(All,包含 u、g 和 o)

权限字符:

r:读权限w:写权限x:执行权限

命令格式:

chmod 用户 操作符 权限 文件名

添加权限:

代码语言:javascript代码运行次数:0运行复制

chmod u+x filename:#给文件的拥有者添加执行权限。chmod g+r filename:#给文件的所属组添加读权限。chmod o+w filename:#给其他用户添加写权限。

移除权限:

代码语言:javascript代码运行次数:0运行复制

chmod u-x filename:#给文件的拥有者移除执行权限。chmod g-w filename:#给文件的所属组移除写权限。chmod o-r filename:#给文件其他用户移除读权限。

精确设置权限:

代码语言:javascript代码运行次数:0运行复制

chmod u=rwx filename:#将文件的拥有者的权限设置为读、写、执行。chmod g=rx filename:#将文件的所属组权限设置为读和执行。chmod o=r filename:#将文件其他用户权限设置为只读。

使用八进制表示法修改文件的权限

八进制模式使用一个三位二进制数字来表示文件的权限。每一位数字表示不同类别的权限,范围从 0 到 7。

示例:

设置文件权限为 rwxr-xr-x(755)代码语言:javascript代码运行次数:0运行复制

chmod 755 filename

说明:所有者有读、写、执行权限(7),用户组和其他用户有读和执行权限(5)。

设置文件权限为 rw-r–r–(644)代码语言:javascript代码运行次数:0运行复制

chmod 644 filename

说明:所有者有读和写权限(6),用户组和其他用户有只读权限(4)。

设置文件权限为 rwx——(700)代码语言:javascript代码运行次数:0运行复制

chmod 700 filename

说明:所有者有读、写、执行权限(7),用户组和其他用户没有任何权限(0)。

设置文件权限为 r–r–r–(444)代码语言:javascript代码运行次数:0运行复制

chmod 444 filename

说明:所有者、用户组和其他用户只有读权限(4)。

设置文件权限为 rwxrwxrwx(777)代码语言:javascript代码运行次数:0运行复制

chmod 777 filename

说明:所有者、用户组和其他用户都有读、写、执行权限(7)。

设置文件权限为 r-xr-xr-x(555)代码语言:javascript代码运行次数:0运行复制

chmod 555 filename

说明:所有者、用户组和其他用户都有读和执行权限(5),没有写权限。

递归修改权限

当需要修改目录及其所有子文件和子目录的权限时,可以使用 -R 选项来递归修改权限。代码语言:javascript代码运行次数:0运行复制

chmod -R 755 /path/to/directory #指定目录

这将会递归地将指定目录及其所有内容的权限设置为 rwxr-xr-x(755)

2.2.4、文件拥有者和所属组的修改

在 Linux 系统中,文件的 拥有者(owner)和 所属组(group)可以通过命令进行修改。这对于文件的管理和权限控制非常重要。

chown 命令 chown(change owner)命令用于更改文件或目录的拥有者和所属组。

代码语言:javascript代码运行次数:0运行复制

chown [OPTIONS] USER:GROUP FILE

USER: 新的文件拥有者(用户)。GROUP: 新的文件所属组(组)。FILE: 目标文件或目录的路径。

如果你只需要更改文件的 拥有者 或 所属组,可以省略 GROUP 或 USER。

修改文件的拥有者:

要将文件 file.txt 的拥有者改为用户 Sam,可以执行以下命令:代码语言:javascript代码运行次数:0运行复制

chown Sam file.txt

这会将 file.txt 的拥有者更改为 Sam,而文件的所属组保持不变。

修改文件的所属组:

要将文件 file.txt 的所属组改为Bob,可以执行以下命令:代码语言:javascript代码运行次数:0运行复制

chown :Bob file.txt

或者使用chgrp命令:代码语言:javascript代码运行次数:0运行复制

chown Bob file.txt

这会将 file.txt 的所属组更改为Bob,而文件的拥有者保持不变。

同时修改文件的拥有者和所属组: 要将文件 file.txt 的拥有者更改为Sam,同时将所属组更改为 Bob,可以执行以下命令:

代码语言:javascript代码运行次数:0运行复制

chown Sam:Bob file.txt

或者也可以使用这种方式:

代码语言:javascript代码运行次数:0运行复制

chown Sam.Bob file.txt

修改目录及其内部所有文件的拥有者和所属组

如果你想递归地修改目录及其下所有文件的拥有者和所属组,可以使用 -R 选项:代码语言:javascript代码运行次数:0运行复制

chown -R Sam:Bob /path/to/directory

这会将 /path/to/directory 目录及其所有内容(包括子目录和文件)的拥有者更改为 Sam,所属组更改为Bob。

修改文件的权限和拥有者时的注意事项:

文件拥有者:只有超级用户(root)才能修改文件的拥有者。如果你没有足够的权限,系统会提示权限错误。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ test]$ chown zyy:zyy zwy.txtchown: changing ownership of ‘zwy.txt’: Operation not permitted

文件所属组:普通用户可以更改文件的所属组,但需满足两个条件:用户是文件的当前所有者。用户属于目标组。


2.2.5、文件权限的缺失

文件没有读取权限:

如果一个文件没有读取权限,用户无法查看该文件的内容。尝试打开文件时,会返回权限拒绝错误。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 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.ccat: code.c: Permission denied

这意味着用户无法查看文件的内容。

文件没有写入权限:

如果一个文件没有写入权限,用户无法修改该文件。尝试编辑或覆盖文件时,会收到权限拒绝的错误。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 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

这意味着用户无法对文件进行修改或写入操作。

文件没有执行权限: 如果文件是脚本或二进制文件,而没有执行权限,用户无法运行该文件作为程序。

代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 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)但没有足够的权限,你可能会收到如下系统反馈:

代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 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.txtchmod: changing permissions of ‘root.txt’: Operation not permitted

以zwy用户身份使用chmod指令修改root用户的文件权限,显然该操作不被系统允许,不具备足够的权限


2.3、目录的权限Linux下一切皆文件

目录也是一种特殊的文件 。由于目录权限的特殊性,我们将目录单独讲解

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

大家觉得用户能否进入一个目录,取决于目录的哪个权限呢?答对了!取决于是否拥有该目录的执行权限

2.3.1、目录的执行权限含义: 允许用户进入(访问)该目录,执行与该目录相关的路径操作。使用场景: 用户需要有执行权限才能通过 cd 命令进入该目录,或访问该目录的子目录(即使该目录不可读)。如果没有执行权限,用户不能进入该目录,即使有其他权限(如读取权限)。没有执行权限时: 如果目录没有执行权限,用户无法进入该目录,甚至无法通过路径访问该目录的任何文件或子目录。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ lltotal 4drw-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 deniedls: cannot access code/code.c: Permission deniedls: cannot access code/code: Permission deniedtotal 0-????????? ? ? ? ?            ? code-????????? ? ? ? ?            ? code.c-????????? ? ? ? ?            ? root.txt

由此可以得出结论,如果没有目录的执行权限,用户无法通过cd命令进入该目录,也无法通过ls命令查看该目录的任何内容2.3.2、目录的读权限含义: 允许用户列出目录中的文件和子目录。使用场景: 用户可以使用 ls 命令查看目录中的文件名和子目录名称,但无法查看文件的内容。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ lltotal 4drwxrwxr-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 命令会返回权限拒绝的错误,即使你有进入该目录的权限,仍然无法列出其中的内容。代码语言:javascript代码运行次数:0运行复制

[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

2.3.3、目录的写权限含义: 允许用户在该目录内创建、删除和重命名文件或子目录。使用场景: 用户可以在该目录中创建新的文件或子目录,或者删除目录中的文件和子目录。代码语言:javascript代码运行次数:0运行复制

 [zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 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]$ lltotal 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

没有写入权限时: 如果目录没有写入权限,用户无法在目录内进行修改,如创建文件、删除文件或重命名文件。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ chmod u-w code[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ cd code/[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ touch test.ctouch: cannot touch ‘test.c’: Permission denied[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ rm -f log.txtrm: cannot remove ‘log.txt’: Permission denied[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ mv code.cpp code.cmv: cannot move ‘code.cpp’ to ‘code.c’: Permission denied

2.4、缺省权限(默认权限)文件:新文件的默认权限通常是 666(rw-rw-rw-),即所有者、组用户和其他用户都具有读写权限,但没有执行权限。目录:新目录的默认权限通常是 777(rwxrwxrwx),即所有者、组用户和其他用户都可以读、写和执行,即可以进入该目录。代码语言:javascript代码运行次数:0运行复制

 [zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ touch log.txt[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ mkdir test-dir[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 4-rw-rw-r-- 1 zwy zwy    0 Jan 26 21:14 log.txtdrwxrwxr-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的存在

2.4.1、权限掩码umask

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

什么是权限掩码?

权限掩码(umask) 是一个用于控制新创建文件和目录权限的机制

它定义了系统在创建文件或目录时,应该从默认权限中去除哪些权限。umask值通过位掩码的方式指定,影响文件和目录的读(r)、写(w)和执行(x)权限。

默认文件权限:666(rw-rw-rw-)默认目录权限:777(rwxrwxrwx)掩码:umask会“减去”这些默认权限的一部分,从而影响最终的权限。

为什么要有权限掩码?

权限掩码的目的是为了 增强安全性 和 控制权限,因为不是所有用户或程序都应该对文件或目录拥有相同的访问权限。

增强安全性:默认情况下,文件创建时具有过多的权限可能会导致安全问题。例如,如果一个文件对所有人都开放写权限,任何用户都可以修改它,这可能导致数据丢失或泄露。控制访问:通过设置合适的umask值,管理员可以确保文件和目录仅限于必要的用户和组访问。比如,管理员可以避免其他用户(不是文件的所有者或所属组的用户)拥有不必要的写权限。满足特定需求:不同的环境和项目可能需要不同的权限控制。例如,一些敏感项目要求严格的访问权限,因此可以设置更严格的umask值。

怎么使用权限掩码?

查看umask:

在命令行中输入umask指令即可查看当前用户的umask设置代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask0002

或者在命令行中输入umask -S查看当前用户的umask设置代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ ~]$ umask -Su=rwx,g=rwx,o=rx

更改umask:

如果你想设置新的umask值为0022,直接在命令行中输入 umask 0022代码语言:javascript代码运行次数:0运行复制

 [zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask 0022[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ umask0022

注意:

这样设置只是临时的,umask只能在当前状态下有效,当重启Xshell时就会恢复。如果要永久更改umask,需要编辑 /etc/profile或用户的 ~/.bash_profile 文件,添加或修改 umask 设置。如果你只想影响特定用户,可以编辑他们的~/.bash_profile 或 ~/.bashrc 文件

四位umask的含义:

四位umask的格式为:0ABC

其中:

第1位(0):控制特殊权限位(setuid、setgid、sticky bit)。后3位(ABC):控制基本权限(所有者、组、其他用户的权限掩码)。

第一位数字用于屏蔽以下权限:

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

屏蔽所有权限

2.4.2、最终权限的确定

最终权限=缺省权限(默认权限)&(~umask) 如何理解?

默认权限:文件和目录的初始最大权限(文件 666,目录 777)。umask:需要屏蔽(禁用)的权限位,通过 按位取反(~) 后与默认权限进行 按位与(&) 操作。最终权限:实际生效的权限。

示例验证:

文件权限计算(默认 666,umask 022)

默认权限:666 → 二进制 110 110 110umask:022 → 二进制 000 010 010按位取反(~umask):111 101 101

按位与(&):

代码语言:javascript代码运行次数:0运行复制

110 110 110  (666)& 111 101 101  (~022)--------------------110 100 100  → 八进制 `644`(rw-r--r--)

目录权限计算(默认 777,umask 027)

默认权限:777 → 二进制 111 111 111umask:027 → 二进制 000 010 111按位取反(~umask):111 101 000

按位与(&):

代码语言:javascript代码运行次数:0运行复制

111 111 111  (777)& 111 101 000  (~027)--------------------111 101 000  → 八进制 `750`(rwxr-x---)

为什么看起来可以等价为“减法”?

当 umask 的二进制位是默认权限的子集时,按位与取反后的 umask 等价于 默认权限减去 umask。

示例: 默认权限 666(110 110 110),umask 022(000 010 010):

代码语言:javascript代码运行次数:0运行复制

666 - 022 = 644 → 结果与按位与一致。

局限性:

如果 umask 的某一位权限值超过默认权限的对应位,减法会借位,但按位与不会(此时两种方法结果不同)。(实际场景中,umask 通常不会设置超过默认权限的位,因此减法仍适用。)

公式的普遍适用性:

适用所有情况:无论是三位还是四位 umask,均可用此公式计算最终权限。特殊权限位:四位 umask 的第一位(如 0022 中的 0)也遵循此规则代码语言:javascript代码运行次数:0运行复制

默认权限(含特殊位):7777(SUID/SGID/Sticky Bit + rwxrwxrwx)umask 0777 → 屏蔽所有权限(包括特殊权限)。

方式

优点

缺点

默认权限 – umask

直观,适合简单场景

不适用于 umask 位超过默认权限的情况

默认权限 & (~umask)

严格符合二进制逻辑,普适所有场景

需要理解位运算


2.5、权限粘滞位2.5.1、问题导入

思考一个问题:

代码语言:javascript代码运行次数:0运行复制

drwxrwxrwx   2 root root  4096 Jan 27 12:44 temp-backup

如果有多人协同办公的需求,我们可以在在/下创建临时目录temp-backup来解决这样的场景,所有人对该目录都具有读写和执行的权限,我们知道,拥有目录的写权限就可以在目录内新建或者删除文件,那么如果不是我们的文件,可以删除吗?

代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ lltotal 4-rw-r--r-- 1 root root 11 Jan 27 15:54 root.txt[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ cat root.txthelloworld[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ echo 'hellolinux' >> root.txtbash: root.txt: Permission denied[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ rm -f root.txt[zwy@iZbp1dkpw5hx2lyh7vjopaZ temp-backup]$ lltotal 0

答案是可以的!

即便我不是文件的拥有者和所属组,我只有文件的读权限,但是我仍然可以删除这属于root用户的文件,且不需要任何身份确认!因为文件能否被删除取决于所在目录的读权限,而不取决于文件本身的权限

在这些共享目录中,如果有人恶意删除文件,那么即便不是他的文件他也有权力删除,就会导致一些不可预料的错误,针对这个问题,Linux中对目录增加了粘滞位的概念。

2.5.2、粘滞位的设置

在 Linux 和类 Unix 系统中,给目录设置 粘滞位(Sticky Bit)是一种常见的做法,尤其是在共享目录中。

粘滞位的作用是限制对目录中文件的删除权限,确保只有文件的所有者、目录的所有者,或者超级用户(root)才能删除该目录中的文件。

为什么需要设置粘滞位?

防止非所有者删除文件:

在多用户系统中,可能有多个用户共享一个目录。如果没有设置粘滞位,任何用户都可以删除该目录中的文件。为了避免误删除或恶意删除其他用户的文件,可以设置粘滞位。粘滞位限制了文件的删除权限,只有文件的所有者(即该文件创建者)或超级用户(root)才能删除该文件,即使其他用户对该目录有写权限。

增强共享目录的安全性:

如果有一个公共的共享目录,多个用户可以向其中添加文件。如果没有粘滞位,那么用户 A、B、C 都可以删除目录中其他用户的文件。而如果设置了粘滞位,则只有文件的拥有者才能删除自己的文件,其他用户不能删除。这样可以避免共享目录中的文件被无意中或恶意删除。

常见应用场景:

/tmp 目录:这是一个常见的设置粘滞位的目录。所有用户都可以在 /tmp 目录中创建临时文件,但只有文件的所有者或 root用户能够删除文件。这样即使其他用户也能在该目录下创建文件,也无法删除他人创建的文件。/var/tmp 目录:类似于 /tmp,也经常会设置粘滞位来防止文件的删除问题。

粘滞位的查看:

使用 ls -l 命令查看目录的权限,如果最后一个字符是 t,说明目录已启用粘滞位:代码语言:javascript代码运行次数:0运行复制

drwxrwxrwt.   8 root root  4096 Jan 27 03:28 tmp

根目录下的tmp目录就是启用粘滞位的目录,用来存放临时文件多人协作办公

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

设置粘滞位:

设置粘滞位:使用 chmod 命令可以设置或取消粘滞位。设置粘滞位的命令如下: chmod +t /tmp 这样就会为 /tmp 目录启用粘滞位。代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 4drwxrwxr-x 2 zwy zwy 4096 Jan 27 18:58 temp-backup[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ chmod +t temp-backup[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 4drwxrwxr-t 2 zwy zwy 4096 Jan 27 18:58 temp-backup

取消粘滞位:

如果你不再需要该目录具有粘滞位,可以使用以下命令来取消:chmod -t /tmp代码语言:javascript代码运行次数:0运行复制

[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 4drwxrwxr-t 2 zwy zwy 4096 Jan 27 18:58 temp-backup[zwy@iZbp1dkpw5hx2lyh7vjopaZ code]$ lltotal 4drwxrwxr-x 2 zwy zwy 4096 Jan 27 18:58 temp-backup

总结:

公共目录在没有粘滞位的情况下,任何用户都可以删除目录中的文件。设置粘滞位后,只有文件的所有者或 root用户才能删除目录中的文件,即使其他用户对目录具有写权限。设置粘滞位是为了增强共享目录的安全性,防止用户误删或恶意删除其他用户的文件。它特别适用于公共目录,如/tmp,通过限制删除权限,保证系统的稳定性和安全性。


3、Linux下的家目录

在 Linux 系统中,每个用户都有一个 家目录(Home Directory),该目录是用户存储个人文件、配置文件和其他数据的地方。家目录通常位于 /home 目录下,每个用户都会有一个与其用户名相同的子目录。例如,用户 LA的家目录通常是 /home/LA

3.1、家目录的基本知识

家目录的基本概念: 家目录是一个为每个用户分配的独立空间,包含该用户的文件、设置、配置文件等。家目录为用户提供一个隔离的环境,使得他们可以自由地管理自己的文件,而不影响其他用户的文件。

家目录的默认位置: 默认情况下,Linux 系统为每个用户创建一个家目录,通常位于 /home 目录下。 例如:

用户 la 的家目录:/home/la用户 hq 的家目录:/home/hq对于 root 用户(超级用户),家目录通常位于 /root,这是 root 用户的默认工作目录。3.2、家目录的权限

家目录的权限通常为 700,即仅允许该用户自己访问,其他用户无法查看或修改其家目录。这样就做到了多用户彼此隔离,互不干扰

代码语言:javascript代码运行次数:0运行复制

[root@iZbp1dkpw5hx2lyh7vjopaZ home]# ls -ltotal 8drwx------ 3 zwy zwy 4096 Jan 26 22:32 zwydrwx------ 2 zyy zyy 4096 Jan 27 19:48 zyy
【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

3.3、家目录的创建和删除

家目录中的内容: 家目录通常包含以下内容:

配置文件:大多数程序的配置文件都会存放在家目录下,通常以 . 开头,表示它们是隐藏文件。例如,~/.bashrc、 ~/.profile 等。个人数据:用户在家目录下存放的文件和文件夹程序和应用的临时文件:一些程序可能会在家目录下创建临时文件和缓存文件,通常在隐藏的文件夹内。

创建用户时的家目录: 当使用 useradd 命令创建新用户时,系统会默认为用户创建一个家目录。默认情况下,该目录位于 /home 下,目录名与用户的用户名相同。

例如,创建一个名为 xxn 的用户时:

代码语言:javascript代码运行次数:0运行复制

sudo useradd xxn

系统会为xxn用户创建 /home/xxn 目录,并将其设置为该用户的家目录。

设置家目录: 如果你希望为某个用户设置一个不同的位置作为家目录,可以使用 -d 选项:

代码语言:javascript代码运行次数:0运行复制

sudo useradd -d /custom/path/username username

这会将用户 username 的家目录设置为 /custom/path/username

访问家目录: 用户可以通过 cd 命令进入自己的家目录:

代码语言:javascript代码运行次数:0运行复制

cd ~

或者

代码语言:javascript代码运行次数:0运行复制

cd /home/username

~ 是一个快捷方式,表示当前用户的家目录。你也可以使用 echo $HOME 命令查看当前用户的家目录路径。

删除用户及其家目录: 如果你想删除用户以及他们的家目录,可以使用 userdel 命令的 -r 选项:

sudo userdel -r alice

这会删除用户 alice 和其家目录 /home/alice。

4、权限小结4.1、文件权限

权限

含义

数字表示

示例

r

读权限

4

r–(只读)

w

写权限

2

rw-(读写)

x

执行权限

1

rwx(完全权限)

4.2、权限表示(数字)

权限组合

含义

数字表示

rwx

所有者:读、写、执行

7

r-x

所有者:读、执行

5

rw-

所有者:读、写

6

r–

所有者:读

4

4.3、 文件和目录权限

操作

文件权限

目录权限

r

读取文件内容

列出目录中的文件

w

修改文件内容

创建、删除文件

x

执行文件

进入目录(cd)

4. 4、常用命令

命令

说明

ls -l

查看文件权限

chmod 755 file.txt

修改文件权限

chown alice:staff file.txt

更改文件的拥有者和所属组

useradd alice

创建新用户

usermod -aG devs john

将用户添加到组

4.5、 特殊权限

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享