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/)。 - 该文件只影响KernelSU
su授予的 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); }这段逻辑的含义是:
- 先检查
/data/adb/ksu/.ksurc是否存在; - 若存在且当前环境尚未显式设置
ENV,则把ENV环境变量指向.ksurc路径; - 该
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中注入的、你不需要的行为。
同时请注意以下边界与限制:
- 只对 KernelSU
su授予的 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),仅供参考