%20sin%20guardarlo%20primero.png)
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 tail
dentro 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é
mktemp
amktemp -d
porque parece que estás intentando crear un directorio y sin-d
el comandomktemp
crea un archivo.
Ahora deberías poder hacer algo como
curl -fsSL https://<omitted>/script.sh | bash