Mögliche Befehle zum Generieren einer Prüfsumme
Leider gibt es kein Standarddienstprogramm zum Generieren einer kryptografischen Prüfsumme. Es gibt ein Standarddienstprogramm zum Generieren eines CRC : cksum
; Dies kann ausreichen, um Änderungen in einer nicht feindlichen Umgebung zu erkennen.
Ich würde empfehlen, SHA1 anstelle von MD5 zu verwenden. Es gibt nicht viele Systeme mit einem MD5-Dienstprogramm, aber ohne SHA1. Wenn Sie kryptografische Prüfsummen verwenden, können Sie auch einen Algorithmus ohne bekannte Methode zum Auffinden von Kollisionen verwenden (vorausgesetzt, Sie überprüfen auch die Größe).
Ein Tool, das nicht Standard ist, aber häufig verwendet wird und Digests berechnen kann, ist OpenSSL . Es ist für Cygwin, Debian und OSX verfügbar, aber leider nicht Teil der Standardinstallation unter OSX.
openssl dgst -sha1
Unter OSX 10.6 gibt es ein shasum
Dienstprogramm, das auch unter Debian vorhanden ist (es ist Teil desperl
Pakets) vorhanden ist, und ich glaube auch unter Cygwin. Dies ist ein Perl-Skript. Auf den meisten Unix-Systemen ist Perl installiert, sodass Sie dieses Skript neben Ihrem Makefile bündeln können, wenn Sie befürchten, dass dieses Skript nicht überall verfügbar ist.
Auswahl des richtigen Befehls für Ihr System
Angenommen, Sie können wirklich keinen Befehl finden, der überall funktioniert.
In der Schale
Verwenden Sie die type
integrierte Funktion, um festzustellen, ob ein Befehl verfügbar ist.
sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org
GNU machen
Mit der shell
Funktion können Sie beim Laden des Makefiles ein Shell-Snippet ausführen und die Ausgabe in einer Variablen speichern.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Portable (POSIX) machen
Sie können Shell-Befehle nur in Regeln ausführen, daher muss jede Regel, die eine Prüfsumme berechnet, den Suchcode enthalten. Sie können das Snippet in eine Variable einfügen. Denken Sie daran, dass separate Zeilen in Regeln unabhängig voneinander ausgewertet werden. Denken Sie auch daran, dass $
Zeichen, die an die Shell übergeben werden sollen, maskiert werden müssen $$
.
determine_sum = \
sum=; \
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
done; \
if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
checksums.dat: FORCE
$(determine_sum); \
$$sum *.org
autotools