KernelSU 隐藏功能指南:用 .ksurc 自定义 su Shell 启动环境
2026/9/13 17:25:05 网站建设 项目流程

KernelSU 隐藏功能指南:用 .ksurc 自定义 su Shell 启动环境

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

本文是 KernelSU 隐藏功能(Hidden features)系列中的一篇,聚焦于.ksurc这一用户态特性:通过创建/data/adb/ksu/.ksurc文件,即可让su授予的 shell 加载自定义 rc 文件,替代 Android 默认的/system/etc/mkshrc。读完本文,你将掌握.ksurc的创建方法、适用场景,并理解其在 adbroot.cc 与 su.rs 两套代码路径中的底层实现原理,从而能安全、正确地用它在每次获得 root shell 时自动注入自己的环境配置。

背景:Android 的 mkshrc 与 shell 启动环境

在 Android 系统中,默认的交互式 shell 是 mksh(MirBSD Korn Shell),/system/bin/sh即指向它。mksh 遵循 POSIX 的ENV环境变量语义:当 shell 以交互方式启动时,会读取ENV指向的文件并将其作为 rc 脚本 source 执行。Android 在系统层面将这一机制与/system/etc/mkshrc绑定——默认情况下,/system/bin/sh会加载/system/etc/mkshrc,系统厂商也常借此注入一些全局别名、函数或终端行为设定。

KernelSU 的隐藏功能.ksurc正是对这一机制的接管:当你创建/data/adb/ksu/.ksurc后,通过 KernelSU 的su获得的 shell 将加载这个文件,而不是系统默认的/system/etc/mkshrc

使用方法:创建 .ksurc 文件

操作非常简单,只需在 KernelSU 的工作目录下创建隐藏文件.ksurc

# 在已 root 的终端中执行 mkdir -p /data/adb/ksu cat > /data/adb/ksu/.ksurc <<'EOF' # 自定义 shell 环境,例如: alias ll='ls -la' export MY_ROOT_ENV=1 EOF chmod 644 /data/adb/ksu/.ksurc

创建完成后,重新执行su进入的每一个新 shell都会自动加载该文件。可以立刻验证:

$ su # 如果 .ksurc 中定义了别名或变量,这里应当能看到效果 $ ll $ echo $MY_ROOT_ENV 1

几点使用要点:

  • 文件路径是固定的:/data/adb/ksu/.ksurc,在 defs.rs 中由KSURC_PATH: &str = concatcp!(WORKING_DIR, ".ksurc")定义(WORKING_DIR/data/adb/ksu/)。
  • 该文件只影响KernelSUsu授予的 shell;通过 adb shell、第三方终端直接启动的系统 shell 不受影响,仍按系统默认逻辑加载/system/etc/mkshrc
  • 文件内容按 POSIX shell rc 脚本语法书写即可,与mkshrc的写法一致(别名、函数、export变量等)。

实现原理:两处代码路径的配合

.ksurc的实现并非只在一个地方,而是由 KernelSU 的用户态ksud(su 守护进程)与 Manager 附带的libadbroot.so两套机制共同承担,分别对应su命令的两种来源。

路径一:ksud 的 su 守护进程(su.rs)

当应用通过su请求 root 时,KernelSU 内核侧会把执行重定向到ksud(见 sucompat.c 中ksu_handle_execve_sucompat_common/system/bin/su的拦截),随后由 su.rs 构造并exec真正的 shell。关键代码位于 su.rs:

// when KSURC_PATH exists and ENV is not set, set ENV to KSURC_PATH if PathBuf::from(defs::KSURC_PATH).exists() && env::var("ENV").is_err() { command.env("ENV", defs::KSURC_PATH); }

这段逻辑的含义是:

  1. 先检查/data/adb/ksu/.ksurc是否存在;
  2. 若存在且当前环境尚未显式设置ENV,则把ENV环境变量指向.ksurc路径;
  3. ENV会随command.exec()传递给新启动的 shell,mksh 依据 POSIX 语义在交互启动时加载它。

注意这里的保护条件env::var("ENV").is_err():如果调用方已经在环境里自定义了ENV,ksud 不会覆盖它,从而避免破坏用户显式指定的 rc 文件。同一函数里,su.rs 还会把/data/adb/ksu/bin追加到PATH,方便直接调用 KernelSU 附带的工具。

路径二:adb root 场景的 libadbroot.so(adbroot.cc)

当启用“ADB Root”能力时,Manager 会向adbd注入libadbroot.so(对应LIBADBROOT_PATH定义于 defs.rs)。该库拦截了 adbd 的execle系统调用,在adbd为 shell 用户构造环境时插入ENV,源码见 adbroot.cc:

// If the user creates ksurc, use ksurc instead of mkshrc bool ksurc_exists = (access("/data/adb/ksu/.ksurc", F_OK) == 0); const char *ksu_env_str = "ENV=/data/adb/ksu/.ksurc";

实现细节值得注意:

  • access("/data/adb/ksu/.ksurc", F_OK)判断文件是否存在;
  • 遍历原始envp跳过已有的ENV=(注释说明即使正常情况下 Android 不应存在该变量,也要防御新版 Android / 定制 ROM 可能注入的情况,见 adbroot.cc);
  • .ksurc存在,则在环境末尾追加ENV=/data/adb/ksu/.ksurc,最终通过execve完成替换(adbroot.cc)。

此外,该库的构造函数Init()还会把/data/adb/ksu/bin追加到PATH(adbroot.cc),与 ksud 的行为保持一致,保证 adb root 与 su root 两种入口下的 shell 环境体验统一。

机制解析:ENV、mkshrc 与 .ksurc 的关系

要理解.ksurc为什么能“替换”/system/etc/mkshrc,需要回到 mksh 的启动规则:交互式 mksh 启动时按ENV变量指向的文件执行 rc 脚本。默认情况下 Android 把ENV指向/system/etc/mkshrc,因此 shell 会加载它。KernelSU 的做法本质上是su场景下改写ENV的指向

场景ENV 指向效果
系统默认 shell/system/etc/mkshrc加载系统 rc
su且未创建.ksurc继承原有 ENV(或系统默认)保持默认行为
su且存在.ksurc/data/adb/ksu/.ksurc加载自定义 rc

因此,.ksurc/system/etc/mkshrc是“二选一”的替换关系,而不是叠加执行——在su进入的 shell 中,系统默认 rc 不会被额外加载。如果你的自定义配置依赖系统 mkshrc 中的既有内容,建议在.ksurc中显式 source 需要的部分,或自行补齐相关定义。

适用场景与注意事项

.ksurc适合以下典型用途:

  • 统一 root 终端环境:为每次su会话注入统一的别名、函数与常用工具路径;
  • 自动化初始化:进入 root shell 时自动执行环境准备(如挂载、设置代理变量、加载密钥等);
  • 替换厂商 rc:屏蔽厂商在/system/etc/mkshrc中注入的、你不需要的行为。

同时请注意以下边界与限制:

  • 只对 KernelSUsu授予的 shell 生效,不改变adb shell(未走 su 路径时)的默认行为;
  • 若环境中已存在ENV变量,ksud 路径下不会覆盖(su.rs);adbroot 路径下则会替换掉已有ENV(adbroot.cc),两处策略略有差异,使用时需留意;
  • 该功能位于 website/docs/zh_CN/guide/hidden-features.md 所述的“隐藏功能”分类下,不随主文档展开介绍,属于“知道就能用”的进阶特性;
  • 与 KernelSU 的其他隐藏能力(如 app-profile、module-config)相互独立,.ksurc只作用于 shell 环境层面。

小结

.ksurc是 KernelSU 提供给高级用户的一处“小而实用”的隐藏开关:只需在/data/adb/ksu/下创建该文件,即可让所有通过su获得的 root shell 加载自定义启动脚本,替代 Android 默认的/system/etc/mkshrc。其背后是 ksud(su.rs)与 libadbroot(adbroot.cc)两条路径对ENV环境变量的统一改写,配合 defs.rs 中约定的固定路径,构成了完整的实现闭环。对于需要批量定制 root 终端环境、希望摆脱厂商 mkshrc 约束的开发者,这是一个低成本、高收益的切入点。

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询