แก้ไขเทอร์มินัลหลังจากแสดงไฟล์ไบนารี


122

ฉันพยายามสั่งcatด้วยไฟล์ปฏิบัติการ:

cat /bin/ls

ตอนนี้ฉันไม่สามารถอ่านคำใด ๆ ในเทอร์มินัลนี้ (คอนโซล Linux) ฉันจะแก้ไขได้อย่างไร


4
ถ้าฉันเข้าใจถูกต้องบางทีเทอร์มินัลของคุณอาจเมา resetลองพิมพ์
Patrice Levesque


จริง ๆ แล้วฉันคิดว่าคำตอบของที่นี่ดีกว่าทำเครื่องหมายให้ดีกว่าเป็นวิธีอื่น
ilkkachu

คำตอบ:


165

บ่อยครั้งเมื่ออยู่ในเทอร์มินัล Unix / Linux (Bash) เช่นคุณจะใช้คำสั่งmoreหรือlessหรือcatเพื่อดูไฟล์ เมื่อคุณทำสิ่งนี้และไฟล์ไม่ได้มีไว้ให้ดู (เช่น/bin/ls) คุณจะได้ผลลัพธ์ดังนี้:

                เอสเอสของเอาต์พุตไบนารี

สิ่งที่เกิดขึ้นที่นี่คือคุณพยายามดูไฟล์ที่เป็นโปรแกรม ปฏิบัติการที่ไม่ได้หมายถึงให้ดูกับผู้ดูมาตรฐานตามที่ฉันได้กล่าวไว้ข้างต้น

วิธี # 1 - รีเซ็ต

ในการแก้ไขปัญหานี้คุณสามารถทำสิ่งต่อไปนี้:

  1. กด Control + C สองสามครั้ง ( Ctrl+ C)
  2. พิมพ์คำสั่งresetและกดส่งคืน

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

วิธีที่ # 2 - สติมีสติ

ตามที่แนะนำในความคิดเห็นโดย @sendmoreinfo คุณอาจโชคดีกว่าที่ใช้คำสั่งต่อไปนี้แทนหากคำสั่งด้านบนไม่ทำงาน:

$ stty sane
$ tput rs1

กำหนดประเภทของไฟล์

บังเอิญถ้าคุณเจอไฟล์และไม่แน่ใจว่ามันจะทำให้เครื่องเทอร์มินัลของคุณวุ่นวายคุณสามารถตรวจสอบไฟล์โดยใช้คำสั่งfileซึ่งจะรายงานประเภทของไฟล์

ตัวอย่างเช่นด้วย/bin/lsไฟล์นั้นจะแสดงผลลัพธ์ต่อไปนี้:

$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

15
resetไม่ได้รักษา 100% สำหรับความบ้าขั้ว พยายามที่จะตามมาด้วยstty sane tput rs1
sendmoreinfo

@sendmoreinfo - ขอบคุณฉันได้เพิ่มข้อเสนอแนะในคำตอบแล้ว ผมใช้แต่ไม่เคยstty sane tput
slm

1
ที่จริงฉันต้องค้นคว้าเพิ่มเติมอีก การรีเซ็ตควรจะส่งสตริง rs1 การทดสอบที่ดี (สำหรับ xterm อย่างน้อย) คือการทำให้เคอร์เซอร์มองไม่เห็นและดูว่าการรีเซ็ตจะนำมันกลับมาหรือไม่
sendmoreinfo

4
resetทำงานในกรณีของฉัน
code_monk

1
clearใช้ได้กับกรณีที่ไม่รุนแรง
Navin

36

ฉันมีโอกาสที่ไม่มีกลอุบายทั่วไปresetหรือใช้stty saneงานได้ (หลังจากโทรprintไปหาหลามโดยไม่ได้ตั้งใจ) ฉันประสบความสำเร็จด้วยวิธีที่ 2 ที่ระบุไว้ในบล็อกที่เป็นประโยชน์นี้

ฉันได้สร้างนามแฝงที่มีประโยชน์ที่สุดตั้งแต่ฉัน:

alias fix='echo -e "\033c"'

2
ฉันรู้ว่ามันเก่า แต่นี่เป็นคำตอบเดียวที่ได้ผลสำหรับฉัน! ขอบคุณ
jredd

นี้echo -e "\033c"ช่วยให้ฉันเพื่อทำความสะอาดตัวอักษรอ่านไม่ออก SSH cat /etc/localtimeเข้าสู่ระบบเซสชั่นสถานีที่ถูกผสมขึ้นหลังจากที่
สำรองข้อมูล Pro

สิ่งนี้ใช้ได้กับ OpenBSD เมื่อคนอื่น ๆ ไม่ได้ทำ
DHW

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

1
ขนาดเทอร์มินัลของฉัน (LINES) ถูกลดลงครึ่งหนึ่งหลังจากใช้ vi ในขณะที่เชื่อมต่อกับคอนโซลของโฮสต์ลินุกซ์ระยะไกลผ่านทาง SOL เซสชันระยะไกลมี LINES = 24 ในขณะที่เซสชัน MAC ในพื้นที่ของฉันมี LINES = 51 echo -e "\ 033c" ใช้งานได้สำหรับฉัน แต่ไม่มีการแก้ไขอื่น ๆ ที่ฉันลองทำ ('stty sane', tput rs1, tput sgr0, รีเซ็ต)
ทำเครื่องหมาย

7

ไม่มีคำตอบเดียวที่ใช้ได้สำหรับฉัน แต่นี่ดูเหมือนจะทำเคล็ดลับใน. bashrc เพิ่ม:

alias fix='reset; stty sane; tput rs1; clear; echo -e "\033c"'

และเมื่อเกิดปัญหาขึ้นให้พิมพ์สิ่งนี้ (แม้ว่าคุณอาจมองไม่เห็น!)

(ctl-c, ctl-c, ctl-c)
fix

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


เกิดขึ้นเหมือนกัน ไม่มีอะไรทำงานให้ฉันแค่คอมโบนี้ ...
TrueY

1
ฉันโทรหาฉันsane
qodeninja

4

tmuxผู้ใช้อาจสามารถส่งคำสั่งเหล่านี้ทั้งหมดไปยังเชลล์ได้ แต่การรีเซ็ตไม่ได้รับการยกระดับไปยังtmuxบานหน้าต่าง

ทำให้หน้าต่าง tmux ใหม่: ctrl-B c tmux list-panes หมายเหตุจำนวนบานหน้าต่างที่คุณคิดว่าเป็น borked 0โดยทั่วไป เรียกมันว่าPPP

เลือกหน้าต่าง tmux โดยที่XXXหมายเลขหน้าต่างซึ่งถูกบอร์ไม่จำเป็นต้องเหมือนกับหมายเลขบานหน้าต่าง ctrl-B XXX tmux send-key -R -t PPP

จากนั้นคุณจะเห็นคำสั่งทั้งหมดในคำตอบอื่น ๆ สำหรับคำถามนี้ซึ่งทำให้กับเชลล์ของคุณ แต่ไม่ได้ผล! บางทีคนตาบอดtmux send-key -R -t PPPอาจใช้ได้ แต่ฉันไม่สามารถทดสอบได้


3

ฉันมีนามแฝงใกล้เคียงกับโพสต์ก่อนหน้าโดยมีการเปลี่ยนแปลงเพียงเล็กน้อย ( tput resetแทนrs1) และอีกหนึ่งคำสั่งที่เพิ่ม ( setterm -reset):

alias clr='echo -e "\033c" ; stty sane; setterm -reset; reset; tput reset; clear'

1

ไม่มีอะไรข้างต้นช่วยฉัน อย่างไรก็ตาม Jack Wasey พูดถึง tmux ดังนั้นฉันจึงวิ่งtmuxออกไปอีกครั้งและทุกอย่างกลับมาเป็นปกติ


0

นอกจากคำตอบอื่น ๆ ที่แนะนำวิธีการรีเซ็ตเทอร์มินัลฉันคิดว่าความเสียหายนั้นไม่สามารถหลีกเลี่ยงได้หากไม่ได้รับการปกป้องอย่างเหมาะสม ดังนั้นฉันควรส่งออกไปยังตัวแปลงที่เป็นมิตรกับข้อความง่ายกว่าcat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

การดูและแก้ไขไฟล์ไบนารีดูเหมือนจะเป็นไปได้ด้วยhexdump -Cและvi -R( :%!xxd -g1สำหรับมุมมองฐานสิบหกและ:%!xxd -g1 -rสำหรับการบันทึกการเปลี่ยนแปลงฐานสิบหก)

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