การใช้อินพุตและเอาต์พุตมาตรฐานกับข้อมูลไบนารีปลอดภัยหรือไม่?


14

ฉันต้องการแยกไฟล์ไบนารีออกเป็นสองไฟล์ ฉันสงสัยว่าสามารถใช้ส่วนหัวและ / หรือส่วนท้ายได้หรือไม่ แต่ฉันก็สงสัยว่า ... ปลอดภัยไหมที่จะใช้การเปลี่ยนเส้นทางการวางท่อและข้อมูลไบนารีด้วย? มีการขึ้นบรรทัดใหม่ที่ยุ่งกับหรือเป็นโมฆะหรือ backspace หรือลบทำอะไรเป็นพิเศษหรือไม่ (bash, kubuntu 18.04 LTS)


1
ลองดูsplitคำสั่ง
egmont

คำตอบ:


19

ใช่มันปลอดภัยถ้าคุณไพพ์ไปยังกระบวนการอื่นหรือบันทึกลงในไฟล์ อาจมี "ความแปลกประหลาด" ที่เป็นไปได้ถ้าคุณปล่อยให้ไบนารี stdout พิมพ์ไปยังเทอร์มินัลเนื่องจากมันสามารถมีลำดับการยกเว้น (โดยการสุ่ม) ที่สามารถทำให้จอแสดงผลเทอร์มินัลชั่วคราว


6
ในกรณีที่คุณสามารถพิมพ์resetและกด Enter เพื่อแก้ไข
Baard Kopperud

4
@ BaardKopperud ฉันคิดว่าฉันอ่านที่ไหนสักแห่งเกี่ยวกับบางมุมที่ tset / reset ใช้งานไม่ได้
Xen2050

1
@ Xen2050 ฉันไม่รู้ กรณีเดียวที่จะเกิดขึ้นหากลำดับการหลบหนีบางอย่างเปลี่ยนรูปแบบแป้นพิมพ์ / การเข้ารหัสดังนั้นการพิมพ์reset<enter> ไม่ได้พิมพ์ตัวอักษรตามลำดับที่เห็นโดยเทอร์มินัลจริง ๆ ...
Bakuriu

3
ดูเพิ่มเติมแก้ไขขั้วหลังจากการแสดงแฟ้มไบนารีและทำไมคอนโซลจำเป็นบางครั้งการตั้งค่าหลังจาก CTRL + C ตามคำแนะนำในลิงค์แรกstty sane; tput rs1ลำดับของคำสั่งจะทำเคล็ดลับเมื่อมีกรณีมุมresetไม่ทำงาน กรณีดังกล่าวนอกเหนือจาก Bakuriu ที่กล่าวถึงอาจรวมความกว้างของเทอร์มินัล / คอลัมน์หรือฉันเดาการตั้งค่าที่เกี่ยวข้องกับการสื่อสารแบบอนุกรม (baudrate / parity)
Sergiy Kolodyazhnyy

1

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

หากข้อมูลมีโครงสร้าง แต่อย่างใดคุณต้องคำนึงถึงสิ่งนั้นในการเลือกจุดแยกดังนั้นคุณจะไม่แยกโครงสร้างที่อยู่ตรงกลาง

หากคุณรู้จักโครงสร้างของไฟล์คุณสามารถใช้คำสั่งเช่น

dd -if input-file -of output-file ...

พร้อมตัวเลือกเพื่อคัดลอกบล็อกข้อมูลจำนวนมากที่มีขนาดเฉพาะเริ่มต้นที่การชดเชย (เพิ่มขึ้น) เฉพาะลงในไฟล์

ดูเหมือนว่าsplitคำสั่งดังกล่าวโดย @egmont จะทำให้กระบวนการนี้เป็นแบบอัตโนมัติ แต่ดูเหมือนว่าจะเป็นแบบบรรทัดตามค่าเริ่มต้นดังนั้นคุณจะต้องระบุตัวเลือกเพิ่มเติมเช่น--bytes countบอกขนาดไฟล์แต่ละไฟล์ให้ใหญ่ เป็น


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

strings -n 6 file | less

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

หากคุณต้องสำรวจไฟล์ในรายละเอียดเพิ่มเติมด้วยตัวแก้ไขไบนารีเช่นในภายหลังhexeditคุณจะมีจุดสังเกตที่ชี้ให้เห็นว่ามีสิ่งใดที่น่าสนใจ

stringsมีตัวเลือก - t x ที่จะนำหน้าแต่ละสตริงที่พิมพ์โดยมีอ็อฟเซ็ตลงในไฟล์เป็นเลขฐานสิบหก (o สำหรับ octal / d สำหรับทศนิยม) เพื่อให้คุณทราบว่าจะหาได้ที่ไหนในภายหลัง แม้แต่ไฟล์ที่สั้นมาก ๆ ก็มีอะไรให้คุณเลือกมากมายเมื่อคุณต้องมองดูตัวอักษรทีละตัว

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