วิธีการแฮช md5 ส่งผลให้เชลล์


12

ฉันกำลังมองหาวิธีง่ายๆในการทำให้ผลลัพธ์md5sumเป็นคำสั่งอื่น บางสิ่งเช่นนี้

$echo -n 'test' | md5sum | ...

ปัญหาของฉันคือmd5sumเอาต์พุตไม่เพียง แต่การแฮชของสตริงเท่านั้น แต่ยังเป็นไฮเปอร์ซึ่งแสดงว่าอินพุตมาจาก stdin ฉันตรวจสอบไฟล์ man และไม่พบการตั้งค่าสถานะใด ๆ เพื่อควบคุมเอาต์พุต


4
หมายเหตุ: ระวังอย่าใช้echo -nเมื่อไม่ทราบข้อมูลตัวอักษร ใช้printf '%s' "$DATA"แทน ไม่เหมือนecho -n "$DATA"กันมันจะทำงานเมื่อDATA="-n"(ในตัวอย่างอื่น ๆ )
Stéphane Gimenez

คำตอบ:


14

คุณสามารถใช้คำสั่งตัด ; มันช่วยให้คุณสามารถตัดช่วงอักขระ / ไบต์ที่แน่นอนจากอินพุตทุกบรรทัด เนื่องจากแฮช MD5 มีความยาวคงที่ (32 ตัวอักษร) คุณสามารถใช้ตัวเลือก-c 1-32เพื่อเก็บเฉพาะอักขระ 32 ตัวแรกจากบรรทัดอินพุต:

echo -n test | md5sum | cut -c 1-32

หรือคุณสามารถบอกcutให้แบ่งบรรทัดที่ทุกช่องว่างและส่งออกเฉพาะฟิลด์แรก: (หมายเหตุเครื่องหมายคำพูดรอบอักขระเว้นวรรค)

echo -n test | md5sum | cut -d " " -f 1

ดูmanpage ที่ตัดได้สำหรับตัวเลือกเพิ่มเติม


ฉันคิดอย่างนั้นด้วย! ฉันเลือก-d+ -fเพื่อที่md5sumจะถูกแทนที่ด้วยsha1sumหรืออะไรก็ได้ในภายหลัง
Stéphane Gimenez

awkทำงานเกินไป: echo -n test | md5sum | awk -F" " '{print $1}' หรือawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade

ขอบคุณสำหรับคำตอบ @laebshade จริงที่คุณต้องใช้ printf มิฉะนั้นมันจะออกตัวละครใหม่สายที่สิ้นสุด;)
nmat

@laebshade คือ-F" "ตัวเลือกที่จะเป็นที่แปลกประหลาดมากที่จะเห็นระบุว่ามันเป็นค่าเริ่มต้นสำหรับawk awk
enzotib

3

คุณทำได้cut:

echo -n 'test' | md5sum | cut -d' ' -f1

ที่นี่-d' 'เลือกพื้นที่เป็นตัวคั่นและ-f1ขอฟิลด์แรก (ก่อนตัวคั่น)


2

การใช้awkทำงานได้ดีเช่นกัน:

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

อีกวิธีคือการสร้างซับสตริง เนื่องจากคุณรู้ว่า md5 แฮชเป็นสตริงที่มีอักขระ 32 ตัวคุณสามารถใช้:

HASH=$(echo -n 'test' | md5sum -) && echo ${HASH:0:32}

มันเป็นแค่การผสมสตริงคุณจึงมีทางเลือก!

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