僅使用內建 shell 命令從其他系統複製二進位文件

僅使用內建 shell 命令從其他系統複製二進位文件

我不小心刪除了關鍵共享庫,現在沒有一個動態連結的可執行檔無法運行。例如,甚至/bin/ls顯示error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory.

我什至無法將刪除的檔案複製回來,因為 ssh 停止工作(scp無法啟動新連接)。我無法從電腦中取出磁碟並寫回正確的檔案:它是嵌入式設備,沒有可移動磁碟。

只有我仍然存在現有的 shell 會話,在任何情況下我都不應該關閉它:因為我將無法開啟新會話。

如何僅透過內建 shell 命令(如 echo、printf、read 等)從其他系統傳輸二進位檔案(共享庫)?

答案1

您可以嘗試 Bash 內建的 /dev/tcp TCP 總線:

http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting

您應該能夠使用它來製定 HTTP 請求,以便您可以透過 HTTP 提取檔案。

答案2

如果 /dev/tcp 不可用,可以使用替代解決方案,如下所述。

在目標機器上發出以下命令:

(while read -s l; do echo "$l"; done) > temp.txt

然後在PC上執行以下操作:

  1. 安裝x11-utils(需要xwininfo)和xdotool
  2. 確定 ssh 會話所在的控制台視窗 ID:用於xwininfo它;
  3. 發出以下命令來傳輸資料:
od -An -v -tx1 file.bin | (while read l; do xdotool type --delay 0 --window 0xa0000d "$(echo -e \"$l\r\")"; sleep 0.02; echo -ne .; done)

如果傳輸的資料以原始十六進位形式出現在 ssh 控制台中,則需要增加延遲(接收方速度不夠快)。

  1. 發送完成後,在 ssh 控制台中按Enter和,然後給出以下命令將接收到的檔案從十六進位轉換為二進位:Ctrl-D
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
  1. 使用以下命令檢查檔案長度:(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin

  2. 如果長度匹配(在不可靠的傳輸過程中沒有資料遺失),您可以將檔案複製到所需的位置:

(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination

相關內容