Copie o arquivo binário de outro sistema apenas com comandos shell integrados

Copie o arquivo binário de outro sistema apenas com comandos shell integrados

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/lsmostra 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 ( scpnã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:

  1. instalar x11-utils(precisa xwininfo) e xdotool;
  2. determine o id da janela do console, em qual sessão ssh está ativa: use xwininfopara isso;
  3. 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).

  1. Após a conclusão do envio, pressione Entere Ctrl-Dno 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
  1. 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.

  2. 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

informação relacionada