仅使用内置 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. 确定控制台的窗口 id,在其中 ssh 会话实时:使用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 控制台中按下EnterCtrl-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

相关内容