Копировать двоичный файл из другой системы только с помощью встроенных команд оболочки

Копировать двоичный файл из другой системы только с помощью встроенных команд оболочки

Я случайно удалил критическую разделяемую библиотеку, и теперь ни один динамически связанный исполняемый файл не может быть запущен. Например, даже /bin/lsпоказывает error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory.

Я даже не могу скопировать удаленный файл обратно, потому что ssh перестал работать ( scpне может инициировать новое соединение). И я не могу вынуть диск из компьютера и записать нужный файл обратно: это встроенное устройство, а съемного диска нет.

Только у меня есть -- все еще существующий сеанс оболочки, который я не должен закрывать ни при каких обстоятельствах: потому что я не смогу открыть новый сеанс.

Как передать двоичный файл (общую библиотеку) из другой системы только с помощью встроенных команд оболочки (таких как echo, printf, read и т. д.)?

решение1

Вы можете попробовать встроенную в Bash шину TCP /dev/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

Затем на ПК выполните следующие действия:

  1. установить x11-utils(нужно xwininfo) и xdotool;
  2. определить идентификатор окна консоли, в которой находится сеанс 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. После завершения отправки нажмите Enterи Ctrl-Dв консоли SSH, затем введите следующую команду для преобразования полученного файла из шестнадцатеричного в двоичный:
(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

Связанный контент