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