วิธีการรับ MD5 hash ของสตริงโดยตรงใน terminal?


189

ฉันจะรับMD5แฮชของสตริงได้โดยตรงจากเทอร์มินัลได้อย่างไร

ตัวอย่างเช่นฉันต้องการabcdefgแฮชสตริง ปัจจุบันคำสั่งmd5sumยอมรับเฉพาะชื่อไฟล์เป็นอินพุต ฉันต้องการเพียงแค่ป้อนบรรทัดต่อไปนี้และทุกอย่างจะเสร็จสิ้น

md5sum abcdefg
output: ac54bcf346e578feb46888b3ecd2344f

ฉันจะบรรลุสิ่งนั้นได้อย่างไร


2
md5 -s abcdefg
raitisd

คำตอบ:


252

คุณสามารถพูดบางสิ่งเช่นนี้:

~$ echo -n Welcome | md5sum
83218ac34c1834c26781fe4bde918ee4  -

โดยทั่วไปแล้วมันทำสิ่งเดียวกันกับที่อธิบายโดย @enzotib แต่อาจจะง่ายกว่าเล็กน้อย


2
คุณต้องการอัปเดตตัวอย่างผลลัพธ์เนื่องจาก 7803ffca ... เป็นผลลัพธ์ด้วยการขึ้นบรรทัดใหม่ ผลลัพธ์ที่ถูกต้องสำหรับคำสั่งดังกล่าวคือ83218ac34c1834c26781fe4bde918ee4 -
Xanthir

19
ทำไมถึงมีช่องว่างและเส้นประในตอนท้าย
keune

1
โปรดแก้ไขให้ฉันถ้าฉันผิด แต่ฉันคิดว่านี่เป็นเพราะ MD5sum ถูกนำไปใช้กับสตรีมของข้อมูลซึ่งต่างจากการอ่านเนื้อหาไฟล์ซึ่งมีชื่อที่เกี่ยวข้อง
jfmessier

11
ขอให้สังเกตว่า-nเป็นข้อบังคับ หากไม่มีแฮชของคุณจะผิดทั้งหมดเนื่องจากมีอักขระขึ้นบรรทัดใหม่
Pithikos

1
ฉันจะเพิกเฉยได้อย่างไร-ในตอนท้าย @jfmessier
alper

61

ง่ายมากยอมรับ stdin ดังนั้น

md5sum <<<"my string"

เพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่ต่อท้ายที่เพิ่มโดยเชลล์:

printf '%s' "my string" | md5sum

ให้ทั้ง @messier และ @enzotib ลงคะแนน ทั้งคู่ตกอยู่ในหมวดหมู่ "ความเรียบง่ายสง่างาม" ของฉัน ฉันมีแนวโน้มที่จะใช้<<<"ไปป์ในสคริปต์ echo stringชนะสำหรับ commandline ทำได้ดี.
Tom

3
+1 สำหรับการใช้printfอย่างถูกต้อง หากคุณต้องการที่จะมีผลรวมโดยไม่ได้ใส่- | cut -d ' ' -f 1ตัวอย่างการใช้งาน:sum=$(printf '%s' 'some string' | md5sum | cut -d ' ' -f 1)
Lekensteyn

1
มันแปลก แต่ตัว<<<ดำเนินการและprintfฟังก์ชั่นให้ผลลัพธ์ที่แตกต่างอย่างสิ้นเชิงสำหรับ md5 hash! ผลลัพธ์ของ printf นั้นถูกต้องแล้ว!
Hamed Momeni

ดูเหมือนว่าการใช้<<<โอเปอเรเตอร์จะส่ง newline ไปที่ md5sum!
Hamed Momeni

1
ใช่มันเป็นเช่นที่ฉันพูดระหว่างตัวอย่างแรกและครั้งที่สอง
enzotib

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

คุณสามารถสร้างเชลล์สคริปต์

ตัวอย่างเช่นชื่อสคริปต์คือ md5.sh:

#!/bin/bash

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

ได้รับอนุญาตดำเนินการ:

 chmod +x md5.sh

แล้ว:

$ md5.sh 123456
e10adc3949ba59abbe56e057f20f883e

หากระบบของคุณเป็น macOS คุณต้องแก้ไขสคริปต์นี้:

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

1
นี่มันยาวเกินไป
Gucho Ca

1
ทางเลือกอื่นเพื่อ awk:cut -d ' ' -f 1
Blauhirn

ฉันสร้างฟังก์ชั่นmd5() { echo -n $1 | md5sum | awk '{print $1}'; }ใน. bashrc จากนั้นฉันสามารถใช้$ md5 testในบรรทัดคำสั่ง ขอบคุณสำหรับคำตอบ
Ruben Benjamin

awkคำสั่งที่สั้นกว่า:'$0=$1'
Alex Stragies

@AlexStragies yep
ty4z2008

10

การรัน md5sum โดยไม่มีข้อโต้แย้งใด ๆ จะทำให้อ่านอินพุตจากเทอร์มินัล พิมพ์หรือวางสิ่งที่คุณต้องการและเมื่อเสร็จแล้วกดctrl-dเพื่อสิ้นสุดอินพุต


1
ใช่คุณพูดถูก แต่ctrl+dต้องกดสองครั้งเพื่อให้ทำงานได้
Hamed Momeni

@ James หากไม่เป็นไปตามบรรทัดใหม่ใช่ หากคุณกดปุ่มหลังจากกดปุ่มก็จะต้องใช้เพียงครั้งเดียว เมื่อไม่เป็นไปตามบรรทัดใหม่เพียงบังคับให้อักขระทั้งหมดที่พิมพ์บนบรรทัดจนถูกประมวลผลทันทีแทนที่จะรอขึ้นบรรทัดใหม่
psusi


4

โผล่อย่างรวดเร็วของฉันที่--helpสำหรับmd5sumแสดงให้เห็นว่าคำสั่ง:

md5sum -

จะให้พรอมต์สำหรับการป้อนข้อมูลอย่างง่าย การป้อนข้อความบางส่วนจากนั้นใช้Enterและจากนั้นCtrl+ Dเพื่อแสดงถึงจุดสิ้นสุดไฟล์แล้วทำให้เกิดmd5sumการคาย MD5 ของข้อความดิบที่คุณป้อน (รวมถึงEnterมันคือ CR, IIRC)

พิมพ์น้อยลงและไม่มีการวางท่อ! และหลีกเลี่ยงรหัสผ่านธรรมดาของคุณที่ถูกบันทึกไว้ในประวัติเชลล์! แอ่ว!

หากคุณไม่ต้องการ CR ต่อท้าย (ซึ่งโดยปกติจะเป็นกรณีถ้าคุณต้องการแฮชรหัสผ่าน) อย่ากดปุ่ม+ Enterก่อนหน้านี้ให้ป้อน+ สองครั้งแทนCtrlDCtrlD


2

ในสคริปต์ของฉันฉันพบว่ามี 2 สิ่งที่คุณควรรู้เกี่ยวกับปัญหานี้

  • มันไม่สำคัญว่าคุณจะทำecho "$myvariable"หรือecho -n "$myvariable" แต่คุณควรใช้ doubleqoutes สำหรับสตริงและมักจะใช้วิธีการเดียวกัน หากไม่ใช่สิ่งที่ไม่ตรงกัน
  • ในผลลัพธ์คุณจะได้รับพื้นที่ต่อท้ายและเส้นประเสมอตามที่แสดงในตัวอย่าง:

    $ echo -n Welcome | md5sum
    7803ffcaea43bb81a439fde13b29bc35  -
    

เพื่อกำจัดสิ่งนั้นและอยู่กับรหัส7803ffcaea43bb81a439fde13b29bc35เท่านั้นให้ทำ:echo "$myvariable" | md5sum | cut -d" " -f1


อย่าลืม-nพารามิเตอร์ที่นี่เพื่อหลีกเลี่ยงการแสดงบรรทัดใหม่ที่ต่อท้ายซึ่งจะนำไปสู่การ md5 ที่ไม่ถูกต้อง:echo -n $myvariable | md5sum | cut -d" " -f1
derFunk

1

มีตัวอย่างมากมายที่ต้องทำเช่นนี้ แต่บางคนก็ไม่เท่ากันเพราะบางคนมีการขึ้นบรรทัดใหม่อย่างชัดเจนหรือโดยนัยรวมถึงการขึ้นบรรทัดใหม่และบางคนไม่ได้ทำ

ฉันต้องการระบุอย่างชัดเจนว่าวิธีใดที่ได้รับความนิยมรวมถึงการขึ้นบรรทัดใหม่และที่ไม่ใช่

นี่คือตัวอย่างพร้อมที่จะคำนวณแฮชmd5โดยไม่ต้องขึ้นบรรทัดใหม่ (แก้ไข):

การใช้ไฟล์ที่มีข้อความ:

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

หมายเหตุ: -nในechoหมายถึง "ไม่เอาท์พุทขึ้นบรรทัดใหม่"

ใช้echoกับ-ninline:

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

การใช้printf:

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

ใช้md5sumคำสั่งเท่านั้น:

(ลองเขียนmd5sumกดและEnterเขียนสตริงtestจากนั้นกดรวมกันสองครั้งCtrl+ d)

$ md5sum
test098f6bcd4621d373cade4e832627b4f6  -

ใช้md5sum -คำสั่ง:

(ลองเขียนmd5sum -กดและEnterเขียนสตริงtestจากนั้นกดรวมกันสองครั้งCtrl+ d)

$ md5sum -
test098f6bcd4621d373cade4e832627b4f6  -

นี่คือตัวอย่างบางส่วนไปพร้อมกับการคำนวณที่มีmd5กัญชาที่มีต่อท้ายบรรทัดใหม่ (จึงไม่ถูกต้อง):

การใช้ไฟล์ที่มีข้อความ:

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

ใช้แบบอินไลน์echoโดยไม่ต้อง-n:

echo "test" | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -

ใช้ที่นี่สตริง :

$ md5sum <<< "test"
d8e8fca2dc0f896fd7cb4cb0031ba249  -

ใช้md5sumคำสั่งเท่านั้นแต่มีEnterคีย์หลังจากเขียนข้อความ:

(ลองเขียนmd5sumกดและEnterเขียนสตริงtestจากนั้นกด agaien Enterและเมื่อรวมกันCtrl+ d)

$ md5sum
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

ใช้md5sum -คำสั่ง แต่มีEnterคีย์หลังจากเขียนข้อความ:

(ลองเขียนmd5sum -กดและEnterเขียนสตริงtestจากนั้นกด agaien Enterและเมื่อรวมกันCtrl+ d)

$ md5sum -
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.