Linux权限管理和文件属性

目录

[1. 权限的概念](#1. 权限的概念)

[2. 权限管理](#2. 权限管理)

[2.1 文件访问者的分类](#2.1 文件访问者的分类)

[2.2 文件类型和访问权限(事物属性)](#2.2 文件类型和访问权限(事物属性))

[2.2.1 文件类型](#2.2.1 文件类型)

[2.2.2 file指令](#2.2.2 file指令)

[2.2.3 基本权限](#2.2.3 基本权限)

[3. 文件访问权限的相关设置方法](#3. 文件访问权限的相关设置方法)

[3.1 chmod](#3.1 chmod)

[3.2 chown 和 chgrp](#3.2 chown 和 chgrp)

[3.3 umask](#3.3 umask)

[4. 粘滞位](#4. 粘滞位)


1. 权限的概念

Linux下有两种用户:

超级用户(root): 可以在linux系统下做任何事,不受限制;命令行提示符是 "#"

普通用户: 在Linux下做有限 的事;命令行提示符是 "$"

相关命令:

增加普通用户:adduser 用户名

设置密码(不显现):passwd 用户名

删除用户:userdel -r 用户名

只有拥有root用户权限,才能编辑普通用户;增加的用户家目录文件位于:/home/用户名/

查看当前登录用户:whoami

查看当前在线的所有用户:who

切换用户:su 【用户名】

(root用户切换到任何用户,不需要密码;普通用户切换到其它用户(包括自己),需要输入其它对应用户的密码)

或者 su - 以root身份重新登录

配置普通用户的root权限:

vim /etc/sudoers

bash 复制代码
# 添加
用户名     ALL=(ALL)       ALL

保存退出【命令模式(shift+;):wq!】

接着就可以root身份执行命令(第一次 和 一定的时间段要验证普通用户的密码 ):比如:sudo ls

2. 权限管理

2.1 文件访问者的分类

文件和目录的所有者:u --- User

文件和目录的所有者所在的组的用户:g--- Group

其它用户:o --- Others

2.2 文件类型和访问权限(事物属性)

示例:

如下说明:

2.2.1 文件类型

d:文件夹

-:普通文件

l:软链接(类似快捷方式)语法:ln -s src(源路径) dec(指向路径)

b:块设备文件:

【 块设备文件用于与硬盘、光驱、U 盘等设备进行交互 ,它们通常位于 /dev 目录下,如 /dev/vda或sda/dev/vda1或sda1 等; 块设备文件允许用户和程序以块为单位读取或写入数据,是直接访问物理设备的接口

比如:使用**lsblk** 命令可以查看系统中已连接的块设备:

表示我的系统中块设备的情况如下:

  • sr0 是一个大小为 223.6MB 的光盘驱动器的设备文件:可用于读取光盘数据 ,比如音频 CD、数据 CD/DVD 或者 ISO 镜像文件;或者挂载光盘 到文件系统,方便访问和管理光盘中的文件;或者**制作镜像,**将光盘内容制作成 ISO 文件,便于存档和分享。
  • vda 是一个 40GB 的虚拟磁盘。
    • vda1vda 上的一个 40GB 分区,并已挂载到根目录 /;然后就可以在上面创建使用文件了.

或者使用 df -h 显示 当前的文件系统使用情况。

并且 :块设备允许在任意位置读取或写入数据**(随机读取),而不是像字符设备那样只能顺序访问。这样可以直接定位到设备的任意偏移位置进行读写操作**,因此非常适合存储设备的操作需求,比如硬盘和 SSD。

测试:sudo dd if=/dev/vda of=output.bin bs=512 count=1 skip=1000

说明:

  • dd:是一个用于低级别数据复制的命令。
  • if=/dev/vda:指定输入文件(input file),这里是整个虚拟磁盘设备 vda
  • of=output.bin:指定输出文件(output file),这里是要创建的文件 output.bin
  • bs=512:设置块大小为 512 字节,表示每次读取和写入 512 字节。
  • count=1:表示读取 1 个块(即 512 字节)。
  • skip=1000:跳过输入文件的前 1000 个块(blocks),从第 1001 个块开始读取。

示例 输出:

可以使用 xxd output.bin 命令将其以十六进制格式输出:

小编当前的输出示例:

(可以看到:小编此次示例读取的数据可能恰好在一个未使用的空间,或者这部分空间没有写入过任何数据,所以都是0)

也可以使用hexdump -C output.bin 命令更简洁显示:

此外,还可以添加新的虚拟磁盘(类似于为计算机购买加装新的硬盘) 或者 在现有的磁盘上划分新的分区(类似于硬盘分区 C / D / E 卷盘)。

下面,小编新建虚拟机做简单演示(centos7镜像;在创建阶段已经做了简单的手动分区):

步骤一lsblk查看当前的磁盘分区和剩余空间

磁盘剩余 16G 未被使用。

假设现在要用剩下的空间,为超级用户root 和 普通用户nxf 各自专门划分一块区域(假设每人8G),实现:系统文件和用户某些个人数据(私有)在磁盘区级划分上的隔离管理。

步骤二使用剩余空间划分新的分区

cpp 复制代码
sudo fdisk /dev/sda

fdisk 命令中执行以下操作:

  • 输入 n 创建一个新分区。
  • 选择 p(主分区,大小创建时确定,不可更改)或 e(扩展分区,允许创建多个逻辑分区并可按需调整和扩展,比如上面的 /dev/sda2的dm-0,dm-1)。选择e
  • 输入分区号(如 3,4等;默认sda*的下一个)。输入3
  • 设置起始扇区(直接按回车使用默认)。
  • 设置结束扇区(直接按回车使用所有剩余空间,或指定大小,例如 +10G)。

成功:Partition 3 of type Extended and size of 16 GiB is set

完成后输入 w 保存更改并退出。

步骤三:创建逻辑分区

再次进入fdisk:输入n 创建逻辑分区;选择逻辑分区类型(通常会自动识别为 l);设置起始扇区(回车默认);设置结束扇区(+8G)【逻辑分区从5开始】

看到输出:Partition 5/6 type Linux and of sze 8 GiB is Set

使用命令 sudo partprobe 重新加载分区表

注意:lsblk显示这样:

这种显示方式可能会让人觉得3/5/6它们是同级的,但实际上,逻辑分区是嵌套在扩展分区内的。这种显示方式是因为工具在展示分区信息时,主要是按分区号顺序排列,而不是按层级关系;可以使用 fdisk -l 查看详细信息:

步骤四:格式化文件分区

cpp 复制代码
sudo mkfs.ext4 /dev/vda5  # 对于第一个逻辑分区
sudo mkfs.ext4 /dev/vda6  # 对于第二个逻辑分区

在选择文件系统时,常见的选项包括:

  1. ext4

    • 优点:稳定性高,性能良好,支持大文件和大容量分区,广泛使用于 Linux 系统。
    • 适用情况:适合大多数用途,包括一般的文件存储和服务器应用。
  2. xfs

    • 优点:高性能,特别适合处理大文件和高并发操作,支持动态扩展。
    • 适用情况:适合需要高性能的应用,如数据库和大数据存储。
  3. btrfs

    • 优点:支持快照、压缩和多种高级功能。
    • 适用情况:适合需要先进特性的环境,但相对较新,可能不如 ext4 和 xfs 稳定。

推荐:

  • 对于一般用途 ,推荐使用 ext4,因为它简单易用,兼容性好。
  • 如果你有特定的性能需求 ,可以考虑使用 xfs

步骤五:创建挂载点 并 进行挂载

cpp 复制代码
sudo mkdir /root/private
sudo mkdir /home/nxf/private

//挂载
sudo mount /dev/sda5 /root/private
sudo mount /dev/sd6 /home/nxf/private

//修改目录权限
sudo chown nxf:nxf /home/nxf/private

步骤六:持久化挂载

在系统重启(sudo reboot)后依然有效,需要编辑 /etc/fstab 文件:

sudo vim /etc/fstab

末尾添加:

/dev/sda5 /root/private defaults 0 0

/dev/sda6 /home/nxf/private defaults 0 0

保存退出。

至此,就实现了系统文件和用户私有数据的分区(分盘)管理!

以后,如果需要解除挂载,可使用 umount 命令 (数据依旧存在,除非格式化);或者调整分区的大小,使用 resize2fs 调整文件系统(e2fsck -f检查修复文件系统)(适用于 ext 文件系统);更新挂载信息......

但是,在实际生产环境中,业务服务器的分区通常会在部署之初就规划好,典型的做法是根据工作负载及预估的增长进行合理分区,并留出一些未分配的空间以备未来扩展。

**如果需要大规模调整或新增分区,通常会选择添加新的磁盘而不是直接调整现有的分区结构。**这样做的好处是:

  1. 数据安全性
  • 降低风险:调整现有分区可能导致数据丢失或损坏,尤其是在操作不当或出现故障时。添加新磁盘可以避免影响现有数据。
  1. 系统稳定性
  • 减少停机时间:在现有分区上进行调整可能需要卸载、重启等操作,这会导致服务中断。添加新磁盘通常不会影响正在运行的服务。
  1. 灵活性
  • 便于扩展:添加新磁盘可以根据需求动态扩展存储,而无需改变现有的分区结构。这种灵活性使得系统能够适应不断变化的业务需求。
  1. 更好的性能
  • 分散负载:新磁盘可以分散读写负载,从而提高整体性能。将不同的应用程序或数据存储在不同的磁盘上可以提高 I/O 性能。
  1. 简化管理
  • 避免复杂性:调整分区可能会增加管理复杂性,特别是在多分区环境中。添加新磁盘使得管理更为简单,特别是当业务需求发生变化时,可以简单地添加新的存储设备。
  1. 便于备份与恢复
  • 简化备份策略:独立的磁盘可以专门用于备份数据,便于实施差异化备份、快照等策略,减少恢复时间。
  1. 便于监控和维护
  • 独立监控:新磁盘可以单独监控,便于追踪性能问题或故障,有助于及早识别潜在风险。
  1. 硬件兼容性
  • 适应性强:有时新技术的硬件(如 NVMe、SSD 等)可以提升性能,而不需要修改现有的分区结构

......

p:管道(pipe)文件

【允许将一个命令(进程)的输出直接传递作为另一个命令(进程)的输入(单向)。

通过管道,可以将多个命令组合在一起,以实现复杂的数据处理;通过使用"|"符号实现

**示例1:**cat /etc/passwd | cut -d: -f1 | sort | uniq

这个命令将 /etc/passwd 文件的内容输出的每一行中提取以冒号为分隔符的第一个字段,提取用户名,然后排序(默认升序;-r降序)并去重。

示例二:

创建管道文件:mkfifo mypipe

在终端1运行:cat > mypipe

在终端2运行:cat mypipe

此时,在终端1的输入内容会输出到终端2(终止:ctrl + c)

管道文件在linux中的作用有:

  • 进程间通信 :(先简单理解成 不同的运行程序记之间)
    • 管道文件允许不同进程之间进行数据交换,提供一种简单的方式来传递信息。
  • 缓冲机制
    • 管道文件在读写之间提供了缓冲,数据写入管道后,如果没有进程读取,它会在管道中保持,直到被读取或达到限制。
  • 同步机制
    • 使用管道时,如果写入端没有数据被读取,写入操作会被阻塞,从而实现了一种基本的同步机制。

c:字符设备文件

例如:键盘,鼠标,串口等,用于表示与硬件设备的交互 ,它们是通过文件系统提供的接口访问设备的关键;通过字符设备文件,用户和应用程序能够方便地与各种硬件进行通信和控制

这类文件主要分布在 /dev/ 目录下

串口(Serial Port) 是计算机上一种用于数据传输的接口,允许数据按位(bit)进行逐位传输。广泛用于设备之间的通信,尤其是在早期计算机和外围设备(如鼠标、调制解调器、打印机等)之间。虽然串口在个人电脑上逐渐被USB等接口替代,但它在嵌入式系统、工业控制和一些通信设备中依然被广泛使用。

在Linux系统中,串口设备通常表示为 /dev/ttyS*(物理串口)和 /dev/ttyUSB*(USB转串口设备)。

总结一下 字符设备 的特性:

  • 数据流

    • 字符设备以字节为单位进行读写,数据是以流的形式传输的。
  • 不支持随机访问

    • 字符设备只能顺序访问,不支持随机访问。
  • 无缓冲

    • 字符设备通常是无缓冲的,每次读写操作直接与设备交互。

s:套接字文件

在Linux中,套接字(Socket)文件是一种用于网络通信的特殊文件类型,允许程序(进程)之间通过网络接口进行数据传输。

它在操作系统中提供了一种标准化的通信方式(API),用于管理和实现网络连接。

2.2.2 file指令

功能:识别文件类型

格式:file [选项] 文件/目录

常用选项:-C 详细显示指令执行过程,便于排错或分析程序执行的情形。

-z 尝试去解读压缩文件的内容。

2.2.3 基本权限

r(Read): 对文件而言,具有读取文件内容的权限;对目录而言,具有浏览该目录下文件信息的权限

w(Write) :对文件而言,具有修改文件内容的权限;对目录而言,具有 增加/删除/移动 目录文件的权限

**x(Execute):**对文件而言,具有执行文件的权限(如果要像程序一样可运行,还要保证其是可执行的二进制机器语言);对目录而言,具有进入目录的权限

现在就可以解释一 为什么会存在所属组这个概念:

在Linux中,所属组是为了实现更灵活和安全的权限管理而设计的,它为文件和资源的访问控制提供了一个中间层次。通过将用户归类到不同组,并为文件分配组权限,Linux可以简化权限管理、而不是为每个用户单独设置权限,便于团队协作,并提高系统安全性。

所属组的概念支持多用户系统的资源共享,使得团队成员能轻松共享资源,同时确保敏感数据的访问权限得到有效控制。

举个例子:某游戏公司决定做一款moba游戏,但是在具体玩法,盈利方式等 存在较大分歧,大致分为两大阵营,于是领导决定 分为A/B两组,同时独立制作,最后根据市场测试反馈 决定重点扶持哪组的游戏上线运营。但是公司的资源配置有限,两组必须使用同一服务器资源:此时组内成员就需要数据共享,组外成员无法获取数据;如果领导需要检查工作进度,此时领导的身份就是 Others, 如果不存在组的划分,A/B两组就只能允许 其它用户的读权限,但A和B两组 也是相对的Others,此时也能看到相互的数据;所以,好的办法就是把领导加到各自的组中,确保 数据只在组内可见。

3. 文件访问权限的相关设置方法

3.1 chmod

格式:chmod [参数]权限文件/目录名

常用选项:R 递归修改目录下所有文件的权限

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

命令权限值的格式:

**方式1:**用户标识符+/- 权限字符(r/w/x)

+:增加

-:取消

用户标识符:u(拥有者) g(所属组) o(其它用户) a(所有用户)

示例:chmod g-w,o+w text

chmod a+x text

**方式2:**三位8进制数字

比如:- rw- rw- r-- 每一个权限位对应一个二进制比特位------> - 110 110 100 转化成十进制就是:664

所以,640 就是 rw-r-----;775 就是 rwxrwxr-x;......

3.2 chown 和 chgrp

改变文件的拥有者和所属组:chown [-R] 拥有者:所属组 文件/目录名

只改变所属组:chown [-R] :所属组 文件/目录名

或者 chgrp [-R] 所属组 文件/目录名

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

3.3 umask

查看或修改 权限掩码

新建普通文件的默认权限:666;目录默认权限;777

但是,实际上我们看到的并不是这样的,一般普通用户的umask==002,那么新建的普通文件/目录的默认权限是:664 / 775,即去掉 002(000 000 010) 出现的权限;计算(八进制)也可以当成 默认权限(666 / 777)- umask

示例:umask 077 表示只有拥有者可以编辑

4. 粘滞位

当一个目录被设置为 ''粘滞位" 【chmod 用户+t】,则该目录下的文件/目录只能由:

  1. 超级管理员(root)删除

  2. 拥有者删除

比如,linux下的/tmp/ 目录常用来存储 临时数据(常见的如日志,缓存,交换文件等,系统重启后被删除),其权限通常为 rwxrwxrwt

粘滞位只能用于 Others 才能被设置成功

另外简单提一下,普通文件也可以设置粘滞位,但是其会显示成大写的 T(无实际作用,现代Linux系统对普通文件忽略粘滞位设置)

相关推荐
小林熬夜学编程1 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬2 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
sun0077002 小时前
拷贝 cp -rdp 和 cp -a
linux·运维·服务器
wowocpp2 小时前
ubuntu 22.04 server 安装 anaconda3
linux·运维·ubuntu
乡村农夫2 小时前
cuda 环境搭建
linux
tingting01193 小时前
Linux 普通用户禁用sudo su - 命令
linux·运维·服务器
WZF-Sang3 小时前
Linux—进程学习-01
linux·服务器·数据库·学习·操作系统·vim·进程
dessler3 小时前
Linux系统-rocky系统安装
linux·运维·后端
写代码的学渣3 小时前
Linux云计算个人学习总结(一)
linux·运维·云计算
别NULL3 小时前
《现代网络技术》读书笔记:SDN数据平面和OpenFlow
linux·网络·平面·sdn