md5sum prepends '\' กับเช็คซัม


22

ทำไม md5sum กำลังเตรียม "\" ที่หน้าเช็คซัมเมื่อค้นหาเช็คซัมของไฟล์ที่มี "\" ในชื่อ

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

เช่นเดียวกับที่บันทึกไว้สำหรับยูทิลิตี้อื่น ๆ


เพียงเพื่อการอ้างอิง*sumสาธารณูปโภคอื่น ๆ(ของตระกูลเดียวกันกับmd5sum, e, g, sha1sumฯลฯ ) ใน GNU coreutils ทำเช่นเดียวกัน
Kusalananda

ฉันไม่เห็นพฤติกรรมนี้เวอร์ชันของยูทิลิตี้คือ:md5sum --version
Kiwy

@Kusalananda นี่อาจเป็นเวอร์ชั่นเฉพาะของ coreutils บน CentOS 7 cksumไม่ได้; เช่น% cksum test\\test 3915528286 4 test\test
Stephen Harris

@StephenHarris นั่นอาจเป็นเพราะcksumยูทิลิตี้ POSIX และสเป็คของมัน ไม่อนุญาต
Kusalananda

คำตอบ:


33

เอกสารนี้มีไว้สำหรับ Coreutils ' md5sum:

หากไฟล์มีเครื่องหมายแบ็กสแลชหรือขึ้นบรรทัดใหม่บรรทัดนั้นจะเริ่มต้นด้วยแบ็กสแลชและอักขระที่มีปัญหาแต่ละตัวในชื่อไฟล์จะถูก Escape ด้วยแบ็กสแลช

( ไฟล์เป็นชื่อไฟล์ไม่ใช่เนื้อหาของไฟล์)

b2sum, sha1sumและต่างๆSHA-2 เครื่องมือmd5sumประพฤติในทางเดียวกับ sumและcksumไม่; sumมีไว้สำหรับความเข้ากันได้แบบย้อนหลังเท่านั้น (และบรรพบุรุษไม่ได้ผลิตเอาต์พุตที่ยกมา) และcksumมีการระบุโดย POSIXและไม่อนุญาตเอาท์พุทประเภทนี้

พฤติกรรมนี้ได้รับการแนะนำในเดือนพฤศจิกายน 2558และเผยแพร่ในเวอร์ชัน 8.25 (มกราคม 2559) โดยมีNEWSรายการดังต่อไปนี้:

md5sumตอนนี้รับรองบรรทัดเดียวต่อไฟล์สำหรับสถานะบนเอาต์พุตมาตรฐานโดยใช้ '\' ที่จุดเริ่มต้นของบรรทัดและแทนที่บรรทัดใหม่ด้วย '\ n' นอกจากนี้ยังส่งผลกระทบต่อนี้sha1sum, sha224sum, sha256sum, และsha384sumsha512sum

แบ็กสแลชที่จุดเริ่มต้นของบรรทัดทำหน้าที่เป็นแฟล็ก: escapes ในชื่อไฟล์จะถูกประมวลผลเฉพาะเมื่อบรรทัดเริ่มต้นด้วยแบ็กสแลช (การหลีกเลี่ยงไม่สามารถเป็นพฤติกรรมเริ่มต้น: มันจะทำลายจำนวนเงินที่สร้างขึ้นด้วย Coreutils รุ่นเก่าที่มี\\หรือ\nในชื่อไฟล์ที่เก็บไว้)


30
มันเป็นเรื่องน่าละอายที่บางสิ่งที่ไม่ได้ใช้งานง่ายอย่างสมบูรณ์แบบนี้ไม่ได้บันทึกไว้ในmanหน้าเว็บ (และใช่ฉันรู้ว่า GNU ต้องการให้ทุกคนอ่านinfoหน้าเว็บที่มีความซับซ้อนสูงของพวกเขาแทน)
roaima

3
@ ใต้แบ็กสแลชที่จุดเริ่มต้นของบรรทัดทำหน้าที่เป็นธงแสดงว่าแบ็กสแลชในชื่อไฟล์เป็นทางหนี มิฉะนั้นคุณจะไม่รู้ว่าจะดำเนินการ\nฯลฯ เป็นตัวอักษรหรือหลบหนี
Stephen Kitt

3
@msouth ถ้ามันเป็นจุดเริ่มต้นของชื่อไฟล์คุณไม่มีทางรู้ว่ามันเป็นธงหรือชื่อไฟล์ที่เริ่มต้นด้วยแบ็กสแลชอย่างแท้จริง ...
Stephen Kitt

1
@StephenKitt ฉันไม่คิดว่า \ \ \ \ \ \ \ \ ผู้นำ \ \ \ \ \ \ \ \ มีความเข้าใจผิด มีความคลุมเครือถ้าการส่งออกเป็นเอกสารที่เป็นไม่เป็นเสมอเครื่องหมายการหลบหนีและการขึ้นบรรทัดใหม่ มันอยู่ที่นั่นเพื่อไม่ให้เกิดการหลบหนีหากไม่จำเป็น แน่นอนคุณสามารถถกเถียงกันว่าสิ่งนี้คุ้มค่าหรือไม่ (โดยส่วนตัวฉันคิดว่ามันไม่ใช่ แต่ฉันไม่ใช่ผู้coreutilsมีส่วนร่วม)
TypeIA

1
วลีของเอกสารประกอบ "อักขระที่มีปัญหาแต่ละตัวในชื่อไฟล์ถูก Escape ด้วยแบ็กสแลช" ผิด การแทนที่ขึ้นบรรทัดใหม่ด้วย\nไม่เหมือนกับการหนีขึ้นบรรทัดใหม่ด้วยแบ็กสแลช!
ruakh

17

คำตอบของ Stephen Kitt ครอบคลุมถึงสิ่งที่และฉันจะพยายามอธิบายว่าทำไมการเปลี่ยนแปลงนี้จึงถูกนำไปใช้ ครั้งแรกที่มีคนตั้งข้อสังเกตว่าชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่1อาจส่งผลให้การส่งออกที่ไม่ชัดเจน ตัวอย่างเช่นพิจารณาผลลัพธ์นี้:

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

นี้ไม่ได้หมายความว่ามีสองไฟล์fooและbarหรือเฉพาะไฟล์ที่มีชื่อไฟล์เป็น"foo\n25af89c92254a806b2e93fffd8ac1814 bar"? จริงอยู่ที่ความเป็นไปได้หลังนี้ไม่น่าจะสูง แต่เป็นไปได้ เพื่อแก้ไขความคลุมเครือนักพัฒนาเลือกที่จะหลบเลี่ยงการขึ้นบรรทัดใหม่ด้วยแบ็กสแลช ( \) จากนั้นผลลัพธ์จะกลายเป็นความแตกต่าง อย่างไรก็ตามมีความคลุมเครือเพิ่มเติม:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

ชื่อไฟล์นี้มีการขึ้นบรรทัดใหม่หรือแบ็กสแลชตามด้วยnหรือไม่ ในการแก้ไขปัญหานี้เราจำเป็นต้องหลบหลีกแบ็กสแลชด้วยดังนั้นกรณีหลังจะกลายเป็น:

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

ในที่สุดพวกเขาเลือกที่จะเพิ่มแต่ละบรรทัดเอาต์พุตที่มี escapes ดังกล่าวด้วย\\เพื่อให้ง่ายต่อการแยกวิเคราะห์เพื่อตรวจสอบว่าการหลบหนีได้ทำไปแล้วหรือไม่ สันนิษฐานว่าเป็นการกระทำเพื่ออนุญาตให้ตัวแยกวิเคราะห์จัดการเอาต์พุตทั้งจากรุ่นที่กำลังหนีmd5sumและจากรุ่นที่ไม่หนีหาย (ไม่ใช่ GNU) การตั้งค่าสถานะยังหมายความว่าไม่จำเป็นต้องยกเลิกการ "หนีค่าใช้จ่าย" เมื่อไม่จำเป็น คุณสามารถดูตัวอย่างของการแยกวิเคราะห์นี้ในmd5sum.cตัวมันเอง (บรรทัด 382 ในเวอร์ชันที่ลิงก์)


1โดยการขึ้นบรรทัดใหม่ฉันหมายถึงอักขระ\nที่บางครั้งเรียกว่าlinefeedหรือLF โดยเฉพาะ เห็นmd5sum.cไหม


1
แน่นอนว่าพฤติกรรมที่มีสตินั้นจะถูกแบนทุกไฟล์ที่มีการขึ้นบรรทัดใหม่อย่างสมบูรณ์ เพียงปฏิเสธที่จะดำเนินการกับพวกเขา
ท่อ

1
@pipe พฤติกรรมที่เสียสติ POSIX อนุญาตให้ใช้ชื่อไฟล์ดังกล่าวและยูทิลิตีที่ตั้งใจปฏิเสธที่จะทำงานกับไฟล์ที่ถูกกฎหมายนั้นไม่ดีและจะต้องถูกฆ่าด้วยไฟ
Ruslan

2
@Ruslan ประเด็นคือการประท้วงต่อต้าน POSIX สำหรับการอนุญาตชื่อต่อต้านสังคมเช่นนั้น การอนุญาตให้ใช้อักขระดังกล่าวทำให้เกิดปัญหาด้านความปลอดภัยจำนวนมากและการขยายโค้ดเพื่อจัดการกรณีพิเศษดังกล่าว
ท่อ

@pipe ขณะ LF ในชื่อไฟล์ที่เป็นจริงสังคมสิ่งอื่น ๆ ที่กล่าวถึงในการเชื่อมโยงของคุณจะเป็นที่ถกเถียงกันมากขึ้น - เช่นการเว้นวรรคตัวอักษรที่ไม่ใช่ละติน ฯลฯ ..
Ruslan

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