BusyBox 中文文档 下载 App

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

解决方法:

  1. 重新跑 make menuconfig,打开对应的 Applet 选项
  2. 重新编译
  3. 替换掉目标设备上的 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"