首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux系统编程:(五)Linux Shell 命令运行原理与权限机制

Linux系统编程:(五)Linux Shell 命令运行原理与权限机制

作者头像
_OP_CHEN
发布2026-01-14 10:15:52
发布2026-01-14 10:15:52
460
举报
文章被收录于专栏:C++C++

前言

在 Linux 系统的学习和使用过程中,Shell 命令与权限管理是两大核心支柱。Shell 作为用户与内核之间的 “桥梁”,让我们能够通过简洁的命令操控系统;而权限机制则是 Linux 安全稳定运行的基石,确保资源访问的有序与可控。本文将结合实战命令示例,从原理到实践,全面拆解 Shell 命令的运行逻辑与 Linux 权限的核心概念,帮助大家彻底掌握这两大知识点。下面就让我们正式开始吧!


一、Linux Shell:内核与用户的 “沟通桥梁”

1.1 Shell 的本质与定位

Linux 严格意义上的操作系统核心是 “内核(kernel)”,它负责管理硬件资源、调度进程、控制文件系统等底层操作。但普通用户无法直接与内核交互 —— 内核如同精密的机器核心,需要一个 “外壳” 程序来接收用户指令、翻译成内核能理解的语言,再将内核的执行结果反馈给用户,这个 “外壳” 就是 Shell。

举个通俗的例子:如果内核是村里漂亮的姑娘 “小花”,你(用户)是想表白的程序员,那 Shell 就是中间的 “媒婆”。你不好意思直接跟小花沟通,所有想法都通过媒婆转达,媒婆再把小花的回应告诉你。我们日常使用的 bash(Bourne Again Shell),就是最常用的 “媒婆”。

对比 Windows 的 GUI 图形界面:我们操作 Windows 时,双击盘符进入 D 盘、点击图标打开软件,本质是通过图形接口间接操作 Windows 内核;而 Linux 的 Shell 则是通过命令行接口完成同样的交互,二者核心作用一致,只是交互方式不同。

1.2 Shell 命令的运行原理

Shell 作为命令行解释器,其核心工作流程可分为四个步骤:读取命令→解析命令→执行命令→返回结果,整个过程环环相扣,确保用户指令准确落地。

1.2.1 读取命令:从终端获取用户输入

当我们在终端中输入一条命令(如ls -l)并按下回车时,Shell 会通过标准输入(stdin)读取这条命令。终端作为 Shell 的交互载体,将用户的键盘输入传递给 Shell 进程。

1.2.2 解析命令:识别命令类型与参数

Shell 读取命令后,会进行一系列解析操作:

  • 首先识别命令名称(如ls)与选项(如-l)、参数(如指定的目录路径);
  • 接着判断命令类型:是内置命令(Shell 自带的命令,如cdpwd)还是外部命令(系统中独立的可执行文件,如lsgrep);
  • 对于外部命令,Shell 会通过PATH环境变量指定的路径查找可执行文件(可通过echo $PATH查看路径列表)。

示例:查看ls命令的位置

代码语言:javascript
复制
[whb@bite-alicloud ~]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls

通过which命令可以看到,ls是外部命令,其可执行文件位于/usr/bin/目录下,且系统为其设置了别名ls --color=auto,让输出结果带颜色区分文件类型。

1.2.3 执行命令:创建子进程与系统调用

命令解析完成后,Shell 会根据命令类型执行不同的处理逻辑:

  • 内置命令:直接在当前 Shell 进程中执行,无需创建新进程(如cd命令,若创建子进程执行,切换目录的效果仅在子进程中有效,无法影响当前终端环境);
  • 外部命令:通过fork()系统调用创建一个子进程,再通过exec()系统调用将子进程替换为命令对应的可执行程序,子进程执行完成后通过wait()系统调用将执行状态返回给父进程(Shell)。

这个过程可以通过ps命令直观观察:

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ps -ef | grep bash
whb       1234  1230  0 10:00 pts/0    00:00:00 -bash
whb       1256  1234  0 10:05 pts/0    00:00:00 grep --color=auto bash

当我们执行ls命令时,Shell 会创建一个子进程执行ls,执行完成后子进程退出:

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l
total 4
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb    0 Jan 11 14:22 file.txt
[whb@bite-alicloud ~]$ ps -ef | grep ls
whb       1260  1234  0 10:06 pts/0    00:00:00 grep --color=auto ls

可以看到,ls命令执行完毕后,子进程已退出,仅保留grep的查询进程。

1.2.4 返回结果:输出执行状态与信息

命令执行完成后,会通过退出状态码(0 表示成功,非 0 表示失败)告知 Shell,同时将执行结果通过标准输出(stdout)输出到终端,错误信息则通过标准错误(stderr)输出。

示例:查看命令退出状态码

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[whb@bite-alicloud ~]$ echo $?  # 查看上一条命令的退出状态码
0  # 0表示执行成功

[whb@bite-alicloud ~]$ ls -l nofile.txt
ls: cannot access 'nofile.txt': No such file or directory
[whb@bite-alicloud ~]$ echo $?
2  # 非0表示执行失败

1.3 Shell 命令的核心特性与实践

1.3.1 命令补全与历史记录

Shell 提供了便捷的命令补全功能,通过Tab可以快速补全命令、文件名或目录名,提高输入效率:

  • 输入l后按Tab,Shell 会列出所有以l开头的命令(如lslessln等);
  • 输入ls dir/后按Tab,会补全dir目录下的文件名。

此外,Shell 会记录用户输入的命令历史,通过history命令可查看,通过!命令序号!命令前缀可快速重复执行历史命令:

代码语言:javascript
复制
[whb@bite-alicloud ~]$ history
1  ls -l
2  pwd
3  cd test/
4  touch newfile.txt
[whb@bite-alicloud ~]$ !2  # 执行第2条历史命令
pwd
/home/whb/test
[whb@bite-alicloud ~]$ !tou  # 执行以tou开头的历史命令
touch newfile.txt
1.3.2 管道与重定向

Shell 的管道(|)与重定向(>>><)功能是命令组合使用的核心,让多个命令协同工作,灵活处理输入输出。

管道(|):将前一个命令的标准输出作为后一个命令的标准输入;示例:查找/home目录下包含 “whb” 的文件

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l /home | grep "whb"
drwx------ 22 whb whb 4096 Jan 11 14:21 whb

重定向输出(>覆盖,>>追加):将命令输出写入到文件当中;示例:将ls命令结果写入文件,追加新内容

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l > file_list.txt  # 覆盖写入
[whb@bite-alicloud ~]$ echo "新增内容" >> file_list.txt  # 追加写入
[whb@bite-alicloud ~]$ cat file_list.txt
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb    0 Jan 11 14:22 file.txt
新增内容

重定向输入(<):将文件内容作为命令的标准输入;示例:通过cat命令读取文件内容(等价于cat file.txt

代码语言:javascript
复制
[whb@bite-alicloud ~]$ cat < file.txt
你好比特就业课
1.3.3 别名与脚本

为了简化复杂命令的输入,Shell 支持通过alias命令设置命令别名:示例:设置llls -l的别名,hellols -a -l -n的别名

代码语言:javascript
复制
[whb@bite-alicloud ~]$ alias ll='ls -l'
[whb@bite-alicloud ~]$ alias hello='ls -a -l -n'
[whb@bite-alicloud ~]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb    0 Jan 11 14:22 file.txt
[whb@bite-alicloud ~]$ hello
total 36
drwxrwxr-x 2 1003 1003 4096 Jan 11 17:59 .
drwx------ 22 1003 1003 4096 Jan 11 17:57 ..
-rw-rw-r-- 1 1003 1003 28667 Jan 11 18:29 temp.txt

若需要永久生效,可将别名写入 Shell 配置文件(如~/.bashrc),修改后执行source ~/.bashrc使配置立即生效。

此外,Shell 脚本(.sh文件)可以将一系列命令组合起来,批量执行复杂任务。示例:创建一个批量创建文件的脚本

代码语言:javascript
复制
[whb@bite-alicloud ~]$ touch create_files.sh
[whb@bite-alicloud ~]$ vim create_files.sh
# 写入以下内容
#!/bin/bash
for i in 1 2 3 4 5
do
    touch "test_$i.txt"
done
echo "5个文件创建完成"

[whb@bite-alicloud ~]$ chmod +x create_files.sh  # 赋予执行权限
[whb@bite-alicloud ~]$ ./create_files.sh
5个文件创建完成
[whb@bite-alicloud ~]$ ls
create_files.sh  test_1.txt  test_2.txt  test_3.txt  test_4.txt  test_5.txt

二、Linux 权限机制:系统安全的 “守门人”

2.1 权限的核心意义

Linux 是多用户、多任务操作系统,同一系统中可能有多个用户同时工作,共享文件、目录等资源。权限机制的核心目的是:

  • 控制不同用户对文件 / 目录的访问权限(读、写、执行);
  • 防止未授权用户修改、删除重要资源;
  • 确保系统稳定运行,避免恶意操作或误操作造成损失。

简单来说,权限机制就是给系统中的每个资源(文件 / 目录)设置 “访问规则”,规定哪些用户可以做什么操作。

2.2 Linux 用户与用户组

要理解权限,首先要明确 Linux 中的 “访问主体”—— 用户与用户组

2.2.1 三类核心用户

Linux 系统中将用户分为三类,对应不同的访问权限:

  • 超级用户(root):命令提示符为#,拥有系统最高权限,可以执行任何操作(如修改系统配置、删除任意文件、创建新用户等);
  • 普通用户:命令提示符为$,权限受限制,仅能操作自己拥有的资源或被授权的资源;
  • 虚拟用户(系统用户):不用于登录系统,仅用于运行特定服务,确保服务运行的独立性和安全性。

使用su命令切换用户的指令示例如下

代码语言:javascript
复制
[whb@bite-alicloud ~]$ su root  # 从普通用户切换到root用户,需输入root密码
Password:
[root@bite-alicloud whb]# whoami
root
[root@bite-alicloud whb]# su whb  # 从root切换到普通用户whb,无需密码
[whb@bite-alicloud ~]$ whoami
whb
2.2.2 用户组的作用

用户组是多个用户的集合,用于简化权限管理。例如,一个项目团队的所有成员可以加入同一个用户组,将项目文件的组权限设置为允许该组用户读写,无需为每个用户单独授权。

相关命令示例:

  • 创建用户组:groupadd test_group
  • 创建用户并加入组:useradd -g test_group test_user
  • 修改用户所属组:usermod -g test_group test_user
  • 查看用户所属组:groups test_user

2.3 文件 / 目录的权限表示方法

Linux 中每个文件 / 目录的权限都可以通过ls -l命令查看,权限信息由 10 个字符组成,格式如下:

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt

其中,前 10 个字符-rw-rw-r--就是权限标识,可拆解为四部分:

位置

含义

示例(-rw-rw-r--)

第 1 位

文件类型

-(普通文件)

第 2-4 位

所有者(u)权限

rw-(读、写权限,无执行权限)

第 5-7 位

所属组(g)权限

rw-(读、写权限,无执行权限)

第 8-10 位

其他用户(o)权限

r--(仅读权限,无写、执行权限)

2.3.1 文件类型标识

第 1 位的文件类型主要有以下几种:

  • -普通文件(如文本文件、可执行文件);
  • d目录(文件夹);
  • l软链接(类似 Windows 的快捷方式);
  • b块设备文件(如硬盘、光驱);
  • c字符设备文件(如键盘、屏幕);
  • p管道文件;
  • s套接口文件。

示例:查看不同类型文件的权限标识

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir  # d表示目录
-rw-rw-r-- 1 whb whb    0 Jan 11 14:22 file.txt  # -表示普通文件
lrwxrwxrwx 1 whb whb    8 Jan 11 19:00 link.txt -> file.txt  # l表示软链接
2.3.2 基本权限的含义

第 2-10 位的权限由r(读)、w(写)、x(执行)三个字符组合而成,-表示无该权限。不同权限对文件和目录的含义不同:

权限

对文件的作用

对目录的作用

r(读,4)

可以读取文件内容(如cat、less命令)

可以查看目录下的文件列表(如ls命令)

w(写,2)

可以修改文件内容(如vim编辑、echo追加)

可以在目录中创建、删除、移动文件(如touch、rm、mv命令)

x(执行,1)

可以执行文件(如./script.sh、ls命令)

可以进入目录(如cd命令)

需要注意的是,目录的x权限是执行其他操作的基础 —— 即使有r权限,没有x权限也无法进入目录;而目录的w权限允许删除其中的文件,无论该文件的所有者是谁(后续为大家介绍粘滞位之后,会解决这个问题)。

2.3.3 权限的数值表示法

除了字符表示法,权限还可以用 8 进制数值表示(方便批量设置),每个权限对应一个数值,三者相加即为最终权限值:

  • r = 4,w = 2,x = 1,- = 0;
  • 所有者权限(u)、所属组权限(g)、其他用户权限(o)分别对应一个数值,组成三位数字(如664755)。

常见权限数值与字符对应关系如下:

数值

字符表示

含义

777

rwxrwxrwx

所有用户都有读、写、执行权限

755

rwxr-xr-x

所有者有全部权限,组用户和其他用户有读、执行权限(常用目录权限)

644

rw-r--r--

所有者有读、写权限,组用户和其他用户有读权限(常用文件权限)

600

rw-------

仅所有者有读、写权限

示例:通过数值快速理解权限

代码语言:javascript
复制
# 664 = 所有者(rw=4+2) + 所属组(rw=4+2) + 其他用户(r=4)
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt

# 755 = 所有者(rwx=4+2+1) + 所属组(rx=4+1) + 其他用户(rx=4+1)
[whb@bite-alicloud ~]$ ls -ld dir
drwxr-xr-x 2 whb whb 4096 Jan 11 14:22 dir

2.4 权限的修改命令

Linux 提供了chmodchownchgrp三个核心命令,分别用于修改文件 / 目录的权限、所有者、所属组。

2.4.1 chmod:修改权限

chmod(change mode)是修改权限的核心命令,支持字符模式和数值模式两种用法。

字符模式语法:
代码语言:javascript
复制
chmod [选项] [用户标识+/-=权限字符] 文件名/目录名

  • 用户标识:u(所有者)、g(所属组)、o(其他用户)、a(所有用户);
  • 操作符:+(添加权限)、-(取消权限)、=(设置权限,覆盖原有权限);
  • 选项:-R(递归修改目录及子目录下所有文件的权限)。

示例:字符模式修改权限

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt

# 给其他用户添加写权限
[whb@bite-alicloud ~]$ chmod o+w file.txt
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-rw- 1 whb whb 0 Jan 11 14:22 file.txt

# 取消所属组的写权限
[whb@bite-alicloud ~]$ chmod g-w file.txt
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-r--rw- 1 whb whb 0 Jan 11 14:22 file.txt

# 给所有用户设置读、写权限(覆盖原有权限)
[whb@bite-alicloud ~]$ chmod a=rw file.txt
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-rw- 1 whb whb 0 Jan 11 14:22 file.txt

# 递归修改目录及子目录权限(给所有者添加执行权限)
[whb@bite-alicloud ~]$ chmod -R u+x dir/
[whb@bite-alicloud ~]$ ls -ld dir/
drwxr--rw- 2 whb whb 4096 Jan 11 14:22 dir/
数值模式语法:
代码语言:javascript
复制
chmod [选项] 权限数值 文件名/目录名

示例:数值模式修改权限

代码语言:javascript
复制
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-rw-rw- 1 whb whb 0 Jan 11 14:22 file.txt

# 设置权限为644(rw-r--r--)
[whb@bite-alicloud ~]$ chmod 644 file.txt
[whb@bite-alicloud ~]$ ls -l file.txt
-rw-r--r-- 1 whb whb 0 Jan 11 14:22 file.txt

# 递归设置目录权限为755(rwxr-xr-x)
[whb@bite-alicloud ~]$ chmod -R 755 dir/
[whb@bite-alicloud ~]$ ls -ld dir/
drwxr-xr-x 2 whb whb 4096 Jan 11 14:22 dir/
2.4.2 chown:修改所有者

chown(change owner)用于修改文件 / 目录的所有者,只有 root 用户或文件原所有者可以执行。

语法规则如下:

代码语言:javascript
复制
chown [选项] 新所有者[:新所属组] 文件名/目录名

  • 选项:-R(递归修改目录及子目录的所有者);
  • 可同时修改所有者和所属组(用:分隔)。

示例:修改文件所有者和所属组

代码语言:javascript
复制
# 先创建测试用户test_user
[root@bite-alicloud ~]$ useradd test_user

[whb@bite-alicloud ~]$ ls -l file.txt
-rw-r--r-- 1 whb whb 0 Jan 11 14:22 file.txt

# 修改所有者为test_user
[root@bite-alicloud ~]$ chown test_user file.txt
[root@bite-alicloud ~]$ ls -l file.txt
-rw-r--r-- 1 test_user whb 0 Jan 11 14:22 file.txt

# 同时修改所有者和所属组为test_user
[root@bite-alicloud ~]$ chown test_user:test_user file.txt
[root@bite-alicloud ~]$ ls -l file.txt
-rw-r--r-- 1 test_user test_user 0 Jan 11 14:22 file.txt

# 递归修改目录所有者
[root@bite-alicloud ~]$ chown -R test_user:test_user dir/
[root@bite-alicloud ~]$ ls -ld dir/
drwxr-xr-x 2 test_user test_user 4096 Jan 11 14:22 dir/
2.4.3 chgrp:修改所属组

chgrp(change group)专门用于修改文件 / 目录的所属组,用法与chown类似。

语法规则如下:

代码语言:javascript
复制
chgrp [选项] 新所属组 文件名/目录名
  • 选项:-R(递归修改)。

示例:修改目录所属组

代码语言:javascript
复制
[root@bite-alicloud ~]$ ls -ld dir/
drwxr-xr-x 2 test_user test_user 4096 Jan 11 14:22 dir/

# 修改所属组为whb
[root@bite-alicloud ~]$ chgrp whb dir/
[root@bite-alicloud ~]$ ls -ld dir/
drwxr-xr-x 2 test_user whb 4096 Jan 11 14:22 dir/

# 递归修改子目录所属组
[root@bite-alicloud ~]$ chgrp -R whb dir/

2.5 文件掩码 umask

2.5.1 umask 的作用

当我们创建新文件或目录时,其默认权限并非0666(文件)0777(目录),而是由umask(文件掩码)决定。umask规定了创建文件时默认取消的权限,计算公式为:

  • 新文件默认权限 = 0666 - umask(文件无默认执行权限,避免误执行脚本);
  • 新目录默认权限 = 0777 - umask(目录需要执行权限才能进入)。

umask的默认值:

  • root 用户:0022(取消组用户和其他用户的写权限);
  • 普通用户:0002(取消其他用户的写权限)。
2.5.2 umask 的查看与修改

下面我为大家提供了一个查看并修改 umask的示例:

代码语言:javascript
复制
# 普通用户查看umask
[whb@bite-alicloud ~]$ umask
0002

# 创建新文件,默认权限=0666-0002=0664(rw-rw-r--)
[whb@bite-alicloud ~]$ touch test_umask.txt
[whb@bite-alicloud ~]$ ls -l test_umask.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 19:30 test_umask.txt

# 创建新目录,默认权限=0777-0002=0775(rwxrwxr-x)
[whb@bite-alicloud ~]$ mkdir dir_umask
[whb@bite-alicloud ~]$ ls -ld dir_umask/
drwxrwxr-x 2 whb whb 4096 Jan 11 19:31 dir_umask/

# 修改umask为0022
[whb@bite-alicloud ~]$ umask 0022
[whb@bite-alicloud ~]$ touch test_umask2.txt
[whb@bite-alicloud ~]$ ls -l test_umask2.txt
-rw-r--r-- 1 whb whb 0 Jan 11 19:32 test_umask2.txt  # 0666-0022=0644

# 临时修改umask仅当前终端有效,永久修改需写入~/.bashrc或/etc/profile

2.6 特殊权限:粘滞位

2.6.1 粘滞位的作用

默认情况下,若目录设置了777权限(所有用户可读写执行),任何用户都可以删除该目录下的文件,即使文件的所有者不是自己 —— 这会导致安全问题(比如张三创建的文件被李四误删)。

粘滞位(Sticky Bit)的出现就是为了解决这个问题:给目录设置粘滞位后,该目录下的文件只能被以下三类用户删除:

  1. 超级用户(root);
  2. 目录的所有者;
  3. 文件的所有者。

粘滞位的标识:目录权限的最后一位变为t(如drwxrwxrwt)。

2.6.2 粘滞位的设置与验证

设置并验证粘滞位的示例如下:

代码语言:javascript
复制
# 创建测试目录,设置777权限
[root@bite-alicloud ~]$ mkdir sticky_dir
[root@bite-alicloud ~]$ chmod 777 sticky_dir/
[root@bite-alicloud ~]$ ls -ld sticky_dir/
drwxrwxrwx 2 root root 4096 Jan 11 19:40 sticky_dir/

# 普通用户whb创建文件
[whb@bite-alicloud ~]$ touch sticky_dir/whb_file.txt
[whb@bite-alicloud ~]$ ls -l sticky_dir/
-rw-rw-r-- 1 whb whb 0 Jan 11 19:41 whb_file.txt

# 普通用户test_user删除whb的文件(未设置粘滞位,可删除)
[test_user@bite-alicloud ~]$ rm sticky_dir/whb_file.txt
rm: remove regular empty file 'sticky_dir/whb_file.txt'? y
[test_user@bite-alicloud ~]$ ls -l sticky_dir/
total 0

# 给目录设置粘滞位(chmod +t)
[root@bite-alicloud ~]$ chmod +t sticky_dir/
[root@bite-alicloud ~]$ ls -ld sticky_dir/
drwxrwxrwt 2 root root 4096 Jan 11 19:43 sticky_dir/

# whb重新创建文件
[whb@bite-alicloud ~]$ touch sticky_dir/whb_file2.txt
[whb@bite-alicloud ~]$ ls -l sticky_dir/
-rw-rw-r-- 1 whb whb 0 Jan 11 19:44 whb_file2.txt

# test_user尝试删除,提示无权限
[test_user@bite-alicloud ~]$ rm sticky_dir/whb_file2.txt
rm: remove regular empty file 'sticky_dir/whb_file2.txt'? y
rm: cannot remove 'sticky_dir/whb_file2.txt': Operation not permitted

Linux 系统中/tmp目录默认就设置了粘滞位,作为所有用户的临时文件存放目录,确保用户只能删除自己的临时文件:

代码语言:javascript
复制
[root@bite-alicloud ~]$ ls -ld /tmp/
drwxrwxrwt. 12 root root 4096 Jan 11 10:00 /tmp/

2.7 sudo:普通用户的权限提升

普通用户权限有限,若需要执行 root 用户的命令(如安装软件、修改系统配置),无需切换到 root,可通过sudo命令临时提升权限。

2.7.1 sudo 的配置

sudo的权限配置在/etc/sudoers文件中,需通过visudo命令编辑,从而避免因为语法错误而导致无法使用 sudo:

代码语言:javascript
复制
[root@bite-alicloud ~]$ visudo

我们可以在文件中添加如下配置,允许普通用户whb执行所有 root 命令:

代码语言:javascript
复制
whb    ALL=(ALL)       ALL

  • 第一个ALL:允许在所有主机上使用;
  • 第二个(ALL):允许以所有用户身份执行;
  • 第三个ALL:允许执行所有命令

我们也可以限制仅允许执行特定命令(如useradd):

代码语言:javascript
复制
whb    ALL=(ALL)       /usr/sbin/useradd
2.7.2 sudo 的使用示例
代码语言:javascript
复制
# 普通用户无法直接创建新用户
[whb@bite-alicloud ~]$ useradd new_user
useradd: Permission denied

# 通过sudo提升权限执行
[whb@bite-alicloud ~]$ sudo useradd new_user
[sudo] password for whb:  # 输入whb自己的密码
[whb@bite-alicloud ~]$ id new_user
uid=1005(new_user) gid=1005(new_user) groups=1005(new_user)

sudo会记录用户的操作日志(/var/log/secure),便于审计和排查问题。

三、综合运用 Shell 命令与权限管理

案例 1:批量创建用户并设置权限

需求:创建 5 个用户(user1-user5),均加入project用户组,用户家目录下创建work目录,仅用户本人可读写。

步骤:

  1. 创建用户组project
  2. 循环创建用户并加入组;
  3. 为每个用户创建work目录,设置权限700
  4. 验证用户权限。

命令实现:

代码语言:javascript
复制
# 1. 创建用户组
[root@bite-alicloud ~]$ groupadd project

# 2. 循环创建用户(批量创建可写脚本,此处简化为循环命令)
[root@bite-alicloud ~]$ for i in {1..5}; do useradd -g project user$i; echo "123456" | passwd --stdin user$i; done
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
...

# 3. 为每个用户创建work目录并设置权限
[root@bite-alicloud ~]$ for i in {1..5}; do mkdir /home/user$i/work; chown user$i:project /home/user$i/work; chmod 700 /home/user$i/work; done

# 4. 验证
[root@bite-alicloud ~]$ ls -ld /home/user1/work/
drwx------ 2 user1 project 4096 Jan 11 20:00 /home/user1/work/

# 切换到user2,尝试访问user1的work目录(无权限)
[user2@bite-alicloud ~]$ cd /home/user1/work/
-bash: cd: /home/user1/work/: Permission denied

案例 2:Shell 脚本批量处理文件权限

需求:编写脚本,批量修改/data目录下所有.txt文件的权限为644,所有目录的权限为755,并记录修改日志。

脚本内容(modify_permissions.sh):

代码语言:javascript
复制
#!/bin/bash
# 批量修改文件和目录权限脚本
LOG_FILE="/var/log/modify_permissions.log"
TARGET_DIR="/data"

# 检查目标目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 错误:目标目录$TARGET_DIR不存在" >> $LOG_FILE
    exit 1
fi

# 修改所有目录权限为755
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始修改目录权限为755" >> $LOG_FILE
find $TARGET_DIR -type d -exec chmod 755 {} \;
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 目录权限修改完成" >> $LOG_FILE

# 修改所有.txt文件权限为644
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始修改.txt文件权限为644" >> $LOG_FILE
find $TARGET_DIR -type f -name "*.txt" -exec chmod 644 {} \;
echo "[$(date +'%Y-%m-%d %H:%M:%S')] .txt文件权限修改完成" >> $LOG_FILE

echo "[$(date +'%Y-%m-%d %H:%M:%S')] 所有权限修改操作执行完毕" >> $LOG_FILE

执行脚本结果如下:

代码语言:javascript
复制
[root@bite-alicloud ~]$ chmod +x modify_permissions.sh
[root@bite-alicloud ~]$ ./modify_permissions.sh
[root@bite-alicloud ~]$ cat /var/log/modify_permissions.log
[2024-01-11 20:05:30] 开始修改目录权限为755
[2024-01-11 20:05:30] 目录权限修改完成
[2024-01-11 20:05:30] 开始修改.txt文件权限为644
[2024-01-11 20:05:30] .txt文件权限修改完成
[2024-01-11 20:05:30] 所有权限修改操作执行完毕

总结

本文从原理到实践,为大家详细讲解了 Linux Shell 命令的运行机制与权限管理体系。掌握 Shell 命令与权限管理,是成为 Linux 高手的必经之路。希望本文的内容能帮助大家夯实基础,在实际工作中灵活运用,解决各类系统操作与安全问题。感谢大家的支持!

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、Linux Shell:内核与用户的 “沟通桥梁”
    • 1.1 Shell 的本质与定位
    • 1.2 Shell 命令的运行原理
      • 1.2.1 读取命令:从终端获取用户输入
      • 1.2.2 解析命令:识别命令类型与参数
      • 1.2.3 执行命令:创建子进程与系统调用
      • 1.2.4 返回结果:输出执行状态与信息
    • 1.3 Shell 命令的核心特性与实践
      • 1.3.1 命令补全与历史记录
      • 1.3.2 管道与重定向
      • 1.3.3 别名与脚本
  • 二、Linux 权限机制:系统安全的 “守门人”
    • 2.1 权限的核心意义
    • 2.2 Linux 用户与用户组
      • 2.2.1 三类核心用户
      • 2.2.2 用户组的作用
    • 2.3 文件 / 目录的权限表示方法
      • 2.3.1 文件类型标识
      • 2.3.2 基本权限的含义
      • 2.3.3 权限的数值表示法
    • 2.4 权限的修改命令
      • 2.4.1 chmod:修改权限
      • 2.4.2 chown:修改所有者
      • 2.4.3 chgrp:修改所属组
    • 2.5 文件掩码 umask
      • 2.5.1 umask 的作用
      • 2.5.2 umask 的查看与修改
    • 2.6 特殊权限:粘滞位
      • 2.6.1 粘滞位的作用
      • 2.6.2 粘滞位的设置与验证
    • 2.7 sudo:普通用户的权限提升
      • 2.7.1 sudo 的配置
      • 2.7.2 sudo 的使用示例
  • 三、综合运用 Shell 命令与权限管理
    • 案例 1:批量创建用户并设置权限
    • 案例 2:Shell 脚本批量处理文件权限
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档