Perintah yang mungkin untuk menghasilkan checksum
Sayangnya, tidak ada utilitas standar untuk menghasilkan checksum kriptografi. Ada utilitas standar untuk menghasilkan CRC: cksum
; ini mungkin cukup untuk tujuan Anda mendeteksi perubahan di lingkungan yang tidak bermusuhan.
Saya akan merekomendasikan menggunakan SHA1 daripada MD5. Tidak banyak sistem yang memiliki utilitas MD5 tetapi tidak ada SHA1, dan jika Anda akan menggunakan checksum kriptografi, Anda mungkin juga menggunakan algoritma tanpa metode yang diketahui untuk menemukan tabrakan (dengan asumsi Anda juga memeriksa ukurannya).
Salah satu alat yang tidak standar tetapi umum dan dapat menghitung pencernaan adalah OpenSSL . Ini tersedia untuk Cygwin, Debian dan OSX, tetapi sayangnya bukan bagian dari instalasi default di OSX.
openssl dgst -sha1
Pada OSX 10.6, ada shasum
utilitas, yang juga ada di Debian (itu bagian dari perl
paket) dan saya percaya pada Cygwin juga. Ini adalah skrip Perl. Sebagian besar sistem unix memasang Perl, sehingga Anda dapat menggabungkan skrip tersebut bersama makefile Anda jika Anda khawatir skrip ini tidak tersedia di mana-mana.
Memilih perintah yang tepat untuk sistem Anda
Oke, katakanlah Anda benar-benar tidak dapat menemukan perintah yang berfungsi di mana-mana.
Di dalam shell
Gunakan type
built-in untuk melihat apakah perintah tersedia.
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 membuat
Anda dapat menggunakan shell
fungsi untuk menjalankan potongan shell ketika makefile dimuat dan menyimpan output dalam suatu variabel.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Portable (POSIX) buat
Anda hanya dapat menjalankan perintah shell dalam aturan, sehingga setiap aturan yang menghitung checksum harus berisi kode pencarian. Anda dapat menempatkan potongan dalam variabel. Ingatlah bahwa baris yang terpisah dalam aturan dievaluasi secara independen. Juga ingat bahwa $
tanda - tanda yang akan diteruskan ke shell perlu diloloskan $$
.
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