KernelSU 隐藏功能:用 .ksurc 定制 su 启动时的 shell 环境 KernelSU 隐藏功能用 .ksurc 定制 su 启动时的 shell 环境【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSUKernelSU 提供了一项未被广泛宣传的隐藏能力通过在工作目录创建/data/adb/ksu/.ksurc文件让su启动 shell 时自动加载这份自定义 rc 脚本从而取代 Android 系统默认的/system/etc/mkshrc。本文将结合 KernelSU 源码ksud 与 adbroot 两条实现路径讲清它的工作原理、适用场景与用法读完你可以为自己的 root shell 注入别名、函数与自定义环境变量而无需改动系统分区。背景Android 上 shell 为什么会加载 mkshrcAndroid 的/system/bin/shmksh在启动时会遵循 POSIX shell 的ENV环境变量约定如果环境变量ENV指向一个文件shell 会在启动时包括交互式与非交互式source 该文件。在 Android 系统默认配置下ENV指向/system/etc/mkshrc因此每次通过 adb shell、终端应用或su进入的 shell 都会执行/system/etc/mkshrc中的初始化逻辑例如设置默认 umask、加载厂商定义的环境变量等。这意味着 shell 的初始化行为几乎完全由系统镜像里的mkshrc决定。对于普通用户而言想要在每次 root shell 启动时自动执行自己的初始化脚本传统做法是手动修改/system/etc/mkshrc但这需要改动只读的 system 分区既不安全也难以在 OTA 后保留。.ksurc 是什么一条路径两处实现KernelSU 的解决方案非常轻量只要在 KernelSU 的工作目录下创建/data/adb/ksu/.ksurcsu启动的 shell 就会改而加载这个文件而不是系统默认的/system/etc/mkshrc。在源码中这条路径被统一定义为常量KSURC_PATH见 userspace/ksud/src/defs.rspub const ADB_DIR: str /data/adb/; pub const WORKING_DIR: str concatcp!(ADB_DIR, ksu/); pub const KSURC_PATH: str concatcp!(WORKING_DIR, .ksurc);即最终路径为/data/adb/ksu/.ksurc与各语言版本文档如 hidden-features.md中的描述完全一致。值得说明的是/data/adb/ksu/是 KernelSU 的核心工作目录ksud 守护进程的二进制、日志、profile 配置等均存放于此/data/adb/ksu/bin/也会被自动加入PATH见 su.rs 中的add_path_to_env(defs::BINARY_DIR)。实现原理一ksud 的 su 命令注入 ENV当你在终端执行su时实际进入的是 ksud 中的root_shell流程userspace/ksud/src/su.rs。在解析完-c、-l、-s、-M等选项后代码会构造要执行的 shell 命令并在这段关键逻辑中处理.ksurc// 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); }见 su.rs。这段逻辑有两层含义文件存在才生效只有/data/adb/ksu/.ksurc真实存在时才会向即将启动的 shell 注入ENV变量已设置的 ENV 优先如果环境中已存在ENV变量例如用户显式export ENV...ksud 不会覆盖它体现了一种保守且可预期的行为设计。由于 mksh 会遵循ENV指向的脚本注入后 shell 启动时就会执行.ksurc中的内容相当于把初始化逻辑从只读的系统分区搬到了可写的/data/adb/ksu/。实现原理二adbroot 对 adbd 的 execle 拦截除了通过su进入的 shellKernelSU 还支持直接启用adb root无需手动执行adb root命令相关逻辑在 manager/app/src/main/cpp/adbroot.cc。为了让 adb shell 同样享受.ksurc的能力该文件通过LD_PRELOAD方式覆盖了 libc 的execle函数// If the user creates ksurc, use ksurc instead of mkshrc extern C [[gnu::visibility(default), gnu::used]] int execle(const char *pathname, const char *arg, ...) { ... bool ksurc_exists (access(/data/adb/ksu/.ksurc, F_OK) 0); const char *ksu_env_str ENV/data/adb/ksu/.ksurc; if (old_envp ! nullptr) { for (size_t i 0; old_envp[i] ! nullptr; i) { // skip original ENV in envp if (ksurc_exists strncmp(old_envp[i], ENV, 4) 0) { continue; } env_list.push_back(old_envp[i]); } } if (ksurc_exists) { // push our ENV in here!!! env_list.push_back(ksu_env_str); } ... return execve(pathname, ...); }见 adbroot.cc。这段代码在 adbd 启动 shell 服务shell_service.cpp调用execle时被截获先检查/data/adb/ksu/.ksurc是否存在若存在则从环境列表中剔除原有的ENV...项注释中明确说明这是为了防御新版 Android 或定制 ROM 注入 ENV再追加ENV/data/adb/ksu/.ksurc最后通过execve完成真正的进程替换。因此无论是su路径ksud还是adb root路径adbrootKernelSU 都采用同一策略存在.ksurc就用它覆盖系统默认的 mkshrc。如何使用创建 .ksurc 并验证使用方式非常直接只需在 KernelSU 工作目录创建文件即可。你可以先在任意支持 root 的终端中确认目标路径然后创建 rc 文件# 确认 KernelSU 已就绪 su -c echo KernelSU ready # 创建 .ksurc文件所有者与权限建议 root:root 0644 su -c touch /data/adb/ksu/.ksurc编辑文件内容例如添加自定义别名与启动提示# /data/adb/ksu/.ksurc # 每次 su 启动 shell 时自动执行 # 自定义别名 alias llls -alF alias rmrm -i # 自定义环境变量 export KSU_RC_LOADED1 export EDITORvim # 追加自定义 PATH export PATH/data/adb/ksu/bin:$PATH保存后重新执行su输入echo $KSU_RC_LOADED若能输出1说明.ksurc已被加载也可以直接输入alias检查ll是否生效。若希望临时绕过.ksurc可先显式设置ENV环境变量如ENV/system/etc/mkshrc su因为 ksud 不会覆盖已存在的ENV。注意事项仅影响 KernelSU 的 su 与 adb root 路径.ksurc不会改变普通 shell如第三方终端应用的非 root 会话的行为它只作用于 KernelSU 接管启动的 shell 会话不要在其中放置阻塞性命令rc 文件在每次 shell 启动时执行若放入sleep、交互式提示或错误退出逻辑可能导致 root shell 启动变慢或行为异常属于隐藏能力该功能在各语言版本文档中列于隐藏功能Hidden features章节例如 英文版、中文版、俄文版官方未将其纳入常规功能清单升级或改动时注意保持兼容性。小结.ksurc是 KernelSU 中一个小而巧的隐藏特性无需改动 system 分区即可在每次su或adb root启动的 shell 中自动加载自定义初始化脚本。其实现横跨用户空间守护进程 ksud 与 adbroot 注入层两条路径统一遵循文件存在则用ENV指向它的约定。对经常使用 root shell、需要统一注入别名、函数与环境变量的开发者来说这是比修改/system/etc/mkshrc更安全、更可持续的方案。【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考