Accidentalmente acabo de eliminar la biblioteca compartida crítica y ahora no se puede ejecutar ningún ejecutable vinculado dinámicamente. Por ejemplo, incluso /bin/ls
muestra error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory
.
Ni siquiera puedo volver a copiar el archivo eliminado porque ssh deja de funcionar ( scp
no puede iniciar una nueva conexión). Y no puedo quitar el disco de la computadora y volver a escribir el archivo correcto: es un dispositivo integrado y no hay un disco extraíble.
Solo yo tengo una sesión de shell todavía existente, que no debo cerrar bajo ninguna circunstancia: porque no podré abrir una nueva sesión.
¿Cómo puedo transferir archivos binarios (biblioteca compartida) desde otro sistema mediante solo comandos de shell integrados (como echo, printf, read, etc.)?
Respuesta1
Podrías probar el bus TCP /dev/tcp integrado en Bash:
http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting
Debería poder formular una solicitud HTTP usando eso, para poder extraer el archivo a través de HTTP.
Respuesta2
Si /dev/tcp no está disponible, se puede utilizar una solución alternativa, como se describe a continuación.
En la máquina de destino, dé el siguiente comando:
(while read -s l; do echo "$l"; done) > temp.txt
Luego en la PC realice las siguientes acciones:
- instalar
x11-utils
(necesidadxwininfo
) yxdotool
; - determine la identificación de la ventana de la consola, en la que se encuentra la sesión ssh: utilícela
xwininfo
; - dé el siguiente comando para transferir datos:
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)
Si los datos transferidos aparecen en consolas ssh en formato hexadecimal sin formato, debe aumentar el retraso (el lado receptor no es lo suficientemente rápido).
- Una vez finalizado el envío, presione
Enter
yCtrl-D
en la consola ssh, luego proporcione el siguiente comando para convertir el archivo recibido de hexadecimal a binario:
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
Verifique la longitud del archivo con el comando:
(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin
.Y si la longitud coincide (no se perdieron datos durante una transmisión no confiable), puede copiar el archivo a la ubicación deseada:
(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination