Führen Sie ein selbstextrahierendes Bash-Skript (mit angehängten Binärdaten) aus, ohne es vorher zu speichern.

Führen Sie ein selbstextrahierendes Bash-Skript (mit angehängten Binärdaten) aus, ohne es vorher zu speichern.

Ich habe ein selbstextrahierendes Bash-Skript (binäre Daten am Ende angehängt) wie dieses:

#!/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>

Das Skript wird remote gehostet unterhttps://<omitted>/script.sh

Ich möchte das Skript abrufen und lokal ausführen.

Da ich tailim Skript den aktuellen Dateinamen als Argument übergebe, kann ich Folgendes nicht tun:

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

Natürlich kann ich es zuerst in einer temporären Datei speichern, zB:

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

Aber ... gibt es einen eleganteren Weg?

Antwort1

Ich würde nur die Struktur des Skripts leicht ändern, sodass Sie dies nicht benötigen tail. Speichern Sie die Daten stattdessen einfach als 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

Kommentare:

  • Dies funktioniert nicht, wenn das Datenarchiv NUL ( \0) enthalten kann..

  • Beachten Sie die einfachen Anführungszeichen um 'EoF'. Diese stellen sicher, dass keine $Erweiterung zu falschen Variablennamen erfolgt.

  • Ich habe auch Ihre Variablen in Kleinbuchstaben geändert, da es nicht empfehlenswert ist, Großbuchstaben für Shell-Variablen zu verwenden, da globale Umgebungsvariablen per Konvention groß geschrieben werden und dies zu Namenskonflikten und unerwarteten Fehlern führen kann. Verwenden Sie Kleinbuchstaben für Ihre Variablen und schreiben Sie globale Umgebungen nach Möglichkeit nur groß.

  • Ich habe mktempes geändert mktemp -d, da Sie anscheinend versuchen, ein Verzeichnis zu erstellen und ohne -dden Befehl mktempeine Datei erstellt.

Sie sollten nun in der Lage sein, Folgendes zu tun:

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

verwandte Informationen