วิธีการป้องกันเอาท์พุทคอนโซลแบบสุ่มไม่ให้แตกขั้ว?


23

มีคำถามมากมายเกี่ยวกับ SE cat /dev/urandomที่แสดงวิธีการกู้คืนจากสถานีทำลายโดยมี สำหรับผู้ที่ไม่คุ้นเคยกับปัญหานี้ - นี่คือสิ่งที่เกี่ยวกับ:

  1. คุณดำเนินการcat /dev/urandomหรือเทียบเท่า (ตัวอย่างcat binary_file.dat)
  2. ขยะถูกพิมพ์
  3. ที่จะโอเค ... ยกเว้น terminal ของคุณยังคงพิมพ์ขยะแม้กระทั่งหลังจากที่คำสั่งเสร็จเรียบร้อยแล้ว! นี่คือภาพหน้าจอของข้อความที่พิมพ์ผิดที่อยู่ในความเป็นจริงเอาต์พุต g ++:

    ภาพตัวอย่าง

    ฉันเดาว่าคนที่ถูกต้องเกี่ยวกับข้อผิดพลาด C ++ บางครั้งก็เป็นความลับเกินไป!

วิธีการแก้ปัญหาตามปกติคือการเรียกใช้stty sane && resetแม้ว่ามันจะน่ารำคาญที่จะเรียกใช้ทุกครั้งที่เกิดเหตุการณ์นี้

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

ฉันสังเกตเห็นพฤติกรรมเดียวกันใน URxvt, PuTTY และ Linux frame buffer ดังนั้นฉันไม่คิดว่านี่เป็นปัญหาเฉพาะเทอร์มินัล ผู้ต้องสงสัยหลักของฉันคือการที่เอาท์พุทแบบสุ่มมีบางส่วนหลบหนีรหัส ANSI ที่พลิกเข้ารหัสอักขระ (ในความเป็นจริงถ้าคุณเรียกใช้cat /dev/urandomอีกครั้งโอกาสที่มันจะUnbreakขั้วซึ่งดูเหมือนจะยืนยันทฤษฎีนี้) หากนี่ถูกต้องรหัสหลบหนีนี้คืออะไร มีวิธีมาตรฐานในการปิดการใช้งานหรือไม่

คำตอบ:


22

No:

  • ไม่มีวิธีมาตรฐานในการ "ปิดการใช้งาน" และ
  • รายละเอียดของการแตกเป็นจริงเฉพาะเทอร์มินัล แต่
  • มีคุณสมบัติที่ใช้งานบ่อยซึ่งคุณสามารถรับพฤติกรรมที่ไม่เหมาะสมได้

สำหรับฟีเจอร์ที่ใช้งานทั่วไปให้ดูที่ชุดอักขระทางเลือกสไตล์ VT100 ซึ่งเปิดใช้งานโดย^Nและ^O(เปิด / ปิดการใช้งาน) ที่อาจจะถูกระงับในขั้วบางอย่างเมื่อใช้ UTF-8 โหมด แต่ขั้วเดียวกันมีโอกาสที่เพียงพอสำหรับการ trashing หน้าจอของคุณ (พูดคุยเกี่ยวกับหน้าจอ GNU ลินุกซ์คอนโซลฉาบที่นี่) กับลำดับหนีที่พวกเขาไม่รู้จัก

ตัวอย่างของ escape sequence อื่น ๆ บางอินสแตนซ์ขึ้นอยู่กับการตอบสนองจากเทอร์มินัลไปยังเคียวรี (escape sequence) โดยโฮสต์ หากโฮสต์ไม่คาดหวังผลลัพธ์จะเป็นขยะบนหน้าจอ

ในกรณีอื่น ๆ (เห็นได้จากตัวอย่างในอุปกรณ์เครือข่ายที่มีลำดับการ Escape แบบ hardcoded สำหรับคอนโซล Linux) เทอร์มินัลอื่นจะเห็นว่าเป็นแบบผิดปกติและดูเหมือนจะหยุดนิ่ง

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


0

หากคุณอยู่ในการควบคุมและรู้ว่าคำสั่งจะทำให้คุณสับสนฉันมักจะดูผลลัพธ์ในบางอย่างน้อย

head -n4 /dev/urandom | less

ตามปกติดูเหมือนว่าจะจับขยะและพิมพ์ด้วยการมีสติแทนไม่เคยมีปัญหาใด ๆ ที่ฉันจำได้หลังจากออกจาก qซึ่งฉันกล้าหาญในกรณีที่คุณไม่คุ้นเคยกับการเลิกน้อยลง


2
คำถามนี้บอกว่าเขาไม่ได้มองหาวิธีแก้ปัญหาที่ทำให้คุณต้องรู้ล่วงหน้าว่าโปรแกรมจะสร้างไบนารี่เอาท์พุท
Barmar

-1

ไพพ์เอาต์พุตของคำสั่งของคุณ ฯลฯ ไปยังที -


2
มันจะช่วยได้อย่างไร มันจะยังคงพิมพ์ผลลัพธ์ แต่ยังบันทึกไว้ในไฟล์
Barmar

บางทีคุณอาจจะมีความหมายmoreหรือless?
Barmar

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