BusyBox 找不到命令 Applet 不存在排查
症状
执行命令时报错:
$ ls
sh: ls: not found
或者直接:
$ busybox
# 什么都不输出就退出
原因一:PATH 里没有 busybox 目录
最常见的原因。安装了 BusyBox 但目录没加到 PATH 里,shell 找不到那些符号链接:
# 检查当前 PATH
echo $PATH
# 如果输出里没有 /system/xbin 或你安装 BusyBox 的目录
# 临时修复:加到 PATH
export PATH=/system/xbin:$PATH
# 永久修复:在 /etc/profile 或 rc.local 里加
# echo 'export PATH=/system/xbin:$PATH' >> /etc/profile
原因二:符号链接没创建
BusyBox 二进制在那里但 Applet 符号链接没生成:
# 检查目录
ls -la /system/xbin/busybox
# 二进制在不在?
# 符号链接呢?
ls /system/xbin/ls
# 是不是找不到?
# 修复:手动创建符号链接
cd /system/xbin
busybox --list | while read applet; do
ln -sf busybox "$applet"
done
BusyBox Pro 安装时会自动做这步。如果你手动安装 BusyBox 二进制,记得自己创建链接或用 busybox <command> 直接调用。
原因三:编译时没开这个 Applet
某些命令虽然你以为应该有,但其实编译配置里被关掉了:
# 确认当前 BusyBox 有哪些 Applet
busybox --list
# 搜一下目标命令在不在
busybox --list | grep -i wget
# 如果 wget 不在列表里,说明编译时 CONFIG_WGET 没开
# 确认编译配置
busybox wget
# 会提示:wget: applet not found
解决方法:
- 重新跑 make menuconfig,打开对应的 Applet 选项
- 重新编译
- 替换掉目标设备上的 busybox 二进制
原因四:Android 上的 PATH 优先级冲突
Android 默认使用 toybox(而不是 BusyBox)提供系统命令。如果 toybox 和 BusyBox 同时在 PATH 里,前面的优先:
# PATH 顺序影响执行结果
echo $PATH
# /system/bin 在 /system/xbin 前面的话,toybox 优先
# 你想让 BusyBox 优先,调整 PATH 顺序
export PATH=/system/xbin:$PATH:/system/bin
原因五:SELinux 拒绝执行
在严格 SELinux 模式(Enforcing)下,某些非标准路径的二进制会被拒绝执行:
# 检查 SELinux 模式
getenforce
# Enforcing = 严格
# 检查日志里有没有拒绝
dmesg | grep -i denied
# type=1400 audit: avc: denied { execmem } for pid=... scontext=... tcontext=...
# 临时关闭 SELinux 验证
setenforce 0
# 如果命令就能跑了,说明是 SELinux 策略问题
# 临时解决方案
busybox setenforce 0
# 或 Magisk 里用 SELinux mode changer 模块
快速排查流程
#!/bin/sh
# BusyBox 找不到命令时的一键排查脚本
echo "=== 1. busybox 二进制位置 ==="
which busybox 2>/dev/null || echo "busybox 不在 PATH 里"
echo "=== 2. PATH ==="
echo $PATH
echo "=== 3. busybox 版本 ==="
busybox 2>/dev/null | head -3 || echo "busybox 无法执行"
echo "=== 4. 可用 Applet 数 ==="
busybox --list 2>/dev/null | wc -l
echo "=== 5. 检查你要的命令 ==="
busybox --list | grep -i "$1" && echo "存在" || echo "不存在于当前 BusyBox"