wget http://example.com/install.sh -O - | bash
führt das Skript automatisch aus, ist jedoch aufgrund möglicher (TLS) MITM-Angriffe usw. nicht sicher. Ist es möglich, einen Einzeiler zu erstellen, der das Skript herunterlädt, es aber nur ausführt, wenn sein Hash mit dem im Einzeiler angegebenen übereinstimmt? Es wäre schön, wenn der Einzeiler so etwas drucken würde, Warning! Hash mismatch
wenn die Hash-Prüfung fehlschlägt.
command-line
bash
scripts
wget
maqp
quelle
quelle
Antworten:
Sie möchten also herunterladen und ausführen
http://example.com/install.sh
.Im Moment gehe ich davon aus, dass Sie den SHA256-Hash lokal in einer Datei namens gespeichert haben
my-sha256.txt
. Die Datei enthält nur den Hash selbst und ein Zeilenumbruchzeichen im Unix-Stil, daher muss ihre Größe genau 65 Byte betragen. Sie können es erstellen, indem Sie einfach Folgendes ausführen:Wie Sie diese Hash-Datei von Ihrem Entwicklungscomputer an den Client verteilen, ist nicht Teil dieser Antwort (dennoch können Sie Ihre Frage klären und mich bitten, diesen Teil basierend auf Ihren detaillierten Spezifikationen zu aktualisieren).
Der eigentliche Befehl, den Ihr Client ausführen muss, um das Skript herunterzuladen, zu überprüfen und bei Erfolg auszuführen, könnte folgendermaßen aussehen:
Leicht verkürzte und hässliche Version ohne Leerzeichen:
Zur besseren Lesbarkeit in mehreren Zeilen platziert:
Wenn Sie den Hash direkt im Befehl als Zeichenfolge bereitstellen möchten, anstatt aus einer Datei zu lesen, verwenden Sie einfach eine meiner obigen ursprünglichen Befehlsversionen und ersetzen Sie das Vorkommen von
my-sha256.txt
durch<(echo YOUR_HASH)
, indem Sie Ihren echten Hash anstelle des Platzhalters "YOUR_HASH" einfügen.Erläuterung:
Das Skript / der Einzeiler erstellt zuerst eine temporäre Datei mit
mktemp
(verwendet den temporären Ordner des Systems/tmp
).Anschließend wird
wget
Ihr Installationsskript von der angegebenen URL heruntergeladen und in der temporären Datei gespeichert.Jetzt berechnen wir die Hash-Summe, filtern nur den Hash-Wert aus der Ausgabe von
sha256sum
und vergleichen diesen mit dem, was wir in out gespeichert habenmy-sha256.txt
.Wenn beide Hashes gleich sind, werden wir
bash
mit unserer temporären Skriptdatei als Argument aufrufen , andernfallsecho FAIL
könnten wir oder Sie eine benutzerdefinierte Fehlermeldung ausgeben.Am Ende bereinigen wir in beiden Fällen unsere temporäre Datei.
Wenn Sie jedoch auf das Problem der sicheren Verteilung des Hashs zur Überprüfung des ursprünglichen Skripts zurückkommen, hilft Ihnen diese obige Lösung nicht viel, da sie ein Problem löst, indem ein anderes der gleichen Art erstellt wird.
Was Sie eigentlich tun sollten, ist, ein GPG-Schlüsselpaar zu erstellen (und Ihren öffentlichen Schlüssel auf einem Schlüsselserver zu veröffentlichen), Ihr Skript damit zu signieren und die komprimierte signierte Binärdatei zum Download anzubieten. Lassen Sie dann den Client das Skript
gpg
erneut überprüfen und entschlüsseln und führen Sie es bei Erfolg aus.quelle
'^\w+ '
stattdessen greift'^\w+'
, was nicht funktioniert. Das einzige, was für meine Bedürfnisse fehlt, ist die Angabe des SHA256-Hash innerhalb des Einzeilers. Gibt es einen saubereren Weg, dies zu tun alsh=$(mktemp); t=$(mktemp); echo '14b652ef7e7a5b3ae92351ee9695bce956a904db562f16a7c48cfcd3f4b7c937' > $h; wget 'https://example.com/install.sh' -qO "$t" && if sha256sum "$t" |grep -Eo '^\w+' |cmp -s $h ; then bash "$t" ; else echo ERROR: Invalid SHA256 hash ; fi ; rm "$t"; rm "$h";
?gpg --keyserver pgp.mit.edu --recv-keys <GPG pub key SHA1 fingerprint> && wget https://example.com/install.sh{,.asc} -q && gpg --verify install.sh{.asc,} && bash install.sh
Da GPG-Fingerabdrücke unsicheren SHA-1-Hash verwenden , handelt es sich hier um einen Einzeiler, der die Authentifizierung mit inoffiziellem SHA256-Hash ermöglicht, der aus dem öffentlichen Schlüssel mit berechnet wird
gpg --export <key ID> | sha256sum
Befehl:
h="<SHA256 hash of exported public key>"; fp="<PGP key SHA1 fingerprint>"; f='key.pub'; gpg --keyserver pgp.mit.edu --recv $fp && gpg --export $fp > $f && if sha256sum $f | grep -Eo '^\w+' | cmp -s <(echo $h); then rm $f && wget https://example.com/install.sh{,.asc} -q && gpg --verify install.sh{.asc,} && bash install.sh; else rm $f; echo "ERROR: Signing key had invalid SHA256 hash"; fi;
quelle