我正在研究路由器,其固件按预期是只读的。他们使用的 busybox 是原始工具的精简版本,因此我无法使用所有必要的工具。这个路由器还有一个 USB 端口,所以我认为将 /bin 绑定到 USB 记忆棒会给我我想要的东西。所以使用以下命令进行绑定,
cp -r /bin /mnt/<device-id>/
mount --rbind /mnt/<device-id>/bin /bin
然后我用其存储库中的完整版本替换了 busybox。我为 misp 使用了最新的预构建二进制文件。
好吧,正如我所期望的,busybox 现在拥有所有组件,但是我无法从另一台设备进行 telnet,如果我失去了 telnet 连接,我将无法重新连接,并获得
$ telnet 192.168.1.1
login:
escape char:
Connection closed by foreign host.
那么还有无法解绑busybox的问题。当我尝试卸载它时,它很忙。这是预料之中的,因为我基本上将它用作 bash。
$ umount /bin
umount: /bin: device is busy.
我没有线索。希望有人能帮助我。
答案1
我已经弄清楚了我遇到的问题。首先,正如我提到的,我无法使用 telnet 重新连接。看来这是因为有一个父进程控制着 busybox 和 telnet 命令。当我尝试在前台创建另一个 telnetd 进程时,出现以下错误。
$ telnetd -F
telnetd: bind: Address already in use
我首先检查了使用端口 23(telnetd 的默认端口)的进程:
$ netstat -lntup | grep 23
tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 2697/agent
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 362/pc
因此,将/bin
文件夹绑定到另一个位置会混淆该pc
过程。因此,它无法创建 telnetd 会话并占用端口 23。因为此进程仅在启动时负责大多数配置。我唯一一次看到此进程 ID 被终止是在固件更新过程开始时。尽管如此,我还是终止了该进程并重新启动了 telnetd。
$ kill -9 362
$ telnetd
现在它可以工作了,但这是一个丑陋的补丁,所以我使用了不同的方法。当然,在另一个端口上运行 telnetd 是可能的,但我决定根本不绑定 /bin 文件夹。
我决定在路径之前添加安装位置。所以我运行的每个 busybox 命令都在安装位置找到。因为第一次在 PATH 中找到将被执行的命令。因此,在路径中拥有多个 busybox 并没有什么坏处。假设我有新的 busybox /mnt/<device-id>/bin
:
$ for i in `./busybox --list`; do ln -s busybox $i; done
$ PATH=/mnt/<device-id>/bin:$PATH
现在所有新的 busybox 命令都按预期工作。不再需要绑定,并且系统进程不再被终止。
作为旁注,我确实在我的问题帖子中提到,我无法umount
/bin
文件夹。看来原因和我想的一模一样。使用另一个 busybox 实例实际上会解除/bin
文件夹的绑定。