Acidentalmente, acabei de remover a biblioteca compartilhada crítica e nenhum executável vinculado dinamicamente não pode ser executado agora. Por exemplo, até /bin/ls
mostra error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory
.
Não consigo copiar o arquivo removido de volta porque o ssh para de funcionar ( scp
não consegue iniciar uma nova conexão). E não consigo remover o disco do computador e gravar o arquivo correto: é um dispositivo incorporado e não há disco removível.
Só que eu tenho - ainda existe uma sessão de shell, que não devo fechar em nenhuma circunstância: porque não poderei abrir uma nova sessão.
Como posso transferir arquivos binários (biblioteca compartilhada) de outro sistema através apenas de comandos shell integrados (como echo, printf, read, etc...)?
Responder1
Você pode tentar o barramento TCP /dev/tcp integrado no Bash:
http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting
Você deve ser capaz de formular uma solicitação HTTP usando isso, para poder extrair o arquivo via HTTP.
Responder2
Se /dev/tcp não estiver disponível, uma solução alternativa pode ser usada, conforme descrito abaixo.
Na máquina de destino, dê o seguinte comando:
(while read -s l; do echo "$l"; done) > temp.txt
Em seguida, no PC, execute as seguintes ações:
- instalar
x11-utils
(precisaxwininfo
) exdotool
; - determine o id da janela do console, em qual sessão ssh está ativa: use
xwininfo
para isso; - dê o seguinte comando para transferir dados:
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)
Se os dados transferidos aparecerem nos consoles ssh em formato hexadecimal bruto, você precisará aumentar o atraso (o lado de recepção não é rápido o suficiente).
- Após a conclusão do envio, pressione
Enter
eCtrl-D
no console ssh e dê o seguinte comando para converter o arquivo recebido de hexadecimal para binário:
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
Verifique o comprimento do arquivo com o comando:
(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin
.E se o comprimento corresponder (nenhum dado foi perdido durante a transmissão não confiável), você poderá copiar o arquivo para o local desejado:
(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination