当 /bin 绑定到另一个位置时 telnet 拒绝连接

当 /bin 绑定到另一个位置时 telnet 拒绝连接

我正在研究路由器,其固件按预期是只读的。他们使用的 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文件夹的绑定。

相关内容