Ejecute un script bash autoextraíble (con datos binarios adjuntos) sin guardarlo primero

Ejecute un script bash autoextraíble (con datos binarios adjuntos) sin guardarlo primero

Tengo un script bash autoextraíble (datos binarios añadidos al final) como este:

#!/bin/bash

export TMPDIR=$(mktemp -d)

ARCHIVE_START_LINE=$(...) # <omitted>

# extracting data archive into a temporary directory
tail -n+$ARCHIVE_START_LINE $0 | tar xzv -C $TMPDIR

# <ACCESSING_ARCHIVED_RESOURCES>

exit 0

# <BINARY_DATA_ARCHIVE>

El guión está alojado de forma remota enhttps://<omitted>/script.sh

Quiero extraer el script y ejecutarlo localmente.

Como lo estoy usando taildentro del script pasando el nombre del archivo actual como argumento, no puedo hacer:

/bin/bash -c "$(curl -fsSL https://<omitted>/script.sh)"

Por supuesto, primero puedo guardarlo en un archivo temporal, por ejemplo:

TMP=$(mktemp); curl -fsSL https://<omitted>/script.sh > $TMP; sh $TMP; rm $TMP

Pero… ¿alguna forma más ordenada?

Respuesta1

Simplemente cambiaría ligeramente la estructura del script para que no lo necesites tail. Simplemente guarde los datos como una variable:

#!/bin/bash

## begin data dump
read -r -d '' archive_data <<'EoF'
<BINARY_DATA_ARCHIVE>
EoF
## end data dump

export tmpdir=$(mktemp -d)

# extracting data archive into a temporary directory
printf '%s' "$archive_data" | tar xzv -C "$tmpdir"

exit 0

Comentarios:

  • Esto no funcionará si el archivo de datos puede contener NUL ( \0).

  • Tenga en cuenta las comillas simples que rodean 'EoF', ya que garantizan que ninguna $no se expandirá a nombres de variables incorrectos.

  • También cambié sus variables a minúsculas, ya que es una mala práctica usar mayúsculas para las variables de shell ya que, por convención, las variables de entorno globales están en mayúscula y esto puede provocar colisiones de nombres y errores inesperados. Utilice minúsculas para sus variables y capitalice los entornos globales solo cuando sea posible.

  • Cambié mktempa mktemp -dporque parece que estás intentando crear un directorio y sin -del comando mktempcrea un archivo.

Ahora deberías poder hacer algo como

curl -fsSL https://<omitted>/script.sh | bash

información relacionada