Posibles comandos para generar una suma de comprobación
Desafortunadamente, no hay una utilidad estándar para generar una suma de verificación criptográfica. Hay una utilidad estándar para generar una CRC: cksum
; Esto puede ser suficiente para su propósito de detectar cambios en un entorno no hostil.
Recomendaría usar SHA1 en lugar de MD5. No hay muchos sistemas que tengan una utilidad MD5 pero no SHA1, y si va a usar sumas de verificación criptográficas, también podría usar un algoritmo sin método conocido para encontrar colisiones (suponiendo que también verifique el tamaño).
Una herramienta que no es estándar pero sí común y puede calcular resúmenes es OpenSSL . Está disponible para Cygwin, Debian y OSX, pero desafortunadamente no forma parte de la instalación predeterminada en OSX.
openssl dgst -sha1
En OSX 10.6, hay una shasum
utilidad, que también está presente en Debian (es parte del perl
paquete) y también creo en Cygwin. Este es un script de Perl. La mayoría de los sistemas Unix tienen instalado Perl, por lo que puede agrupar ese script junto con su archivo MAKE si le preocupa que este script no esté disponible en todas partes.
Seleccionar el comando correcto para su sistema
Ok, digamos que realmente no puedes encontrar un comando que funcione en todas partes.
En la cáscara
Use el type
incorporado para ver si hay un comando disponible.
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 make
Puede usar la shell
función para ejecutar un fragmento de shell cuando se carga el archivo MAKE y almacenar la salida en una variable.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Marca portátil (POSIX)
Solo puede ejecutar comandos de shell en la regla, por lo que cada regla que calcule una suma de verificación debe contener el código de búsqueda. Puedes poner el fragmento en una variable. Recuerde que las líneas separadas en las reglas se evalúan de forma independiente. También recuerde que las $
señales que se deben pasar al shell deben escaparse $$
.
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