Làm thế nào để có được băm MD5 của một chuỗi trực tiếp trong thiết bị đầu cuối?


189

Làm cách nào để lấy băm MD5 của chuỗi trực tiếp từ thiết bị đầu cuối?

Ví dụ, tôi muốn chuỗi abcdefgbăm. Hiện tại lệnh md5sum chỉ chấp nhận tên tệp làm đầu vào. Tôi muốn chỉ cần nhập dòng sau đây và mọi thứ được thực hiện với.

md5sum abcdefg
output: ac54bcf346e578feb46888b3ecd2344f

Làm thế nào tôi có thể đạt được điều đó?


2
md5 -s abcdefg
viêmd

Câu trả lời:


252

Bạn cũng có thể nói một cái gì đó như thế này:

~$ echo -n Welcome | md5sum
83218ac34c1834c26781fe4bde918ee4  -

Về cơ bản, nó thực hiện điều tương tự như được mô tả bởi @enzotib, nhưng có lẽ đơn giản hơn một chút.


2
Bạn cũng muốn cập nhật kết quả ví dụ, vì 7804ffca ... là kết quả với dòng mới được thêm vào. Kết quả chính xác cho lệnh trên là83218ac34c1834c26781fe4bde918ee4 -
Xanthir

19
Tại sao có không gian và dấu gạch ngang ở cuối?
keune

1
Vui lòng sửa lại cho tôi nếu tôi sai, nhưng tôi nghĩ rằng điều này là do MD5sum được áp dụng cho luồng dữ liệu, trái ngược với việc đọc nội dung tệp có tên liên quan đến nó.
jfmessier

11
Lưu ý rằng điều -nnày là bắt buộc. Không có nó, hàm băm của bạn sẽ hoàn toàn sai vì nó bao gồm ký tự dòng mới.
Pithikos

1
Làm thế nào tôi có thể bỏ qua -vào cuối. @jfmessier
alper

61

Rất đơn giản, nó chấp nhận stdin, vì vậy

md5sum <<<"my string"

Để tránh dòng mới được thêm bởi shell:

printf '%s' "my string" | md5sum

Cho cả phiếu bầu @messier và @enzotib; cả hai đều thuộc loại "đơn giản thanh lịch" được đánh giá cao của tôi. Tôi có thể sử dụng <<<"đường ống trong một kịch bản; echo stringchiến thắng cho dòng lệnh. Làm tốt.
Tom

3
+1 để sử dụng printfchính xác. Nếu bạn muốn có số tiền mà không có -, đặt | cut -d ' ' -f 1. Ví dụ sử dụng:sum=$(printf '%s' 'some string' | md5sum | cut -d ' ' -f 1)
Lekensteyn

1
Thật kỳ lạ nhưng <<<toán tử và printfhàm đang cho kết quả hoàn toàn khác nhau cho hàm băm md5! kết quả của printf là chính xác!
Hamed Momeni

có vẻ như bằng cách sử dụng <<<toán tử sẽ gửi một dòng mới đến md5sum!
Hamed Momeni

1
Vâng, đúng như tôi đã nói giữa ví dụ thứ nhất và thứ hai
enzotib

27
$ echo -n 123456 | md5sum | awk '{print $1}'
e10adc3949ba59abbe56e057f20f883e

bạn có thể tạo một kịch bản shell.

Ví dụ: tên tập lệnh là md5.sh:

#!/bin/bash

echo   -n   $1 | md5sum | awk '{print $1}'

quyền thực thi:

 chmod +x md5.sh

Sau đó:

$ md5.sh 123456
e10adc3949ba59abbe56e057f20f883e

Nếu hệ thống của bạn là macOS. Bạn cần sửa đổi tập lệnh này:

$ echo -n 123456 | md5 | awk '{print $1}' 
e10adc3949ba59abbe56e057f20f883e

1
Điều này là quá dài.
Gucho Ca

1
thay thế cho awk:cut -d ' ' -f 1
phil294

Tôi đã tạo một hàm md5() { echo -n $1 | md5sum | awk '{print $1}'; }trong .bashrc và sau đó tôi có thể sử dụng $ md5 testtrong dòng lệnh. cảm ơn vì câu trả lời
Ruben Benjamin

awkLệnh ngắn hơn :'$0=$1'
Alex Stragies

@AlexStragies yep
ty4z2008

10

Chạy md5sum mà không có đối số nào sẽ khiến nó đọc đầu vào từ thiết bị đầu cuối. Nhập hoặc dán bất cứ thứ gì bạn muốn và khi bạn hoàn thành, nhấn ctrl-dđể kết thúc đầu vào.


1
Vâng, bạn cũng đúng. nhưng ctrl+dcần phải nhấn hai lần để nó hoạt động.
Hamed Momeni

@James, nếu nó không theo một dòng mới, vâng. Nếu bạn nhấn nó sau khi nhấn enter, nó chỉ cần một lần. Khi nó không tuân theo một dòng mới, nó chỉ buộc tất cả các ký tự được gõ trên dòng cho đến nay phải được xử lý ngay lập tức thay vì chờ đợi một dòng mới.
psusi

10
openssl md5 filename
openssl sha1 filename

Đối với chuỗi ống nội dung sử dụng echo

echo -n 123456 | openssl md5

4

Tôi chọc nhanh vào --helpđể md5sumchứng minh rằng lệnh:

md5sum -

sau đó sẽ đưa ra lời nhắc cho đầu vào đơn giản. Nhập một số văn bản và sau đó sử dụng Entervà sau đó Ctrl+ Dđể biểu thị phần cuối của tệp sau đó gây ra md5sumnhổ MD5 của văn bản thô mà bạn đã nhập (bao gồm cả đó Enterlà CR, IIRC).

Ít để gõ và không có đường ống! Và tránh mật khẩu văn bản gốc của bạn được ghi lại trong lịch sử shell! Woo!

Nếu bạn không muốn CR theo dõi đó (thường là trường hợp nếu bạn muốn băm mật khẩu), đừng nhấn Entertrước Ctrl+ D, thay vào đó hãy nhập Ctrl+ Dhai lần.


2

Trong các kịch bản của tôi, tôi thấy rằng có 2 điều mà bạn nên biết về vấn đề này.

  • Không thành vấn đề nếu bạn làm echo "$myvariable"hoặc echo -n "$myvariable" nhưng bạn nên luôn luôn sử dụng doubleqoutes cho chuỗi và luôn sử dụng cùng một phương thức. nếu không mọi thứ sẽ không phù hợp.
  • trong đầu ra, bạn luôn nhận được một dấu cách và dấu gạch ngang như trong ví dụ:

    $ echo -n Welcome | md5sum
    7803ffcaea43bb81a439fde13b29bc35  -
    

để thoát khỏi điều đó và chỉ ở lại với mã 7803ffcaea43bb81a439fde13b29bc35, hãy làm:echo "$myvariable" | md5sum | cut -d" " -f1


Đừng quên -ntham số ở đây để tránh xuất ra dòng mới, điều này sẽ dẫn đến md5 sai:echo -n $myvariable | md5sum | cut -d" " -f1
derFunk

1

Có nhiều ví dụ để làm điều này, nhưng một số trong số chúng không tương đương vì một số trong số chúng rõ ràng hoặc ngầm bao gồm dòng mới, và một số khác thì không.

Tôi muốn xác định rõ phương thức phổ biến nào bao gồm dòng mới và phương pháp nào không.

Dưới đây là một số ví dụ cùng với việc tính toán băm md5 mà không có dòng mới (CORRECT):

Sử dụng tệp có văn bản:

$ echo -n "test" > test.txt
$ wc test.txt
0 1 4 test.txt
$ md5sum test.txt
098f6bcd4621d373cade4e832627b4f6  test.txt

Lưu ý: -n trong echophương tiện: "không xuất dòng mới".

Sử dụng echovới -nnội tuyến:

$ echo -n "test" | md5sum
098f6bcd4621d373cade4e832627b4f6  -

Sử dụng printf:

$ printf "%s" "test" | md5sum
098f6bcd4621d373cade4e832627b4f6  -

Chỉ sử dụng md5sumlệnh:

(Hãy viết md5sum, nhấn Enterrồi viết chuỗi testvà sau đó nhấn đúp kết hợp Ctrl+ d)

$ md5sum
test098f6bcd4621d373cade4e832627b4f6  -

Sử dụng md5sum -lệnh:

(Hãy viết md5sum -, nhấn Enterrồi viết chuỗi testvà sau đó nhấn đúp kết hợp Ctrl+ d)

$ md5sum -
test098f6bcd4621d373cade4e832627b4f6  -

Dưới đây là một số ví dụ cùng với việc tính toán băm md5 VỚI dòng mới (SO KHÔNG ĐÚNG):

Sử dụng tệp có văn bản:

$ echo "test" > test_n.txt
$ wc test_n.txt
1 1 5 test_n.txt
$ md5sum test_n.txt
d8e8fca2dc0f896fd7cb4cb0031ba249  test_n.txt

Sử dụng echoKHÔNG CÓ -nnội tuyến:

echo "test" | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Sử dụng chuỗi ở đây :

$ md5sum <<< "test"
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Chỉ sử dụng md5sumlệnh nhưng với Enterkhóa sau khi viết văn bản:

(Hãy viết md5sum, nhấn Enterrồi viết chuỗi testvà sau đó nhấn agaien Entervà một lần kết hợp Ctrl+ d)

$ md5sum
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Sử dụng md5sum -lệnh nhưng với Enterkhóa sau khi viết văn bản:

(Hãy viết md5sum -, nhấn Enterrồi viết chuỗi testvà sau đó nhấn agaien Entervà một lần kết hợp Ctrl+ d)

$ md5sum -
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -
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.