%20aus%2C%20ohne%20es%20vorher%20zu%20speichern..png)
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 tail
im 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
mktemp
es geändertmktemp -d
, da Sie anscheinend versuchen, ein Verzeichnis zu erstellen und ohne-d
den Befehlmktemp
eine Datei erstellt.
Sie sollten nun in der Lage sein, Folgendes zu tun:
curl -fsSL https://<omitted>/script.sh | bash