我无意中删除了关键共享库,现在所有动态链接可执行文件都无法运行。例如,甚至/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
; - 确定控制台的窗口 id,在其中 ssh 会话实时:使用
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