단일 명령으로 md5 및 sha1 체크섬을 덤프하십시오!


9

하나의 명령으로 md5 , sha1 해시 값 을 계산하기위한 명령 또는 유틸리티를 찾고 있습니다.
지금 우분투는이 sha1summd5sum계산 명령 hash값입니다.


2
왜 그것을 원하십니까? 일반적으로 해시를 생성 한 후 확인할 수 있기를 원합니다. 예를 들어, 해시를 생성하려면 다음을 수행하십시오 md5sum hosts. 그리고,이 결과를 확인한다 : echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(수득한다 : hosts: OK)
Lekensteyn

2
500GB 하드 드라이브의 '해시 값', 즉 sha1과 md5를 계산하려는 경우를 가정 해보십시오. sha1sum과 md5sum을 사용하여 하나씩 하나씩 계산하면 두 배의 시간이 걸립니다. 그러나 Windows 소프트웨어와 동일한 단일 유틸리티로 수행 할 수 있다면 원하는 대답이 될 것입니다.
MS Parmar

답변:


9

적절한 bash ninja-fu로 이것을 달성 할 수 있습니다. :)

한 번에 하나씩 계산하는 절차를 알고 있습니다.

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

편집 : @gertvdijk가 제안한 것처럼 정보 페이지를 조금 더 읽으면 현대 쉘에서 지원하는 티 및 프로세스 대체를 통해 리디렉션없이 직접 수행 할 수 있습니다. 이 방법으로 tee를 사용하여 데이터를 두 개의 프로세스와 하나의 파일로 전달할 수 있습니다.

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

더 필요한 경우 체인으로 연결할 수도 있지만 모든 하위 프로세스에서 STDOUT을 처리해야합니다. 이렇게하면 예상 한 결과가 나오지 않지만 처음 두 개의 체크섬을 output.txt의 데이터와 함께 혼합합니다.

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

체크섬을 대체 프로세스 내의 파일로 경로 재지 정하는 경우 원하는대로 이들을 연결할 수 있습니다.

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

다음은 프로세스 대체가없는 초기 제안이지만 데이터와 출력을 혼합하지 않고 체인 / 재귀 사용을 허용합니다.

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

여기서의 트릭은을 사용 tee하는 것인데, 이는 데이터를 STDOUT과 파일에 복제합니다. 우리는 데이터를 / proc / self / fd / 2 파일에 쓰도록 지시함으로써 영리 해지고 있습니다. 이것은 항상 현재 프로세스의 STDERR 파일 기술자입니다. 그리고 > >(program)구문을 사용하여 각 파일 설명자를 파일 대신 프로그램의 STDIN으로 리디렉션 할 수 있습니다. 마찬가지로 |제어 기능이 향상되었습니다. > >(md5sum)STDER을 md5sum프로그램으로 2> >(sha1sum)리디렉션하고 STDERR을 sha1sum프로그램으로 리디렉션 합니다.

의 순서주의 2>와는 >상관 것 같다, 내가 넣어야 할 2>명령 줄에서 첫 번째. 이들은 오른쪽에서 왼쪽으로 평가되지만 이것이 왜 차이가 나는지 잘 모르겠습니다.

파일이나 하드 드라이브에서이 작업을 수행하려면 "echo abc"를 고양이 나 dd로 바꿔야합니다. 예 :

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

이것에 대한 멋진 점은 실제로 두 개가 아닌 여러 개를 동시에 재귀하고 실행할 수 있다는 것입니다. 구문은 털이 있지만 작동합니다.

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

결과를 캡처하여 스크립트에서 사용하려는 경우에도 작동합니다.

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

이제 $A개행을 포함하여 모든 출력을 포함하는 문자열입니다. 나중에 값을 파싱 할 수도 있습니다.

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

그래도 출력 순서와 관련하여 보장 할 수는 없습니다.


2
+1. tee쉘에서 출력 리디렉션을 영리하게 사용하는 것이 좋습니다. 이렇게하면 특히 큰 파일을 읽을 때 많은 리소스가 절약됩니다.
gertvdijk

2
그건 그렇고, 스트림의 출력을 복제하기 위해 stderr로 리디렉션 할 필요가 없다고 생각합니다. 서브 쉘을 사용하면 stderr을 유지하면서 트릭을 수행 할 수 있습니다. 블로그 게시물 에서 내 예제를 참조하십시오 .
gertvdijk

@gertvdijk 맞습니다. 프로세스 대체는 더 깨끗하고 연결하기 쉽습니다 (재귀 할 필요가 없습니다). 응답을 업데이트하겠습니다.
ketil

좋은. 내가 할 수 있다면 또 다른 공감대를 줄께 :-)
gertvdijk

이것들은 아주 작은 파일에 대해서는 잘 작동하지만, 내가 피하려고하는 더 큰 파일에 대한 노력과 처리 시간을 두 배로 늘리고 있습니다.
EkriirkE

3

캔 트는 명령 줄을 도와 주지만 quickhash 라는 GUI 도구를 알고 있습니다.

Quickhash 에서 해당 도구를 다운로드 할 수 있습니다.

기술:

Linux 및 Windows GUI는 파일 (폴더 구조 전체에서 개별적으로 또는 재귀 적으로) 텍스트 및 (Linux) 디스크의 빠른 선택 및 후속 해싱을 가능하게합니다. Linux 용으로 설계되었지만 Windows에서도 사용할 수 있습니다. MD5, SHA1, SHA256, SHA512 사용 가능 출력을 클립 보드로 복사하거나 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.

// 여기부터 스크립트 시작

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']) print 'MD5 ::', custom_checksum_profile [ 'md5_checksum'] print 'SHA1 ::', custom_checksum_profile [ 'sha1_checksum '] Print'Stop Time :: ', custom_checksum_profile ['stoptime '] print'Processing Time :: ', type_Error를 제외한 custom_checksum_profile ['processtime '] print : #'NoneType '개체는 첨자화할 수 없습니다 --- 기본적으로 입력 파일을 열 수 없습니다. #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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.