我不小心刪除了關鍵共享庫,現在沒有一個動態連結的可執行檔無法運行。例如,甚至/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上執行以下操作:
- 安裝
x11-utils
(需要xwininfo
)和xdotool
; - 確定 ssh 會話所在的控制台視窗 ID:用於
xwininfo
它; - 發出以下命令來傳輸資料:
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 控制台中,則需要增加延遲(接收方速度不夠快)。
- 發送完成後,在 ssh 控制台中按
Enter
和,然後給出以下命令將接收到的檔案從十六進位轉換為二進位:Ctrl-D
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
使用以下命令檢查檔案長度:
(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin
。如果長度匹配(在不可靠的傳輸過程中沒有資料遺失),您可以將檔案複製到所需的位置:
(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination