首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux基本权限详解

Linux基本权限详解

作者头像
Nullmian
发布2025-12-24 15:09:56
发布2025-12-24 15:09:56
1920
举报

Shell命令及运行原理详解

一、Shell的本质与作用

1. 操作系统层次结构
代码语言:javascript
复制
用户层 → Shell外壳(bash命令行) → Linux内核(kernel) → 硬件层

Shell作为用户与内核的桥梁,负责接收用户指令并转换为内核能够理解的操作。



2. 为什么不能直接使用kernel?
  • 技术复杂性:内核管理着CPU、内存、设备驱动等底层资源,直接操作需要深厚的系统编程知识
  • 安全性考虑:防止用户误操作导致系统崩溃或数据丢失
  • 易用性需求:提供更友好的交互方式,降低使用门槛


3. Shell的核心功能
  • 命令解释:将用户输入的字符串(如 ls -l)转换为系统调用
  • 环境管理:维护工作目录(PWD)、环境变量环境变量(PATH)等上下文信息
  • 输入输出重定向:管理标准输入(stdin)、输出(stdout)、错误(stderr
  • 管道连接:连接多个命令,实现流水线处理(如 ps aux | grep nginx
  • 脚本编程:支持编写Shell脚本,实现自动化任务


二、Shell工作原理解析

1.命令执行流程
代码语言:javascript
复制
# 示例命令执行过程
$ ls -l /home

执行步骤:
1. 用户输入命令字符串 "ls -l /home"
2. Bash读取输入并解析(识别命令、参数、选项)
3. 在系统路径中查找可执行程序(/bin/ls)
4. 创建子进程(通过fork系统调用)
5. 在子进程中执行程序(通过exec系统调用)
6. 内核加载并运行程序
7. 程序执行结果返回给Shell
8. Shell将结果输出到终端

2.路径查找机制
代码语言:javascript
复制
# 环境变量PATH决定了Shell查找命令的位置
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# 查找顺序:按PATH中的目录顺序搜索第一个匹配的可执行文件

# 手动查找命令位置
$ which ls
/bin/ls

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz


三、深入理解指令运行原理

1. 指令的本质
  • 系统程序:如lscp等,编译好的二进制可执行文件
  • Shell内置命令:如cdecho等,由Shell直接实现
  • 脚本程序:如Python、Bash脚本,需要解释器执行

2. 命令类型识别
代码语言:javascript
复制
# 查看命令类型
$ type ls
ls 是 /bin/ls

$ type cd
cd 是 shell 内嵌

# 内置命令示例
$ type echo
echo 是 shell 内嵌

$ type pwd
pwd 是 shell 内嵌

3. 进程创建与执行
代码语言:javascript
复制
# Shell执行外部命令时的系统调用序列
1. fork()    # 创建子进程
2. exec()    # 加载并执行程序
3. wait()    # 等待子进程结束(前台命令)


四、相亲比喻

1.更准确的技术对应关系
代码语言:javascript
复制
你(用户) → 下达命令的程序员
王婆(Shell) → 命令行解释器(bash/zsh等)
相亲规则(Shell语法) → 命令语法和规则
你的要求(命令) → 具体的指令字符串
小花(Kernel) → Linux操作系统内核
相亲结果(反馈) → 命令执行结果
提亲流程(通信) → 系统调用接口

2.完整交互流程比喻
  1. 表达意图:你告诉王婆"我想见如花" → 用户输入ls -l
  2. 规则验证:王婆检查是否符合礼仪 → Shell检查命令语法
  3. 传递请求:王婆联系如花家人 → Shell通过系统调用联系内核
  4. 内核处理:如花家评估请求 → 内核执行相应操作
  5. 结果反馈:如花家回复王婆 → 内核返回执行结果
  6. 最终传达:王婆转达结果给你 → Shell显示输出信息

[用户名@主机名 当前目录]命令行提示符[user@hostname dir]$ → bash 命令行 → 媒婆的样子 shell(命令行解释器)、GUI(图形化界面):可以看成不同风格的媒婆,其核心功能都是一样的



五、实际应用示例

1. 命令执行过程追踪
代码语言:javascript
复制
# 使用strace跟踪命令执行过程
$ strace -f -e trace=process bash -c 'ls /home'

# 使用ltrace跟踪库函数调用
$ ltrace ls /home

# 查看系统调用统计
$ strace -c ls /home

2. Shell内部工作机制
代码语言:javascript
复制
# 查看Shell进程信息
$ echo $$
1234                 # 当前Shell的PID

# 查看子进程执行
$ ls /home &         # 后台执行
$ jobs               # 查看后台作业
[1]+  运行中               ls /home &

# 查看进程树
$ pstree -p $$
bash(1234)───ls(5678)




Linux权限的概念

一、Linux权限管理体系

1. 用户类型对比

用户类型

命令提示符

权限范围

UID

超级用户(root)

#

基本无权限约束,可执行大都操作

0

普通用户

$

权限受限,只能操作授权资源

≥1000



2. 用户切换命令详解
su - 切换用户身份
代码语言:javascript
复制
su [选项] [用户名]
  • 选项
    • --l:完全切换,加载目标用户的环境变量
    • -c:以目标用户身份执行单个命令
代码语言:javascript
复制
# 从user切换到root (需要密码)
$ su - root
密码:******
# 


# 从root切换到user (无需密码)
# su - username
$


# 从user1切换到user2 (需要密码)
$ su - user2
密码:******
$

返回原用户

  • 命令行输入exit
  • 热键 Ctrl + D

sudo - 以超级用户权限执行命令
代码语言:javascript
复制
# 使用sudo临时获取root权限 (需要配置 --- 将user添加到系统白名单/etc/sudoers)
$ sudo command
密码:****** (user自己的)
#


# 查看当前用户信息
$ whoami
$ id

重要提示

  • Linux中所有用户都需要设置密码,包括root用户
  • root账号的密码尽量不要与普通用户账号相同



二、权限的基本概念

1. 什么是权限?

权限决定了一个操作是否允许被执行,包含两个关键要素:

  1. 身份认证:权限与用户身份相关 - 人 + 身份
  2. 资源属性:权限也与事物的属性有关 - 文件是否可读?可写?可执行?


2.文件类型和访问权限(事物属性)
在这里插入图片描述
在这里插入图片描述

文件类型

d文件夹

-普通文件(Linux中,文本、可执行程序、库基本都属于普通文件)

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如:硬盘、光驱等)

p:管道文件(用于不同设备之间的通信)

c:字符设备文件(例如:键盘、显示器、串口设备)

s:套接口文件

注意

  • 与Windows不同,Linux中文件名后缀没有直接的系统意义。
  • 但这不代表Linux上运行的软件不需要后缀。

Linux中文件后缀的处理原则:根据用户需求和应用程序要求而定。


基本权限类型(文件属性)
  • 读权限(r/4)
    • 对文件:具有读取文件内容的权限
    • 对目录:具有浏览目录内容的权限
  • 写权限(w/2)
    • 对文件:具有修改文件内容的权限
    • 对目录:具有在目录内创建、删除、移动文件的权限
  • 执行权限(x/1)
    • 对文件:具有执行文件的权限
    • 对目录:具有进入目录的权限
  • 无权限(-):不具有该项权限


三、文件权限值的表示方法

重要区分

  • 用户类型:具体的用户个体(如:root、user1、user2)
  • 权限身份:用户在访问文件时扮演的角色
三种权限身份:
  1. 拥有者(Owner/u):文件或目录的所有者
  2. 所属组(Group/g):文件或目录所属的用户组
  3. 其他人(Others/o):既不是所有者,也不在所属组中的用户

身份关联关系:
  • 每个用户访问文件时,系统会按以下顺序确定其权限身份:
    1. 判断是否为文件的拥有者 → 是则应用拥有者权限
    2. 判断是否在文件的所属组中 → 是则应用所属组权限
    3. 以上都不是 → 应用其他人权限

所属组的意义:内部成员自己人,方便团队协作时权限管理。


1. 字符表示法
代码语言:javascript
复制
rwxr-xr--

权限分组说明:

  • 前3位:文件所有者权限(u)
  • 中3位:所属组权限(g)
  • 后3位:其他用户权限(o)

字符含义:

  • r = 读权限
  • w = 写权限
  • x = 执行权限
  • - = 无权限

2. 八进制数值表示法
代码语言:javascript
复制
二进制枚举 每三个二进制位为一组
则可以看成一个八进制位
111 110 100 -> rwxrw-r-- -> 764


755 → rwxr-xr-x
644 → rw-r--r--

数值计算原理:

  • 读权限(r) = 4
  • 写权限(w) = 2
  • 执行权限(x) = 1

无权限(-) = 0

权限计算示例:

代码语言:javascript
复制
# 拥有者权限:rwx = 4+2+1 = 7
# 所属组权限:r-x = 4+0+1 = 5
# 其他人权限:r-x = 4+0+1 = 5
# 总权限:755

# 拥有者权限:rw- = 4+2+0 = 6
# 所属组权限:r-- = 4+0+0 = 4
# 其他人权限:r-- = 4+0+0 = 4
# 总权限:644

常用权限组合:

代码语言:javascript
复制
777 → rwxrwxrwx    # 所有用户都有完全权限(危险,不推荐)
755 → rwxr-xr-x    # 拥有者完全权限,其他人只读执行(常用)
644 → rw-r--r--    # 拥有者可读写,其他人只读(配置文件常用)
700 → rwx------    # 只有拥有者有完全权限(私密文件)

注意

  • 没有相应权限时访问会被拒绝,系统会显示"Permission denied"错误
  • root不受规则约束 — 制定规则的人不受规则约束


四、权限的相关设置方法

1. 文件访问权设置命令

谁能更改文件的访问权限

  • 文件所有者
  • root用户
chmod - 修改文件访问权限
代码语言:javascript
复制
chmod [对象][操作符][权限] 文件名
  • 常用选项
    • -R:递归修改目录文件的权限
  • 对象
    • u:拥有者
    • g:所属组
    • o:其他人
    • a:所有用户
  • 操作符
    • +:添加权限
    • -:移除权限
    • =:设置精确权限
代码语言:javascript
复制
# 字符模式示例
chmod u+x file.txt      # 给拥有者添加执行权限
chmod g-w file.txt      # 移除所属组的写权限
chmod o=r file.txt      # 设置其他人只有读权限
chmod a+x file.txt      # 给所有用户添加执行权限

# 八进制模式示例
chmod 755 script.sh     # rwxr-xr-x
chmod 644 config.conf   # rw-r--r--
chmod 700 private.txt   # rwx------

# 对象说明:
# u:拥有者 | g:所属组 | o:其他人 | a:所有用户
# 操作符说明:
# +:添加权限 | -:移除权限 | =:设置精确权限

2. 文件所有全设置命令

所有权转移规则

  • 普通用户之间要经过另一方同意
  • root用户无需经过另一方同意

这是Linux安全模型的基础,防止权限随意扩散


chown - 修改文件拥有者
代码语言:javascript
复制
chown [选项] 用户名:组名 文件名
  • 常用选项
    • -R 递归修改文件或目录的拥有者
代码语言:javascript
复制
# 修改文件拥有者
chown user1 file.txt

# 修改文件拥有者和所属组
chown user1:group1 file.txt

# 一次性更改拥有者和所属组
chown user:group filename.txt
chown -R user:group directory/    # 递归修改目录及其所有内容

chgrp - 修改文件所属组
代码语言:javascript
复制
chgrp [选项] 组名 文件名
  • 常用选项
    • -R 递归修改文件或目录的拥有者
代码语言:javascript
复制
chgrp developers file.txt
chgrp -R developers project/

注意事项

  • 修改文件拥有者通常需要 root 权限,所以经常需要配合 sudo
  • 使用 -R 选项时要特别小心,确保不会误改大量文件权限
  • 普通用户只能修改自己文件的所属组到他们所在的组


权限认证的身份选择机制
问题场景分析
代码语言:javascript
复制
# 文件权限设置
-r--rw---- 1 user1 groupA filename.txt
# 权限分解:
# user(拥有者): r-- (只读)
# group(所属组): rw- (读写)
# other(其他人): --- (无权限)

# 当前用户情况
$ whoami
user1
$ groups user1
user1 : user1 groupA groupB
# user1 既是文件的拥有者,又在所属组 groupA 中:试问他能执行写权限吗?

权限认证流程

核心规则:在进行权限认证时,系统按固定顺序检查,最终只能选择一个最优先匹配的身份

认证顺序

  1. 首先检查是否为文件拥有者 (Owner)
  • 如果是 → 应用拥有者权限,认证结束
  • 如果不是 → 继续下一步
  1. 然后检查是否在文件所属组中 (Group)
  • 如果是 → 应用所属组权限,认证结束
  • 如果不是 → 继续下一步
  1. 最后应用其他人权限 (Other)

案例分析

代码语言:javascript
复制
# 文件权限: -r--rw----
# 用户身份: user1 (既是拥有者,又在groupA中)

# 认证过程:
# 1. 检查是否为拥有者? → 是!user1就是拥有者
# 2. 立即应用拥有者权限:r-- (只读)
# 3. 认证结束,不再检查所属组权限

# 结果:user1 只能读,不能写这个文件

验证实验
代码语言:javascript
复制
# 创建测试环境
$ whoami
user1

# 创建文件并设置权限
$ touch test.txt
$ chmod 460 test.txt    # -r--rw----
$ ls -l test.txt
-r--rw---- 1 user1 groupA 0 Oct 15 10:00 test.txt

# 验证用户所在组
$ groups
user1 groupA groupB

# 尝试写入(会失败)
$ echo "test" >> test.txt
-bash: test.txt: Permission denied

# 即使user1在groupA中,但因为它是拥有者,只能使用拥有者权限(r--)


umask - 查看或修改文件掩码
代码语言:javascript
复制
umask [权限值]

为什么我们创建文件的默认权限是我们所看到的样子

  • 普通文件权限默认:664 (rw-rw-r–)
  • 目录文件权限默认:775 (rwxrwxr-x)

原理

  • 起始权限:
    • 普通文件默认:666
    • 目录文件默认:777
  • 权限掩码 umask:凡是在umask中出现的权限,不会在最终文件权限中出现
  • 最终权限 = 起始权限 & (~umask)
代码语言:javascript
复制
umask          # 查看当前umask
umask 022      # 设置umask为022
umask 077      # 设置更严格的umask

# 计算示例(umask=022):
# 文件:666 & ~022 = 666 & 755 = 644 (rw-r--r--)
# 目录:777 & ~022 = 777 & 755 = 755 (rwxr-xr-x)


目录权限的特殊性

目录文件的rwx具体含义

  • r:是否允许查看该目录文件中的内容(ls命令)
  • w:是否允许在该目录文件中创建、更改、删除文件
  • x:是否允许进入该目录文件(cd命令)

重要特性:一个文件能否被删除,并不由文件本身决定,而由这个文件所处目录的w权限决定。

创建一个新用户:就是在家目录下创建了一个只有user才有rwx权限的目录文件



黏滞位 (Sticky Bit)

问题场景:共享目录下他人即使没有任何权限也能删除别人的文件?

共享目录:由root创建于用户家目录以外的文件夹

解决方案:黏滞位

代码语言:javascript
复制
# 设置黏滞位
chmod +t shared_directory/
ls -ld shared_directory/
drwxrwxrwt  # t表示设置了黏滞位

黏滞位的作用

  • 给目录设置,一般是共享目录
  • 大家可以在目录中对各自的文件进行增删查改
  • 只允许文件拥有者或者root删除该文件,其他人一概不允许



总结

Shell作为用户与操作系统内核之间的桥梁,通过以下机制实现高效交互:

  1. 解释器功能:解析用户输入,转换为系统可理解的指令
  2. 进程管理:通过fork-exec机制创建和管理命令执行环境
  3. 权限控制:基于用户身份实施访问控制策略
  4. 资源管理:协调输入输出、内存、CPU等系统资源

Linux权限系统通过用户身份认证和文件属性控制,实现了精细的访问控制:

  • 用户分级:root用户与普通用户的权限分离
  • 文件权限:读、写、执行权限的三重控制
  • 权限管理:通过chmod、chown等工具灵活配置
  • 特殊机制:黏滞位解决共享目录安全问题

核心要点

  • root用户是规则的制定者,不受普通权限规则约束
  • 权限认证时,每个用户只能选择一个身份(拥有者/所属组/其他人)
  • 文件删除权限由所在目录的写权限决定,而非文件本身
  • umask机制控制新建文件的默认权限

这种分层设计既保证了操作系统的安全稳定,又为用户提供了相对简单易用的操作界面,是Unix/Linux系统哲学的重要体现。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell命令及运行原理详解
    • 一、Shell的本质与作用
      • 1. 操作系统层次结构
      • 2. 为什么不能直接使用kernel?
      • 3. Shell的核心功能
    • 二、Shell工作原理解析
      • 1.命令执行流程
      • 2.路径查找机制
    • 三、深入理解指令运行原理
      • 1. 指令的本质
      • 2. 命令类型识别
      • 3. 进程创建与执行
    • 四、相亲比喻
      • 1.更准确的技术对应关系
      • 2.完整交互流程比喻
    • 五、实际应用示例
      • 1. 命令执行过程追踪
      • 2. Shell内部工作机制
  • Linux权限的概念
    • 一、Linux权限管理体系
      • 1. 用户类型对比
      • 2. 用户切换命令详解
    • 二、权限的基本概念
      • 1. 什么是权限?
      • 2.文件类型和访问权限(事物属性)
    • 三、文件权限值的表示方法
    • 四、权限的相关设置方法
      • 1. 文件访问权设置命令
      • 2. 文件所有全设置命令
      • 权限认证的身份选择机制
      • umask - 查看或修改文件掩码
      • 目录权限的特殊性
      • 黏滞位 (Sticky Bit)
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档