Я случайно удалил критически важную общую библиотеку, и сейчас невозможно запустить ни один динамически подключаемый исполняемый файл. Например, даже /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 и т. Д.)?
Вы можете попробовать встроенную шину TCP / dev / tcp в Bash:
http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting
Вы должны иметь возможность сформулировать HTTP-запрос, используя это, чтобы вы могли вытащить файл через HTTP.
Если / dev / tcp недоступен, можно использовать альтернативное решение, как описано ниже.
На целевой машине дайте следующую команду:
(while read -s l; do echo "$l"; done) > temp.txt
Затем на ПК выполните следующие действия:
x11-utils
(необходимость xwininfo
) и xdotool
;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