sha1sum cho một thư mục của các thư mục


33
sha1sum ./path/to/directory/* | sha1sum 

ở trên đã được đăng lên như một cách để tính toán sha1sum của một thư mục chứa các tệp. Lệnh này thất bại nếu thư mục bao gồm nhiều thư mục hơn. Có cách nào để tính toán đệ quy sha1sum của một thư mục các thư mục một cách phổ quát (mà không cần tùy chỉnh phù hợp một thuật toán cho thư mục cụ thể trong câu hỏi) không?

Câu trả lời:


14

Nhờ bài đăng SO này -

find . -type f \( -exec sha1sum "$PWD"/{} \; \) | sha1sum

Cảnh báo: Mã này chưa được kiểm tra ! Chỉnh sửa câu hỏi này nếu nó sai và bạn có thể sửa nó; Tôi sẽ chấp nhận chỉnh sửa của bạn.


Lấy làm tiếc; Tôi không thể cưỡng lại! ;-) Đệ quy là niềm vui. Tất nhiên là có một cách. Tôi sẽ viết lên một câu trả lời thích hợp bây giờ.
allquixotic

3
Điều này sẽ không tạo ra cùng một hàm băm cho cùng một thư mục trên các máy khác nhau vì đầu ra cũng chứa <hash> và <đường dẫn tệp> đường dẫn tệp khác nhau trên các máy khác nhau và gây ra băm khác nhau trên các máy khác nhau. Dòng chính xác phải giống như find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum@allquixotic
alper

1
Ngoài ra, việc băm các tệp phải theo thứ tự cũng sẽ gây ra các giá trị băm khác nhau nếu thứ tự sắp xếp khác nhau trên các máy khác nhau.
alper

40

Tôi thường thích mẫu "find | xargs", như vậy:

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

Bạn phải sử dụng "-print0" và "-0", trong trường hợp có khoảng trắng trong tên tệp.

Tuy nhiên, điều này rất giống với mẫu "find -exec cmd {}".

Xem một cuộc thảo luận so sánh hai mẫu ở đây: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs


Câu trả lời của bạn chỉ trả về hàm băm của các tập tin. Hash của thư mục nên được lấy bằng cách sử dụng find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum.
alper

5

CẬP NHẬT: Đã vài năm kể từ khi tôi đăng bài trả lời này và trong thời gian đó tôi đã viết lại và cải thiện kịch bản tôi đã trình bày ở đây nhiều lần. Tôi đã quyết định đăng lại kịch bản mới như một câu trả lời hoàn toàn mới. Tôi rất muốn giới thiệu nó qua cái này.

GIỚI THIỆU

Tôi đã quan sát thấy thứ tự mà lệnh find xuất ra các phần tử tìm thấy trong một thư mục khác nhau trong các thư mục giống hệt nhau trên các phân vùng khác nhau. Nếu bạn đang so sánh các giá trị băm của cùng một thư mục, bạn không phải lo lắng về điều đó nhưng nếu bạn nhận được các giá trị băm để đảm bảo rằng không có tệp nào bị bỏ sót hoặc bị hỏng trong một bản sao, bạn cần bao gồm một dòng bổ sung cho sắp xếp nội dung của thư mục và các yếu tố của nó. Ví dụ, câu trả lời của Matthew Bohnsack khá thanh lịch:

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

Nhưng nếu bạn đang sử dụng nó để so sánh một thư mục được sao chép với thư mục gốc, bạn sẽ gửi đầu ra tới một tệp txt mà bạn sẽ so sánh với danh sách được xuất ra từ thư mục khác bằng cách sử dụng Kompare hoặc WinMerge hoặc chỉ bằng cách lấy các giá trị băm của mỗi lis . Vấn đề là, theo thứ tự mà công cụ tìm kiếm sẽ xuất nội dung có thể thay đổi từ thư mục này sang thư mục khác, Kompare sẽ báo hiệu nhiều sự khác biệt vì các giá trị băm không được sắp xếp theo cùng một thứ tự. Không phải là vấn đề lớn đối với các thư mục nhỏ nhưng khá khó chịu nếu bạn đang xử lý 30000 tệp. Do đó, bạn đã thực hiện các bước bổ sung sắp xếp đầu ra để dễ dàng so sánh danh sách băm giữa hai thư mục.

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt

Điều này sẽ sắp xếp đầu ra để các tệp có cùng hàm băm sẽ nằm trên cùng một dòng khi chạy chương trình khác biệt (với điều kiện là không có tệp nào bị thiếu thư mục mới).

VÀ TRÊN NỀN TẢNG ...

Đây là một kịch bản mà tôi đã viết. Nó thực hiện những gì giống như câu trả lời find / xarg nhưng nó sẽ sắp xếp các tệp trước khi lấy sha1sum (giữ chúng trong cùng một thư mục). Dòng đầu tiên của tập lệnh tìm tất cả các tệp trong thư mục theo cách đệ quy. Tiếp theo sắp xếp các kết quả theo thứ tự abc. Hai phần sau, lấy nội dung được sắp xếp và nối thêm dấu sha1sum và dấu ngoặc kép vào các tệp trong danh sách được sắp xếp, tạo một tập lệnh shell lớn để tính toán từng tệp băm, mỗi lần một tệp và đưa nó vào content_sha1sum.txt.

#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt

Hi vọng điêu nay co ich.


Khi tổng chiều dài của tất cả các tên tệp nằm trong dòng lệnh, việc chuyển qua sort -z( --zero-terminated) sẽ dễ dàng hơn so với việc làm rối với một loạt các tệp.
Anton Samsonov

@AntonSamsonov Đây là một kịch bản thực sự cũ, lúc đó tôi chỉ đang học kịch bản. Kể từ đó tôi đã viết lại cả đống lần. Liên quan đến nhận xét của bạn, việc không chấm dứt sẽ làm gì khi sắp xếp: Tôi đọc trang hướng dẫn sắp xếp. Họ nói rằng việc kết thúc bằng không sẽ tạo ra một byte số 0 ở cuối dòng thay vì một dòng mới. Điều đó làm gì?
thebunnyrules

Tôi đã đăng một bản cập nhật cho kịch bản này dưới dạng câu trả lời riêng biệt tại đây: superuser.com/questions/458326/NH
thebunnyrules

4

GIỚI THIỆU

Vài năm trước, tôi đã viết và trình bày (trong chính chủ đề này) một tập lệnh có thể kiểm tra chữ ký băm của tất cả các tệp riêng lẻ trong cấu trúc thư mục hiện tại và xuất ra dưới dạng danh sách trong tệp văn bản.

Kể từ đó, tôi đã tinh chỉnh công thức này nhiều lần. Tôi đã quyết định đăng lại tập lệnh mới và cải tiến của mình ở đây như một câu trả lời riêng. Nó được viết cho sha256 nhưng bất cứ ai vẫn muốn sử dụng sha1 có thể thực hiện một tìm kiếm đơn giản và thay thế trong gedit để trao đổi sha256 với sha1. Cá nhân, tôi đã không sử dụng sha1 trong một vài năm và tôi sẽ không đề xuất nó vì nó đã trở nên lỗi thời và google đã chứng minh làm thế nào nó có thể bị xâm phạm .

Đây là những gì kịch bản mới của tôi làm:

  1. Bạn chỉ có thể sử dụng tập lệnh bằng cách vào thư mục bạn muốn băm và nhập:

    sha256rec

    Ngoài ra, bạn có thể gọi tập lệnh này từ một thư mục khác bằng cách thực hiện:

    sha256rec "/path/to/target/directory/you/want/hash"
  2. Script sẽ phát hiện nếu bạn có đặc quyền ghi trong thư mục hiện tại. Nếu bạn làm như vậy, kết quả sẽ được lưu trong thư mục hiện tại. Nếu bạn không có đặc quyền ghi hoặc nếu thư mục hiện tại của bạn nằm trong hệ thống chỉ đọc (chẳng hạn như cdrom), kết quả sẽ được lưu vào thư mục chính của người dùng hiện tại.

  3. Script sẽ phát hiện nếu một số thư mục con không thể truy cập được tại các đặc quyền người dùng hiện tại. Nếu tất cả đều có thể đọc được thì không có sự nâng cao đặc quyền nào xảy ra, nếu chúng không có, thì các đặc quyền của người dùng được nâng lên tận gốc.

  4. Tìm được sử dụng để tìm tất cả các tệp trong cấu trúc thư mục hiện tại (bao gồm tất cả các thư mục con). Sắp xếp được sử dụng để đảm bảo kết quả được xuất ra theo thứ tự abc. Danh sách kết quả trải qua sha256sum và được xuất ra một tệp văn bản.

  5. Kể từ khi viết kịch bản cũ, tôi đã chấp nhận một triết lý thiết kế rằng các tệp tạm thời là xấu và nên tránh khi có thể vì chúng khiến người dùng mở để rình mò và giả mạo bởi các bên thứ ba độc hại. Vì vậy, tất cả dữ liệu trong tập lệnh mới này được xử lý dưới dạng các biến cho đến phút cuối cùng trong đó kết quả được xuất ra dưới dạng tệp văn bản.

  6. Các tập tin kết quả được băm và đường dẫn / băm được xuất ra trong thiết bị đầu cuối. Tôi thích chụp ảnh các băm này bằng máy ảnh ngoại tuyến cũ của trường để có thể đảm bảo rằng tệp kết quả không bị giả mạo khi tôi đề cập đến nó vào một ngày sau đó.

  7. Các tập tin kết quả cũ được bỏ qua trong kiểm đếm. Nó làm cho việc so sánh kết quả dễ dàng hơn.

Dưới đây là một ví dụ về đầu ra đầu cuối khi chạy tập lệnh của tôi:

kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ sha256rec
======================================================================= 
sha256rec:         
=======================================================================        
Current Folder : /usr/src/linux-headers-4.13.0-16-generic   
Target Folder  : /usr/src/linux-headers-4.13.0-16-generic
Output File    : /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt


Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder.
f3ddb06212622c375c6bcc11bd629ce38f6c48b7474054ca6f569ded4b4af9d8  /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt
Operation Length: 10 Seconds.
=======================================================================
kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ 

Đây là một đoạn của đầu ra có thể được tìm thấy trong 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:

79c3f378a42bd225642220cc1e4801deb35c046475bb069a96870ad773082805  ./.9491.d
2e336c69cde866c6f01a3495048d0ebc2871dd9c4cb5d647be029e0205d15ce6  ./.config
174f23ff7a7fba897bfb7cf17e9a501bcecacf7ef0c0d5cf030414c1e257d4e3  ./.config.old
389d83f546b250304a9a01bb3072ff79f9d9e380c8a2106cadbf714a872afe33  ./.missing-syscalls.d
035dc77da819101cb9889b4e515023dddd2c953f00d2653b87c6196a6560903e  ./Module.symvers
b28054d7995233e6d003ceb9ed119a0b3354f5ccf77b8d687fc0353ae3c5bfb8  ./arch/x86/include/generated/asm/.syscalls_32.h.cmd
01cf821170e3e6e592e36a96e8628377151c762ac2ee3210c96004bfaef22f5f  ./arch/x86/include/generated/asm/.syscalls_64.h.cmd
111efa83187c58a74a9b0170fd496b497b0682d109a7c240c17e2ffcc734f4f4  ./arch/x86/include/generated/asm/.unistd_32_ia32.h.cmd
fcba4e8abf9e95472c31708555db844ac43c87260fb0ba706b6f519404bf9aba  ./arch/x86/include/generated/asm/.unistd_64_x32.h.cmd
3264438a54cbf7e62b05d38a93c5df8fe4202ac782a5d83ed202cba9eee71139  ./arch/x86/include/generated/asm/.xen-hypercalls.h.cmd
4bd7a45837da7de379b87242efe562ce06bf9d8ab8f636c205bb5ef384c8f759  ./arch/x86/include/generated/asm/clkdev.h
0d96461abd23bbf2da522822948455413a345f9ef8ac7a7f81c6126584b3c964  ./arch/x86/include/generated/asm/dma-contiguous.h
b1a54c24a12ce2c0f283661121974436cdb09ae91822497458072f5f97447c5d  ./arch/x86/include/generated/asm/early_ioremap.h
dd864107295503e102ea339e0fd4496204c697bdd5c1b1a35864dfefe504a990  ./arch/x86/include/generated/asm/mcs_spinlock.h
782ce66804d000472b3c601978fa9bd98dcf3b2750d608c684dc52dd1aa0eb7e  ./arch/x86/include/generated/asm/mm-arch-hooks.h
cd9913197f90cd06e55b19be1e02746655b5e52e388f13ec29032294c2f75897  ./arch/x86/include/generated/asm/syscalls_32.h
758ce35908e8cfeec956f57a206d8064a83a49298e47d47b7e9a7d37b5d96d59  ./arch/x86/include/generated/asm/syscalls_64.h
1147ca3a8443d9ccbdf9cd1f4b9b633f0b77f0559b83ec5e4fa594eadb2548be  ./arch/x86/include/generated/asm/unistd_32_ia32.h
ca5223fbf8f03613a6b000e20eb275d9b8081c8059bc540481a303ce722d42f3  ./arch/x86/include/generated/asm/unistd_64_x32.h
31703052c0d2ab8fe14b4e5dfcc45fcbd5feb5016b0a729b6ba92caa52b069e2  ./arch/x86/include/generated/asm/xen-hypercalls.h
c085ff1b6e9d06faa3fc6a55f69f9065c54098d206827deec7fe0a59d316fc99  ./arch/x86/include/generated/uapi/asm/.unistd_32.h.cmd
7929c16d349845cebb9e303e0ff15f67d924cac42940d0f7271584f1346635fc  ./arch/x86/include/generated/uapi/asm/.unistd_64.h.cmd
9aa492c5a75f5547f8d1dc454bef78189b8f262d1c4b00323a577907f138a63e  ./arch/x86/include/generated/uapi/asm/.unistd_x32.h.cmd
f568e151bbbb5d51fd531604a4a5ca9f17004142cd38ce019f0d5c661d32e36b  ./arch/x86/include/generated/uapi/asm/unistd_32.h
c45cf378498aa06b808bb9ccf5c3c4518e26501667f06c907a385671c60f14ae  ./arch/x86/include/generated/uapi/asm/unistd_64.h
a0088d8d86d7fd96798faa32aa427ed87743d3a0db76605b153d5124845161e2  ./arch/x86/include/generated/uapi/asm/unistd_x32.h
e757eb6420dffa6b24b7aa38ca57e6d6f0bfa7d6f3ea23bbc08789c7e31d15fa  ./arch/x86/kernel/.asm-offsets.s.cmd
f9e703e4f148d370d445c2f8c95f4a1b1ccde28c149cff2db5067c949a63d542  ./arch/x86/kernel/asm-offsets.s
7971fb3e0cc3a3564302b9a3e1ad188d2a00b653189968bbc155d42c70ce6fbf  ./arch/x86/purgatory/.entry64.o.cmd
8352d79fe81d2cf694880f428e283d79fd4b498cea5a425644da25a9641be26b  ./arch/x86/purgatory/.kexec-purgatory.c.cmd
37f3edbee777e955ba3b402098cb6c07500cf9dc7e1d44737f772ac222e6eb3e  ./arch/x86/purgatory/.purgatory.o.cmd
bb8b895cbd2611b69e2f46c2565b4c2e63a85afb56cff946a555f2d277ee99b2  ./arch/x86/purgatory/.purgatory.ro.cmd
bcc2365c9d3d027f1469806eb4f77b0f3ede6eb0855ea0fcd28aa65884046a54  ./arch/x86/purgatory/.setup-x86_64.o.cmd
872229f334fdcc8562e31b9f6581008c1571ac91f12889cd0ff413590585155a  ./arch/x86/purgatory/.sha256.o.cmd
6fb0cbef120aadee282f7bc3b5ea2f912980f16712281f8f7b65901005194422  ./arch/x86/purgatory/.stack.o.cmd
cd1b61063ae3cf45ee0c58b2c55039f3eac5f67a5154726d288b4708c4d43deb  ./arch/x86/purgatory/.string.o.cmd
e5826f0216fd590972bbc8162dd175f87f9f7140c8101505d8ca5849c850ec91  ./arch/x86/purgatory/entry64.o

(nó tiếp tục cho hơn 7000 dòng như thế này nhưng bạn có ý tưởng)

CÀI ĐẶT

  1. Mở một thiết bị đầu cuối và nhập các lệnh sau:

    cd /usr/bin
    sudo su
    echo '#!/bin/bash'> /usr/bin/sha256rec
    chmod +x /usr/bin/sha256rec
    touch /usr/bin/sha256rec
    nano /usr/bin/sha256rec
    
  2. Trong nano, sử dụng Shif + Ctrl + v để dán. Ctrl-O và Enter để lưu. Ctr-X thoát. Dán tập lệnh của tôi vào đó:

(dán sau #! / bin / bash)

  #FUNCTIONS OR FUNCTYOU?
  function s_readonly { err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; echo $(cat /tmp/$err|grep -i "Read-only file system"|wc -l);shred -n 0 -uz /tmp/$err; }
  function w_denied { echo $(err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function r_denied { echo $(err=$(date +%s%N); cd "$1" >/dev/null 2> /tmp/$err; find . >/dev/null 2>> /tmp/$err; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function rando_name { rando=$(echo $(date +%s%N)|sha256sum|awk '{print $1}'); rando=${rando::$(shuf -i 30-77 -n 1)}; echo $rando;}
  function ms0 { ms0=$(($(date +%s%N)/1000000)); }; function mstot { echo $(($(($(date +%s%N)/1000000))-$ms0));}
  function s0 { s0=$(date +%s); }; function stot { echo $(($(date +%s)-$s0));}
  s0

  #CHECK IF A TARGET DIR WAS SPECIFIED (-t= or --target= switch)
  if [ ! -z "$1" ]; then arg1="$1"; arg1_3=${arg1::3}; arg1_9=${arg1::9};fi
  if [ "$arg1_3" = "-t=" -o "$arg1_9" = "--target=" ]; then 
    switch=$(echo $arg1|awk -F '=' '{print $1}')
    switch_chr=$((${#switch}+1))
    target=${arg1:$switch_chr}
    current=$(pwd)
    cd "$target"
    arg1="" #<- cancels the not path in the find line
  else
    current=$(pwd)
    target=$(pwd) 
  fi

  echo -e  "=======================================================================\
    \nsha256rec: \
          \n=======================================================================\
          \nCurrent Folder : $current \
    \nTarget Folder  : $target"

  #GETS DEFAULT_USER, ASSUME'S YOU'RE USER 1000, IF 1000 DOESN'T EXIST SEARCHES 999, THEN 1001, 1002
  default_user=$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)
  if [ -z "$default_user" ]; then default_user=$(awk -v val=999 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1001 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1002 -F ":" '$3==val{print $1}' /etc/passwd); fi

  if [ "$(users | wc -l)" = "1" ]; then USER=$(users|awk '{print $1}'); else USER=$default_user;fi #not perfect but meh...

  #running rando_name in this very specific spot between USER detection and Permission detection, some interfers somehow with detection functions... 
  #the rando function placed underneath the user detection is somehow turning c=$current from the dir path to whatever rando_name puts out.

  #FIGURE OUT WHERE TO PUT HASH LIST
  hash_file="000_sha256sum_recurs_${target##*/}_d_$(date +%d-%m-20%y)_t_$(date +%H.%M).txt"
  if [ $(s_readonly "$current") -gt 0 -o $(w_denied "$current") -gt 0 ]; then if [ "$(whoami)" != root ]; then dest="/home/$(whoami)";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder."; else dest="/home/$USER";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently a Read-Only system. You can find the hash results in $USER's home folder.";fi; else dest="$current";echo -e "Output File    : $dest/$hash_file\n\n";echo "Results will be saved here.";fi



  #CAN REGULAR USER ACCESS TARGET DIR? ARE ALL IT'S SUBDIRS READABLE?
  if [ $(r_denied "$target") -gt 0 ]; then sudo=sudo; echo "Some folder were not read-able as a regular user. User elevation will be required.";fi

  #PERFORM RECURSIVE HASHING
  command=$($sudo find . -type f -not -type l -not -path "$arg1"  -not -path "$2"  -not -path "$3" -not -path "$4"  -not -path "$5"  -not -path "$6" -not -path "$7"  -not -path "$8"  -not -path "$9" |grep -v "\./000_sha"|sort|awk "{print \"$sudo sha256sum \\\"\"\$0}"|awk '{print $0"\""}'|tr '\n' ';')
  eval $command > "$dest/$hash_file"

  sha256sum "$dest/$hash_file"
  echo "Operation Length: $(stot) Seconds."
  echo -e  "======================================================================="



  if [ "$target" != "$current" ]; then cd "$current";fi


  exit
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  1. Khi bạn thoát khỏi nano, hãy chắc chắn thoát khỏi trạng thái nâng cao bằng cách nhập:

    exit

Ý TƯỞNG CUỐI CÙNG

  1. Điều này sẽ chỉ hoạt động nếu bạn đã cài đặt bash. Tôi đã sử dụng một số synthax để thao tác chuỗi con không hoạt động với sh, dash, ksh hoặc zsh. Bạn vẫn có thể sử dụng bất kỳ trình bao nào khác làm trình điều khiển hàng ngày nhưng cần cài đặt bash.

  2. Danh sách xuất ra có thể được so sánh với một loạt các công cụ như: (trong thiết bị đầu cuối) diff, sdiff (và đồ họa) khuếch tán, kdiff, winmerge.

  3. Tập tin của tôi sắp xếp đầu ra dựa trên đường dẫn, để con người dễ đọc hơn. Tôi đã nhận thấy lệnh sắp xếp hoạt động khác nhau trên các bản phát hành khác nhau. Ví dụ, trong một bản phân phối, các chữ cái VỐN được ưu tiên hơn các chữ cái không và trong các chữ cái khác thì không. Điều này ảnh hưởng đến thứ tự dòng của các tệp đầu ra và có thể làm cho các tệp khó so sánh. Điều này sẽ không xuất hiện bất kỳ vấn đề nào nếu bạn luôn sử dụng tập lệnh trong cùng một bản phân phối nhưng có thể nếu danh sách băm được tạo trong hai môi trường khác nhau. Điều này dễ dàng được khắc phục bằng cách sắp xếp các tệp băm thêm một thời gian để các dòng được sắp xếp theo hàm băm thay vì đường dẫn:

     cat 000_sha256sum_oldhashlist|sort> ./old
     cat 000_sha256sum_newhashlist|sort> ./new
     sha256sum ./old ./new; diff ./old ./new
    

Một dòng công việc mạnh mẽ hơn sẽ là #!/usr/bin/env bash- nó sẽ tìm thấy Bash trong thư mục khác là tốt, vì sau này có thể được cài đặt trong / usr / bin chứ không phải là / bin , ví dụ, trong khi đó env có xu hướng được trong / usr / bin tại mọi thời điểm theo như tôi nhận thấy Cũng đáng lưu ý là, vì bạn yêu cầu Bash, bạn có thể sử dụng [[ blah-blah ]]biểu thức điều kiện khung đôi thay vì [ blah-blah ]biến thể khung đơn chung chung hơn .
Anton Samsonov

Cảm ơn các con trỏ. Tôi vừa hoàn thành việc tìm kiếm [[điều kiện. Chúng trông thực sự hữu ích.
thebunnyrules

Mối quan tâm về việc SHA1 bị xâm phạm là không thực sự có thể áp dụng trong trường hợp so sánh các tệp sau khi sao chép để xác minh tính toàn vẹn. Khả năng tệp bị hỏng trong quá trình vận chuyển nhưng vẫn có cùng SHA1 là không. Nếu bạn nghi ngờ rằng kẻ tấn công có thể đã có đủ thời gian để tạo một tệp khác với SHA1 va chạm, thì hãy sử dụng SHA256, nhưng đối với trường hợp sao chép tệp điển hình, đó là quá mức cần thiết và chậm hơn SHA1 hoặc MD5 .
Dan Dascalescu

Đối số của riêng bạn có thể được sử dụng để chống lại chính nó. Nếu bạn lo ngại về tham nhũng bình thường (không liên quan đến tấn công), thì bản thân sha1 là quá mức cần thiết. Bạn có thể nhận được kết quả nhanh hơn bằng cách sử dụng md5 / crc32. Trong cả hai trường hợp (phát hiện giả mạo hoặc tham nhũng), sha1 không phù hợp. Cá nhân, tôi sử dụng các danh sách băm này cho cả hai kịch bản và không nhận thấy bất kỳ hiệu suất có thể nhận thấy nào kể từ khi tôi nâng cấp lên sha256 nhưng tôi cũng không chạy một máy chủ lớn. Giống như tôi đã nói trong câu trả lời, bạn có thể tự do sử dụng bất kỳ hàm băm nào bạn muốn bằng cách thay thế lệnh sha256sum của tôi bằng lệnh bạn muốn: sha1sum, md5sum, b2sum, crc32 ...
thebunnyrules

1

Điều này dường như làm việc cho tôi:

find . \( -not -name . \) -type f -exec cat {} + | sha1sum

EDIT: điều này sẽ chỉ sha1sum tất cả các tệp có trong cây thư mục. Nếu tên thư mục bị thay đổi, điều này sẽ không bắt được. Có lẽ một cái gì đó như:

find . -exec sha1sum {} + 2>&1 | sha1sum

Sẽ làm điều đó. Về câu trả lời giống như câu trả lời khác


1

Một mẹo khác có thể là sử dụng tar để băm nội dung tệp & siêu dữ liệu:

tar -cf - ./path/to/directory | sha1sum

quá tệ khi tôi chỉ có một phiếu bầu
166_MMX

1
Điều này không hoạt động. tar bao gồm dấu thời gian cho một số HĐH (như OSX) và sha1sum sẽ khác nhau mỗi lần chạy.
xuyên suốt

Những gì @srossross nói. Thêm vào đó, nếu bạn có các phiên bản tar khác nhau trên hai máy chủ, kết quả đầu ra sẽ khác nhau.
Dan Dascalescu

1

Giải pháp nhanh chóng, mạnh mẽ và di động

Không giống như một số giải pháp khác liên quan tar, giải pháp bên dưới hoạt động trên bất kỳ máy nào có tiện ích Unix tiêu chuẩn và nhanh hơn tất cả các giải pháp khác bằng cách song song kiểm tra:

find . -type f | xargs -d'\n' -P0 -n1 md5sum | sort -k 2 | md5sum

Vì nó sử dụng một loại ở cuối, không có tiến trình thời gian thực, vì vậy hãy để lệnh chạy.

Đây là những gì các đối số làm:

  • find . -type f tìm thấy tất cả các tệp trong thư mục hiện tại và thư mục con của nó
  • xargs -d'\n'chia đầu ra của tìm thành dòng (nếu bạn mong muốn có các tệp có dòng mới trong đó, thì hãy làm như bình thường find -print0 | xargs -0)
  • -P0 n1chạy md5sumtrong các quy trình song song, sử dụng số lượng quy trình tối đa được máy hỗ trợ (đa lõi!)
  • sort -k 2sắp xếp theo trường thứ hai của md5sumđầu ra, đó là đường dẫn đầy đủ đến mỗi tệp (đầu tiên là MD5)
  • phần cuối cùng md5sumtính toán tổng kiểm tra danh sách tổng kiểm tra tệp, do đó bạn có tổng kiểm tra toàn bộ thư mục trên một dòng, bạn có thể dễ dàng so sánh trực quan qua các cửa sổ đầu cuối

Trước khi bạn nói rằng "MD5 đã bị xâm phạm", hãy ghi nhớ mô hình mối đe dọa của bạn là gì. Bạn đang cố gắng đảm bảo rằng các tệp bạn đã sao chép từ một số máy chủ hoặc đĩa khác đến nguyên vẹn? Thì MD5 là quá đủ, vì khả năng tệp bị hỏng trong quá trình vận chuyển nhưng có cùng MD5 là bằng không. Nhưng nếu bạn sợ kẻ tấn công có thời gian để thay thế một tệp bằng một tệp khác bằng một tổng kiểm tra va chạm, thì hãy sử dụng sha256sum. Nhược điểm là các chức năng SHA chậm hơn MD5 .

Tiến trình dài dòng thời gian thực

Cuối cùng, nếu bạn muốn xem tiến trình thời gian thực, hãy sửa đổi đường ống để sử dụng tệp tạm thời cho tổng kiểm tra:

find . -type f | xargs -d\\n -P0 -n1 md5sum | tee /tmp/sums && sort -k 2 /tmp/sums | md5sum

(Lưu ý rằng việc di chuyển sortbên phải sau khi findkhông hoạt động, vì xargs -P0song song md5sumvà kết quả có thể không theo thứ tự.)

Phiên bản lệnh này cũng cho phép bạn tìm khác biệt hai /tmp/sumstệp (đảm bảo đổi tên tệp thứ hai nếu trên cùng một máy) và xem tệp nào khác nhau.


0

Thay vì có MỘT tệp khổng lồ chứa tất cả thông tin được băm, tôi đang tìm cách tạo một tệp trong mỗi thư mục của cây. Tôi lấy một số cảm hứng từ các ý kiến ​​ở đây. Của tôi phức tạp hơn một chút so với những gì được đăng ở đây. Tôi sử dụng xoay tập tin nhưng điều này là phức tạp nhất cho người chơi mới. Phiên bản này sẽ ghi đè lên các tổng kiểm tra cũ với các tổng mới. Có thể tốt để giữ 2-3 phiên bản tùy thuộc vào tần suất bạn chạy nó và nhu cầu về 'độ sâu' của bạn.

[người dùng @ máy chủ lưu trữ] $ mèo mkshaindir 
#! / bin / dấu gạch ngang
cd $ 1
sha512sum *> .sha512sum

[người dùng @ máy chủ lưu trữ] $ find / var / tmp -type d -print0 | xargs -0 -i mkshaindir {}

Lưu ý rằng mkshaindir, với mục đích của tôi, là một thành phần riêng biệt bởi vì có thể tôi cần phải tạo một tệp băm trong một thư mục mới hoặc một tệp đã được thay đổi gần đây. Tất cả điều này có thể được kết hợp thành một tập lệnh nếu cần.

Phần còn lại là một bài tập cho người đọc.


0

dựa trên câu trả lời trước :

find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum

  • sắp xếp ổn định
  • chủ sở hữu số và id nhóm
  • tiến bộ dài dòng
  • tên tệp an toàn

Điều này không hoạt động trên một thư mục được sao chép chỉ chứa một tệp và tôi nghi ngờ đó là do tôi đang chạy phiên bản cũ hơn một chút của tar (1.28) trên máy chủ từ xa, so với 1.29 trên máy chủ cục bộ. Thật không may, tar 1,29 chưa được backported trên Xenial.
Dan Dascalescu

0

@allquixoticCâu trả lời của không tạo ra các giá trị băm giống nhau trên các máy khác nhau sẽ không giúp chúng tôi xác minh và có các giá trị băm nhất quán.

Dòng find . -type f \( -exec md5sum "$PWD"/{} \; \)sau trả về đầu ra sau:

d41d8cd98f00b204e9800998ecf8427e  /home/helloWorld.c
24811012be8faa36c8f487bbaaadeb71  /home/helloMars.c

Do đó đường dẫn sẽ khác nhau trên các máy khác nhau. awk '{print $1}'sẽ giúp chúng tôi có được cột đầu tiên, chỉ có hàm băm của các tệp. Sau đó, chúng ta cần sắp xếp các giá trị băm đó, trong đó thứ tự có thể khác nhau trên các máy khác nhau, điều này cũng có thể khiến chúng ta có các giá trị băm khác nhau nếu có nhiều hơn hai tệp.


Dung dịch:

Đối với máy Mac:

find ./path/to/directory/ -type f \( -exec md5 -q  "$PWD"/{} \; \) | awk '{print $1}' | sort | md5

Đối với Linux:

find ./path/to/directory/ -type f \( -exec md5sum "$PWD"/{} \; \) | awk '{print $1}' | sort | md5sum | awk '{print $1}'
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.