Saya mencari perintah atau utilitas untuk menghitung md5 , nilai hash sha1 oleh satu perintah.
Saat ini ubuntu memiliki sha1sumdan md5sumperintah untuk menghitung hashnilai.
Mengapa kamu menginginkannya? Biasanya Anda ingin dapat memverifikasi hash setelah membuatnya. Misalnya, untuk menghasilkan hash: md5sum hosts. Kemudian, untuk memverifikasi hasil ini: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(harus memberikan: hosts: OK)
Lekensteyn
2
misalkan jika ingin menghitung 'nilai hash' hard drive 500 GB yaitu sha1 dan md5. jika saya menghitung satu per satu (menggunakan sha1sum dan md5sum) akan membutuhkan waktu ganda. tetapi jika bisa dilakukan dengan utilitas tunggal sama dengan perangkat lunak windows maka akan menjadi jawaban yang saya inginkan.
MS Parmar
Jawaban:
9
Anda dapat mencapai ini dengan bash ninja-fu. :)
Anda tahu prosedur untuk menghitung satu per satu:
Sunting: seperti yang disarankan @gertvdijk, dan membaca halaman info sedikit lebih banyak, ini dapat dilakukan secara langsung dengan tee dan Proses Pergantian didukung oleh shell modern, tanpa arahan ulang. Dengan cara ini Anda dapat meneruskan data Anda ke dua proses dan satu file menggunakan tee:
$ echo abc | tee >(md5sum) >(sha1sum) > output.txt
Mungkin juga untuk melakukan rantai jika Anda membutuhkan lebih banyak, tetapi Anda harus mengurus STDOUT dari semua subproses. Ini TIDAK akan memberi Anda hasil yang diharapkan, tetapi mencampur dua checksum pertama bersama dengan data di output.txt:
$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt
Jika Anda mengarahkan checksum ke file di dalam proses yang disubstitusi, Anda dapat memilah ini sesuka Anda:
Inilah saran awal saya tanpa substitusi proses, tetapi memungkinkan chaining / penggunaan rekursif tanpa mencampurkan data dan output:
$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1 -
03cfd743661f07975fa2f1220c5194cbaff48451 -
Kuncinya di sini adalah menggunakan tee, yang menggandakan data ke STDOUT dan file. Kami pandai dengan menyuruhnya menulis data ke file / proc / self / fd / 2, yang kebetulan selalu menjadi deskriptor file STDERR proses saat ini. Dan dengan > >(program)sintaks kita dapat mengarahkan setiap deskriptor file ke program STDIN daripada file. Sama seperti |, tetapi dengan kontrol lebih. > >(md5sum)pengalihan STDOUT ke md5sumprogram, sementara 2> >(sha1sum)pengalihan STDERR ke sha1sumprogram.
Perhatikan bahwa urutan 2>dan >tampaknya penting, saya harus menempatkan 2>dulu pada baris perintah. Ini dievaluasi dari kanan ke kiri, tetapi saya tidak yakin mengapa ini membuat perbedaan.
Untuk melakukan ini pada file atau hard drive, Anda harus mengganti "echo abc" dengan cat atau dd, misalnya:
dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
Hal bagus tentang ini adalah Anda dapat benar-benar melakukan recurse dan menjalankan beberapa sekaligus, bukan hanya dua. Sintaksnya menjadi berbulu, tetapi ini bekerja:
echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)
Jika Anda ingin menangkap hasilnya dan menggunakannya dalam skrip, itu juga berfungsi:
A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))
Sekarang $Aadalah string yang berisi semua output, termasuk baris baru. Anda juga dapat menguraikan nilai-nilai nanti:
+1. teedan penggunaan pengalihan output yang cerdas dalam shell adalah cara yang harus dilakukan. Ini menghemat banyak sumber daya, terutama saat membaca file besar.
gertvdijk
2
Ngomong-ngomong, saya pikir Anda tidak perlu mengarahkan ulang ke stderr untuk menduplikasi output stream. Penggunaan subkulit juga akan melakukan trik, mempertahankan stderr. Lihat contoh saya di sini di posting blog .
gertvdijk
@ gertvdijk Benar, proses substitusi lebih bersih, dan lebih mudah untuk dirantai (Anda tidak perlu berulang). Saya akan memperbarui tanggapan saya.
ketil
Bagus. Saya akan memberi Anda dukungan lagi jika saya bisa. :-)
gertvdijk
Meskipun ini bekerja dengan baik untuk file kecil yang bagus, Anda menggandakan upaya dan waktu pemrosesan untuk file yang lebih besar yang saya ingin hindari ...
EkriirkE
3
Tidak dapat membantu Anda dengan baris perintah tapi saya tahu alat GUI bernama quickhash.
Linux dan Windows GUI untuk mengaktifkan pemilihan cepat dan hashing file berikutnya (secara individu atau secara rekursif di seluruh struktur folder) teks dan (pada Linux) disk. Dirancang untuk Linux, tetapi juga tersedia untuk Windows. MD5, SHA1, SHA256, SHA512 tersedia. Output disalin ke clipboard atau disimpan sebagai file CSV \ HTML.
Here i have find one python script from source which calculate hash values. and also i find some statistics about hash value calculation.
- `md5sum` takes 00:3:00 min to calculate 4GB USB.
- `sha2sum` takes 00:3:01 min to calculate 4GB USB.
- While phython script takes 3:16 min to calculate both MD5 and SHA1.
// Script mulai dari sini
def get_custom_checksum(input_file_name):
from datetime import datetime
starttime = datetime.now()
# START: Actual checksum calculation
from hashlib import md5, sha1, sha224, sha384, sha256, sha512
#chunk_size = 1 # 1 byte -- NOT RECOMENDED -- USE AT LEAST 1KB. When 1KB takes 1 min to run, 1B takes 19 minutes to run
#chunk_size = 1024 # 1 KB
chunk_size = 1048576 # 1024 B * 1024 B = 1048576 B = 1 MB
file_md5_checksum = md5()
file_sha1_checksum = sha1()
try:
with open(input_file_name, "rb") as f:
byte = f.read(chunk_size)
previous_byte = byte
byte_size = len(byte)
file_read_iterations = 1
while byte:
file_md5_checksum.update(byte)
file_sha1_checksum.update(byte)
previous_byte = byte
byte = f.read(chunk_size)
byte_size += len(byte)
file_read_iterations += 1
except IOError:
print ('File could not be opened: %s' % (input_file_name))
#exit()
return
except:
raise
# END: Actual checksum calculation
# For storage purposes, 1024 bytes = 1 kilobyte
# For data transfer purposes, 1000 bits = 1 kilobit
kilo_byte_size = byte_size/1024
mega_byte_size = kilo_byte_size/1024
giga_byte_size = mega_byte_size/1024
bit_size = byte_size*8
kilo_bit_size = bit_size/1000
mega_bit_size = kilo_bit_size/1000
giga_bit_size = mega_bit_size/1000
last_chunk_size = len(previous_byte)
stoptime = datetime.now()
processtime = stoptime-starttime
custom_checksum_profile = {
'starttime': starttime,
'byte_size': byte_size,
'kilo_byte_size': kilo_byte_size,
'mega_byte_size': mega_byte_size,
'giga_byte_size': giga_byte_size,
'bit_size': bit_size,
'kilo_bit_size': kilo_bit_size,
'mega_bit_size': mega_bit_size,
'giga_bit_size': giga_bit_size,
'file_read_iterations': file_read_iterations,
'last_chunk_size': last_chunk_size,
'md5_checksum': file_md5_checksum.hexdigest(),
'sha1_checksum': file_sha1_checksum.hexdigest(),
'stoptime': stoptime,
'processtime': processtime,
}
return custom_checksum_profile
def print_custom_checksum(input_file_name):
custom_checksum_profile = get_custom_checksum(input_file_name)
try:
print 'Start Time ::', custom_checksum_profile['starttime']
custom_checksum_profile ['file_read_iterations']) # print ('Last Chunk (bytes):', custom_checksum_profile ['last_chunk_size']) cetak 'MD5 ::', custom_checksum_profile ['md5_checksum'] print 'SHA1check' custom_chum ' '] cetak' Stop Time :: ', custom_checksum_profile [' stoptime '] cetak' Processing Time :: ', custom_checksum_profile [' processtime '] kecuali TypeError: # objek' NoneType 'tidak dapat disubkripsikan --- pada dasarnya ini harus terjadi ketika file input tidak dapat dibuka # naik pass # csv output
import argparse
script_version='0.0.2'
parser = argparse.ArgumentParser(description='Determine and print various checksums of an input file and its size. Supported checksums are MD5, SHA1, SHA224, SHA256, SHA384, and SHA512.', version=script_version)
parser.add_argument('-f', '--file', metavar='in-file', action='store', dest='file_name', type=str, required=True, help='Name of file for which the checksum needs to be calculated')
args = parser.parse_args()
print 'Processing File ::', args.file_name
print_custom_checksum(args.file_name)
md5sum hosts
. Kemudian, untuk memverifikasi hasil ini:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(harus memberikan:hosts: OK
)Jawaban:
Anda dapat mencapai ini dengan bash ninja-fu. :)
Anda tahu prosedur untuk menghitung satu per satu:
Sunting: seperti yang disarankan @gertvdijk, dan membaca halaman info sedikit lebih banyak, ini dapat dilakukan secara langsung dengan tee dan Proses Pergantian didukung oleh shell modern, tanpa arahan ulang. Dengan cara ini Anda dapat meneruskan data Anda ke dua proses dan satu file menggunakan tee:
Mungkin juga untuk melakukan rantai jika Anda membutuhkan lebih banyak, tetapi Anda harus mengurus STDOUT dari semua subproses. Ini TIDAK akan memberi Anda hasil yang diharapkan, tetapi mencampur dua checksum pertama bersama dengan data di output.txt:
Jika Anda mengarahkan checksum ke file di dalam proses yang disubstitusi, Anda dapat memilah ini sesuka Anda:
Inilah saran awal saya tanpa substitusi proses, tetapi memungkinkan chaining / penggunaan rekursif tanpa mencampurkan data dan output:
Kuncinya di sini adalah menggunakan
tee
, yang menggandakan data ke STDOUT dan file. Kami pandai dengan menyuruhnya menulis data ke file / proc / self / fd / 2, yang kebetulan selalu menjadi deskriptor file STDERR proses saat ini. Dan dengan> >(program)
sintaks kita dapat mengarahkan setiap deskriptor file ke program STDIN daripada file. Sama seperti|
, tetapi dengan kontrol lebih.> >(md5sum)
pengalihan STDOUT kemd5sum
program, sementara2> >(sha1sum)
pengalihan STDERR kesha1sum
program.Perhatikan bahwa urutan
2>
dan>
tampaknya penting, saya harus menempatkan2>
dulu pada baris perintah. Ini dievaluasi dari kanan ke kiri, tetapi saya tidak yakin mengapa ini membuat perbedaan.Untuk melakukan ini pada file atau hard drive, Anda harus mengganti "echo abc" dengan cat atau dd, misalnya:
Hal bagus tentang ini adalah Anda dapat benar-benar melakukan recurse dan menjalankan beberapa sekaligus, bukan hanya dua. Sintaksnya menjadi berbulu, tetapi ini bekerja:
Jika Anda ingin menangkap hasilnya dan menggunakannya dalam skrip, itu juga berfungsi:
Sekarang
$A
adalah string yang berisi semua output, termasuk baris baru. Anda juga dapat menguraikan nilai-nilai nanti:Saya tidak yakin Anda memiliki jaminan tentang pemesanan output.
sumber
tee
dan penggunaan pengalihan output yang cerdas dalam shell adalah cara yang harus dilakukan. Ini menghemat banyak sumber daya, terutama saat membaca file besar.Tidak dapat membantu Anda dengan baris perintah tapi saya tahu alat GUI bernama quickhash.
Anda dapat mengunduh alat itu dari Quickhash
Deskripsi:
sumber
// Script mulai dari sini
custom_checksum_profile ['file_read_iterations']) # print ('Last Chunk (bytes):', custom_checksum_profile ['last_chunk_size']) cetak 'MD5 ::', custom_checksum_profile ['md5_checksum'] print 'SHA1check' custom_chum ' '] cetak' Stop Time :: ', custom_checksum_profile [' stoptime '] cetak' Processing Time :: ', custom_checksum_profile [' processtime '] kecuali TypeError: # objek' NoneType 'tidak dapat disubkripsikan --- pada dasarnya ini harus terjadi ketika file input tidak dapat dibuka # naik pass # csv output
sumber