我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。
sudo 的内部结构与机制详解
sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安全性。以下是其核心内部机制的分解:
阶段一:初始化与参数解析
-
执行入口 (
main函数):- 当你在命令行键入
sudo <command>并回车后,操作系统加载并执行/usr/bin/sudo程序。 sudo的main()函数开始执行。
- 当你在命令行键入
-
SetUID 生效:
- 由于
sudo文件具有 SetUID root 权限,此时sudo进程的 有效用户ID (EUID) 变成了root(UID 0)。其实际用户ID (RUID) 仍然是你当前登录用户的ID。 - 这意味着
sudo进程现在拥有了root权限,可以访问受保护的系统资源,比如读取/etc/sudoers文件。
- 由于
-
命令行参数解析:
sudo解析你传递给它的命令行选项(如-u,-i,-l,-E等)和要执行的命令及其参数。
-
加载配置文件 (
sudo.conf):sudo读取其主配置文件,通常是/etc/sudo.conf(或编译时指定的路径)。- 这个文件定义了
sudo的一些全局行为,比如要加载哪些插件(策略插件、I/O插件等)、调试级别、askpass程序的路径等。 - 插件加载:如果
sudo.conf中配置了插件,sudo会使用dlopen()(或类似机制)动态加载这些共享库 (.so文件),并调用它们的初始化函数。
阶段二:策略检查与授权 (核心阶段)
这是 sudo 最核心的部分,由策略插件 (Policy Plugin) 主导。默认的策略插件是 sudoers.so,它负责解析 /e