Existe uma maneira de incorporar um binário executável em um script de shell sem ferramentas extras?

2

Estou procurando uma maneira de ter um binário executável conectado a um script. Algo parecido com isto:

#!/bin/bash
...some shell code
execute binary:
    >>>
        binary
        code
        ...
    <<<
...some more shell code possibly

Encontrei esta solução , que usa uuencode e é boa. Mas isso depende de shrutils , que parece ser um extra, já que eles não são incluídos por padrão no Debian.

Eu tenho pensado em ter o binário codificado com base64 e então decodificá-lo e de alguma forma em execução, possivelmente sem criar nenhum arquivo temporário. Eu lembro que havia uma biblioteca responsável por executar as coisas, mas esqueci o que era.

Pode ser melhor ter um constructo tão simples quanto isso:

$ <(base64 out | base64 -d)
bash: /dev/fd/63: Permission denied
    
por Tomasz 19.06.2018 / 13:48

2 respostas

1

Que tal:

unpack() {
    tail +9 "$0" > /tmp/xxx.$$
    chmod +x /tmp/xxx.$$
}
unpack
/tmp/xxx.$$ <add args here>
rm /tmp/xxx.$$
exit
<add the binary here>

Se você não gosta de ter dados binários no script, você pode codificá-lo e substituir cat pelo decodificador relacionado.

Observe que você precisa substituir o +9 pelo número da linha em que o binário é iniciado, caso você modifique o script para ter comprimento diferente.

Se a implementação de tail não der suporte ao argumento +9 , tente -n +9 .

Se você tem medo de estragar um arquivo / tmp existente, tente usar mktemp(1) para criar o nome do arquivo tmp.

Note que este método foi usado pelos scripts de atualização para o conjunto de compiladores SunPro que incluiu o arquivo tar compactado com toda a atualização e algum código shell para gerenciar o tratamento em torno disso.

    
por 19.06.2018 / 14:00
1

Começando com

aShellScript aBinaryExecutable

faça

zip binary.zip aBinaryExecutable
cat aShellScript binary.zip > hybrid
chmod +x hybrid

Eu perdi o que colocar no script, para extrair e executar o binário, mas note que hybrid é um arquivo zip válido, e um script de shell válido, o shell script pode descompactar-se e obter o binário executável (mas não o shell script).

Vantagem

É robusto: o arquivo é um zip válido e um script de shell válido (contanto que você saia antes de tentar interpretar o lixo no final).

Desvantagem

O final do roteiro é feio.

Por que funciona

  • shell inicia a interpretação do início do arquivo. (Todos os deslocamentos são simbólicos.)
  • zip inicia a interpretação do final do arquivo. Todos os deslocamentos são relativos.
por 19.06.2018 / 16:16