前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >权力与优雅:Linux 权限的隐秘诗篇

权力与优雅:Linux 权限的隐秘诗篇

作者头像
HZzzzzLu
发布2024-12-26 09:09:22
发布2024-12-26 09:09:22
12300
代码可运行
举报
文章被收录于专栏:codingcoding
运行总次数:0
代码可运行

Shell

Linux 是一种开源的、基于 Unix 的操作系统,它因其灵活性、稳定性和高性能而广泛应用于服务器、嵌入式系统、超级计算机、桌面计算等领域。

Linux内核(Linux Kernel)是操作系统的核心,负责与硬件直接交互,为用户空间(应用程序和服务)提供资源管理和系统服务的接口。

Linux内核(Linux Kernel)的主要职责:

  • 硬件抽象:将底层硬件资源(如 CPU、内存、硬盘等)抽象成更易于使用的接口。
  • 资源管理:负责分配和管理 CPU 时间、内存空间、文件系统和其他资源。
  • 系统调用接口:提供一组 API,供用户程序通过系统调用访问硬件或操作系统功能。
  • 设备驱动:管理各种硬件设备(如键盘、显示器、网络卡等)。

一般来说,我们用户是没有办法直接跟Linux内核(Linux Kernel)交互的,而是通过 Shell 来间接与Linux内核(Linux Kernel)交互的。

Shell 是用户与内核之间的交互界面,是一种命令解释器(外壳程序)。它将用户输入的命令翻译为内核可以理解的系统调用,进而控制操作系统的行为。

主要作用:

  • 命令解析:解释并执行用户输入的命令(如文件操作、程序运行等)。
  • 脚本支持:可以运行编写好的 Shell 脚本,实现任务自动化。
  • 提供用户环境:允许用户执行程序、管理文件和配置系统。

类比于 Windows 操作系统,Windows GUI 就是相当于 Linux 中的 Shell ,我们操作 Windows 并不是直接操作其内核,而是通过图形接口来完成各种操作。

用户权限

Linux 系统中,root 用户普通用户是两类不同权限级别的用户,分别承担着系统管理和普通操作的角色。

  • root用户Linux 系统中的超级管理员,拥有系统中所有资源的最高权限,可以执行任何操作。
  • 普通用户:系统中权限受限的用户,主要用于日常操作。

root 用户的命令提示符是 “#” ,普通用户的命令提示符是 “$”

切换用户

  1. 从普通用户切换到 root 用户:
  • 使用 su 命令:
代码语言:javascript
代码运行次数:0
复制
su

输入 root 密码后切换。

注意,这里的切换直接是从当前目录切换到普通用户。

可以看到,root 用户时的目录是 LinuxCode ,而切换到普通用户后目录依然是 LinuxCode

  1. root 用户切换到普通用户:
  • 退出 root 用户:
代码语言:javascript
代码运行次数:0
复制
exit
  • 指定切换到某个普通用户:
代码语言:javascript
代码运行次数:0
复制
su username
  1. su - 指令

su - 指令在切换用户时就相当于重新登录,不会在原有的目录下切换。

  • root 用户的默认目录:
代码语言:javascript
代码运行次数:0
复制
/root
  • 普通用户的默认目录:
代码语言:javascript
代码运行次数:0
复制
/home/username

sudo

普通用户的权限是比较小的,可以执行的操作也较少,但有的时候是需要普通用户执行越权操作的,这个时候就要使用到 sudo 指令。

sudoSuperuser DO)是 LinuxUnix 系统中用于以 root 用户或其他特权用户身份执行命令的工具。它允许普通用户在不直接登录 root 用户的情况下临时提升权限,从而减少误操作的风险并提高系统安全性。

正常来说,普通用户想要使用 sudo 还需要将该普通用户加入到白名单中,具体的配置文件在 /etc/sudoers ,我们可以用 vim 打开然后将普通用户加入白名单。

代码语言:javascript
代码运行次数:0
复制
vim /etc/sudoers

(演示环境为 Ubuntu 20.04.6)

使用示例:

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

系统会提示输入当前用户的密码(而不是 root 用户的密码),然后以 root 权限执行命令。

文件与目录权限

访问者

Linux 中的每个文件和目录的访问者主要由以下三部分组成:

  1. 用户(Owner):文件或目录的拥有者。
  2. 用户组(Group):一组用户,可以共享文件或目录的权限。
  3. 其他人(Others):除了文件拥有者和用户组之外的其他用户。

权限表示

Linux 使用 rwx 模式表示权限:

  1. rread:读取权限。
    • 对文件:可以查看内容。
    • 对目录:可以列出目录内容。
  2. wwrite:写入权限。
    • 对文件:可以修改内容。
    • 对目录:可以创建、删除或重命名目录内的文件。
  3. xexecute:执行权限。
    • 对文件:可以作为程序运行。
    • 对目录:可以进入该目录。

每个文件的权限用 10 个字符表示,例如:

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

第一个字符文件类型

  • - 表示普通文件
  • d 表示目录
  • l 表示符号链接
  • b 表示块设备文件(例如硬盘、光驱等)
  • p 表示管道文件
  • c 表示字符设备文件(例如屏幕等串口设备)
  • s 表示套接口文件

接下来的 9 个字符:分为三组(用户、用户组、其他人)。

  • 用户(Owner):rwx 表示可读、可写、可执行
  • 用户组(Group):r-x 表示可读、不可写、可执行
  • 其他人(Others):r-- 表示可读、不可写、不可执行

文件的权限还可以使用八进制二进制表示:

权限

八进制

二进制

rwx

7

111

rw-

6

110

r-w

5

101

r–

4

100

-wr

3

011

-w-

2

010

–x

1

001

0

000

使用 ls -l (ll) 指令来查看文件和目录的权限:

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

输出示例:

代码语言:javascript
代码运行次数:0
复制
-rw-r--r--  1 user group  1234 Dec  1 10:00 file.txt
  • -rw-r--r--:权限位。
  • user:文件拥有者。
  • group:文件所属的用户组。

修改权限

  1. chmod 命令:用于修改文件或目录的权限。
  • 符号模式:
代码语言:javascript
代码运行次数:0
复制
chmod u+x file.txt  # 给拥有者增加执行权限
chmod g-w file.txt  # 去掉用户组的写权限
chmod o+r file.txt  # 给其他用户增加读取权限
chmod o=r filename  # 设置其他用户的权限为只读(覆盖其他权限)
  • 数字模式(每种权限对应一个数字):
    • r = 4
    • w = 2
    • x = 1
    • 无权限 = 0
    • 权限组合:rwx = 7, rw- = 6, r-- = 4 等。
代码语言:javascript
代码运行次数:0
复制
chmod 754 file.txt  # 设置权限为 rwxr-xr--
  • -R 递归修改权限:
代码语言:javascript
代码运行次数:0
复制
//对目录及其子目录和文件修改权限
chmod -R 755 /path/to/directory
  1. chown 命令 和 chgrp:修改文件的拥有者和用户组。
代码语言:javascript
代码运行次数:0
复制
chown user file.txt         # 更改文件拥有者
chgrp group file.txt		# 更改文件用户组
chown user:group file.txt   # 更改文件拥有者和用户组
  • -R 递归修改:
代码语言:javascript
代码运行次数:0
复制
chown -R user:group /path/to/directory

umask

umaskUser File Creation Mode Mask)是一个用于设置文件和目录的默认权限的命令或配置。它定义了新创建的文件或目录的权限屏蔽位,从而控制默认权限的初始值。

  1. 文件和目录的默认权限
  • Linux 中,新创建的文件和目录的权限基于以下默认值:
    • 文件:666(可读写,无执行权限)。
    • 目录:777(可读写执行)。
    • 然而,这些默认权限会被 umask 所屏蔽,最终权限是:
代码语言:javascript
代码运行次数:0
复制
最终权限 = 默认权限 - umask
  1. umask 的表示形式

umask 的值通常有4位,但第一位的 0 表示特殊权限,不用理会,所以可将其视为3位八进制数字,每一位分别表示权限屏蔽:

  • 第一位:用户(Owner)。
  • 第二位:用户组(Group)。
  • 第三位:其他人(Others)。

屏蔽规则:

  • 4:屏蔽读取权限(r)。
  • 2:屏蔽写入权限(w)。
  • 1:屏蔽执行权限(x)。
  • 0:不屏蔽任何权限。

比如,umask 的值为 0002,表示对其他人的写入权限(w)进行屏蔽;0033表示对用户组和其他人的写入权限(w)和执行权限(x)进行屏蔽。

  1. 查看和设置 umask

查看当前 umask 值:

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

设置 umask

代码语言:javascript
代码运行次数:0
复制
umask 0xxx	//将umask码设置成0xxx

目录权限

Linux 系统中,目录权限(Directory Permissions)决定了用户对目录的访问和操作能力。目录的权限与文件的权限类似,但其具体作用略有不同,因为目录主要用于组织文件,而不是直接存储内容。

读权限(r,read)

  • 允许查看目录下的文件和子目录列表。
  • 没有执行权限时,无法进入目录,即使有读权限也无法查看目录内容。

写权限(w,write)

  • 允许在目录内进行写操作,包括:
    • 创建新文件或目录。
    • 删除或重命名文件/子目录。
  • 需要执行权限配合才能生效。

执行权限(x,execute)

  • 允许进入目录。
  • 没有读权限时,可以进入目录但无法列出内容。

粘滞位

粘滞位(Sticky Bit)是 Linux 和 Unix 系统中的一种特殊权限,主要用于目录权限管理。它确保目录内的文件只能由文件的所有者或具有管理员权限的用户删除或修改,即使目录本身的写权限对其他用户开放。

  1. 粘滞位的作用

在常规权限设置下,如果一个用户对目录有写权限,就可以删除或修改该目录中的任何文件,而不管这些文件是否属于自己。粘滞位的作用是限制这种行为,提供更精细的权限控制:

  • 只有文件的所有者、目录的所有者或超级用户(root)才能删除或修改文件。
  • 其他用户即使对目录有写权限,也不能删除或修改非自己创建的文件。
  1. 粘滞位的典型使用场景
  • 公共目录:
    • /tmp 目录,所有用户都可以在其中创建文件,但不能随意删除其他用户的文件。
    • /tmp 的权限通常设置为:
代码语言:javascript
代码运行次数:0
复制
drwxrwxrwt  # 注意最后的 t 表示启用了粘滞位
  • 协作环境:
    • 共享目录中,不同用户可以创建自己的文件,但不能影响其他用户的文件。
  1. 查看和设置粘滞位

使用 ls -ld 命令可以查看目录的权限状态:

代码语言:javascript
代码运行次数:0
复制
ls -ld directory_name

示例输出:

  • 最后一位的 t 表示该目录启用了粘滞位。
  • rwxrwxr- 是基本权限(用户、组、其他用户)。

使用 chmod 命令可以设置或移除粘滞位。

代码语言:javascript
代码运行次数:0
复制
//添加粘滞位
chmod +t directory
chmod 1775 directory	//粘滞位对应的八进制值是 1000

//移除粘滞位
chmod -t directory
chmod 0775 directory

Have a good day😏

See you next time, guys!😁✨🎞

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell
  • 用户权限
    • 切换用户
    • sudo
  • 文件与目录权限
    • 访问者
    • 权限表示
    • 修改权限
    • umask
    • 目录权限
    • 粘滞位
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档