Mount

/bin 綁定到另一個位置時 telnet 拒絕連接

  • May 17, 2020

我正在研究路由器,它的韌體按預期是只讀的。他們使用的busybox是原始工具的精簡版,因此我無法使用所有必需的工具。這個路由器還有一個 USB 埠,所以我認為將 /bin 綁定到 USB 棒會給我想要的東西。於是使用以下命令進行綁定,

cp -r /bin /mnt/<device-id>/
mount --rbind /mnt/<device-id>/bin /bin

然後我用它的 repo 中的完整版本替換了busybox。我為 misp 使用了最新的預建構二進製文件。

好吧,正如我預期的那樣,busybox 現在擁有所有組件,但是我無法從另一台設備遠端登錄,如果我失去了我擁有的遠端登錄連接,我將無法重新連接並獲取

$ telnet 192.168.1.1
login:
escape char:
Connection closed by foreign host.

那麼busybox也有無法解綁的問題。當我嘗試解除安裝它時,它很忙。這是意料之中的,因為我基本上將它用作 bash。

$ umount /bin
umount: /bin: device is busy.

我沒有線索。我希望有一個人可以幫助我。

我已經弄清楚我遇到的問題。首先,正如我提到的,我無法使用 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文件夾的綁定。

引用自:https://unix.stackexchange.com/questions/586051