Wenn Sie diesen Befehl auf Ihrem Unix ausführen
echo -n "foo" | openssl dgst -sha1
Sie erhalten diese Ausgabe:
(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
(gefolgt von einer neuen Zeile).
Wie kann ich OpenSSL zwingen, das Präfix nicht anzuzeigen (stdin)=
und den nachstehenden Zeilenumbruch zu vermeiden?
Antwort1
Das Rohbinärformat fügt keine überflüssige Ausgabe hinzu.
Ausgabe als Binärdatei, dann Konvertierung in Hex:
echo -n "foo" | openssl dgst -sha1 -binary | xxd -p
Ich gebe Ihnen Folgendes:
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
Diese Methode sollte zukunftssicher sein, falls jemand beschließt, das Textausgabeformat erneut zu ändern. Ich bin sicher, dass sie das Präfix auf „SHA1(stdin)= “ ändern werden, damit es mit dem einer Dateieingabe übereinstimmt.
Ich kann nicht glauben, dass sie das geändert haben! Ich frage mich, wie viele Skripte kaputt waren.
Antwort2
Ich beobachte dieses Verhalten unter OpenSSL 1.0.0e auf Ubuntu 11.10, während OpenSSL 0.9.8k und 0.9.8t nur den Hash ausgeben. Die Befehlszeile von OpenSSL ist nicht auf Flexibilität ausgelegt, sondern eher eine schnelle und einfache Möglichkeit, kryptografische Berechnungen von der Befehlszeile aus durchzuführen.
Wenn Sie OpenSSL verwenden möchten, filtern Sie die Ausgabe:
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
Unter Linux (mit GNU-Tools oder BusyBox) können Siesha1sum
, das keine Installation von OpenSSL erfordert und ein stabiles Ausgabeformat hat. Es druckt immer einen Dateinamen, also entfernen Sie diesen.
echo -n "foo" | sha1sum | sed 's/ .*//'
Auf BSD-Systemen einschließlich OSX können Siesha1
.
echo -n "foo" | sha1 -q
Alle diese Befehle geben die Prüfsumme in Hexadezimalschreibweise aus, gefolgt von einem Zeilenumbruch. Text unter Unix-Systemen besteht immer aus einer Folge von Zeilen, und jede Zeile endet mit einem Zeilenumbruchzeichen. Wenn Sie die Ausgabe des Befehls in einer Shell-Variable speichern, wird der letzte Zeilenumbruch entfernt.
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
Wenn Sie die Eingabe in ein Programm weiterleiten müssen, das eine Prüfsumme ohne abschließende Zeilenumbruchfunktion erfordert (was sehr selten vorkommt), entfernen Sie den Zeilenumbruch.
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
Antwort3
Hier ist eine weitere Alternative:
echo -n "foo" | openssl sha1 | awk '{print $2}'
Antwort4
So geht das mit integrierten Bash-Funktionen statt mit Pipes, awk, sed, tr, cut usw.:
output="$(openssl sha1 <(printf foo))"; echo ${output/* }