Kết xuất tổng kiểm tra md5 và sha1 bằng một lệnh duy nhất!


9

Tôi đang tìm kiếm lệnh hoặc tiện ích để tính giá trị băm md5 , sha1 bằng một lệnh.
Ngay bây giờ ubfox có sha1summd5sumlệnh để tính hashgiá trị.


2
Tại sao bạn muốn nó? Thông thường bạn muốn có thể xác minh băm sau khi tạo chúng. Ví dụ: để tạo hàm băm : md5sum hosts. Sau đó, để xác minh kết quả này: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(nên đưa ra hosts: OK:)
Lekensteyn

2
giả sử nếu muốn tính 'giá trị băm' của ổ cứng 500 GB, tức là cả sha1 và md5. nếu tôi tính toán từng cái một (sử dụng sha1sum và md5sum) sẽ mất gấp đôi thời gian. nhưng nếu có thể được thực hiện với các tiện ích đơn lẻ giống như phần mềm windows thì đó sẽ là câu trả lời mong muốn của tôi.
MS Parmar

Câu trả lời:


9

Bạn có thể đạt được điều này với một số ninja bash thích hợp. :)

Bạn biết thủ tục để tính toán từng cái một:

$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1  -
$ echo abc | sha1sum
03cfd743661f07975fa2f1220c5194cbaff48451  -

Chỉnh sửa: như @gertvdijk đã đề xuất và đọc các trang thông tin thêm một chút, điều này có thể được thực hiện trực tiếp với tee và Thay thế quy trình được hỗ trợ bởi các trình bao hiện đại, không cần chuyển hướng. Bằng cách này, bạn có thể chuyển dữ liệu của mình đến hai quy trình và một tệp bằng cách sử dụng tee:

$ echo abc | tee >(md5sum) >(sha1sum) > output.txt

Cũng có thể xâu chuỗi nếu bạn cần nhiều hơn, nhưng bạn phải chăm sóc STDOUT từ tất cả các quy trình con. Điều này sẽ KHÔNG cung cấp cho bạn kết quả mong đợi, nhưng trộn hai tổng đầu tiên cùng với dữ liệu trong output.txt:

$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt

Nếu bạn chuyển hướng tổng kiểm tra đến một tệp bên trong các quy trình được thay thế, bạn có thể xâu chuỗi chúng theo ý muốn:

$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt

Đây là đề xuất ban đầu của tôi mà không cần thay thế quy trình, nhưng cho phép sử dụng chuỗi / đệ quy mà không trộn lẫn dữ liệu và đầu ra:

$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1  -
03cfd743661f07975fa2f1220c5194cbaff48451  -

Mẹo ở đây là sử dụng tee, sao chép dữ liệu thành STDOUT và một tệp. Chúng tôi đang thông minh bằng cách yêu cầu nó ghi dữ liệu vào tệp / Proc / self / fd / 2, điều này luôn luôn là mô tả tệp STDERR của quy trình hiện tại. Và với > >(program)cú pháp, chúng ta có thể chuyển hướng từng bộ mô tả tệp sang STDIN của chương trình thay vì tệp. Chỉ thích |, nhưng với sự kiểm soát nhiều hơn. > >(md5sum)chuyển hướng STDOUT đến md5sumchương trình, trong khi 2> >(sha1sum)chuyển hướng STDERR đến sha1sumchương trình.

Lưu ý rằng thứ tự 2>>dường như có vấn đề, tôi phải đặt 2>đầu tiên trên dòng lệnh. Chúng được đánh giá từ phải sang trái, nhưng tôi không chắc tại sao điều này lại tạo ra sự khác biệt.

Để thực hiện việc này trên tệp hoặc ổ cứng, bạn nên thay thế "echo abc" bằng một con mèo hoặc một dd, ví dụ:

dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)

Điều tiện lợi về điều này là bạn thực sự có thể tái diễn và chạy một số cùng một lúc, không chỉ hai. Cú pháp có lông, nhưng điều này hoạt động:

echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)

Nếu bạn muốn nắm bắt kết quả và sử dụng nó trong một tập lệnh, điều đó cũng hoạt động:

A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))

Bây giờ $Alà một chuỗi chứa tất cả đầu ra, bao gồm cả dòng mới. Bạn cũng có thể phân tích các giá trị sau:

echo "checksum=[$(echo "$A" | head -1 | cut -d " " -f 1)]"

Tôi không chắc chắn rằng bạn có bất kỳ đảm bảo về việc đặt hàng đầu ra mặc dù.


2
+1. teevà sử dụng thông minh chuyển hướng đầu ra trong vỏ là cách để đi. Điều này tiết kiệm rất nhiều tài nguyên, đặc biệt là khi đọc các tệp lớn.
gertvdijk

2
Nhân tiện, tôi nghĩ bạn không cần phải chuyển hướng đến thiết bị lỗi chuẩn để sao chép đầu ra của luồng. Việc sử dụng một subshell cũng sẽ thực hiện các mẹo, duy trì stderr. Xem ví dụ của tôi ở đây trong một bài viết trên blog .
gertvdijk

@gertvdijk Đúng, quá trình thay thế sẽ sạch hơn và dễ dàng hơn trong chuỗi (bạn không cần phải lặp lại). Tôi sẽ cập nhật phản hồi của tôi.
ketil

Đẹp. Tôi sẽ cung cấp cho bạn một upvote khác nếu tôi có thể. :-)
gertvdijk

Mặc dù các tệp này hoạt động tốt đối với các tệp nhỏ đẹp, nhưng bạn đang nhân đôi nỗ lực và thời gian xử lý cho các tệp lớn hơn mà tôi đang tìm cách tránh ...
EkriirkE

3

Không thể giúp bạn với dòng lệnh nhưng tôi biết một công cụ GUI có tên là quickhash.

Bạn có thể tải xuống công cụ đó từ Quickhash

Sự miêu tả:

GUI Linux và Windows để cho phép lựa chọn nhanh và băm các tệp (riêng lẻ hoặc đệ quy trong toàn bộ cấu trúc thư mục) và các đĩa (trên Linux). Được thiết kế cho Linux, nhưng cũng có sẵn cho Windows. MD5, SHA1, SHA256, SHA512 có sẵn. Đầu ra được sao chép vào clipboard hoặc được lưu dưới dạng tệp CSV \ HTML.


0
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.

// Kịch bản bắt đầu từ đây

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_iter_' '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Thời gian xử lý :: ', custom_checksum_profile [' processtime '] ngoại trừ đối tượng TypeError: không thể mở tệp đầu vào #raise 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.