Виправити термінал після відображення бінарного файлу


122

Я спробував команду catз виконуваним файлом:

cat /bin/ls

Тепер я не можу прочитати жодного слова в цьому терміналі (консоль Linux). Як я можу це виправити?


4
Якщо я правильно розумію, можливо, ваш термінал прикручений; спробуйте ввести текст reset.
Патріс Левеск


Насправді я думаю, що відповідь тут краща, тому краще позначте як дуб в інший спосіб
ilkkachu

Відповіді:


165

Часто , коли в терміналі Unix / Linux (Bash), наприклад , ви будете використовувати команди moreабо lessабо catдля перегляду файлу. Коли ви зробите це, і файл не призначений для перегляду (наприклад, /bin/ls), ви отримаєте такий результат:

                ss двійкового виходу

Тут відбувається те, що ви просто намагалися переглянути файл, який є програмою. Виконаний файл, який не призначений для перегляду у стандартних глядачів, як я вже згадував вище.

метод №1 - скидання

Щоб виправити цю проблему, ви можете зробити наступне:

  1. Кілька разів натисніть + C ( Ctrl+ C)
  2. Введіть команду resetта натисніть return

Зазвичай це повинно повернути термінал у більш нормальний режим. Я згадаю ще одну річ, коли ви виконайте дії, описані вище, ви вкажете їх сліпо у свій термінал. Тому просто переконайтеся, що ви правильно ввели його.

метод №2 - stty sane

Як запропоновано в коментарях @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також працює в легких випадках.
Навін

36

У мене був випадок, коли жоден із звичайних хитрощів, resetабо stty sane, не спрацював (після випадкового виклику printв байтарі пітона). Я мав успіх із способом 2, переліченим у цьому корисному блозі .

Я з тих пір створив найкорисніший псевдонім:

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

2
Я знаю, що це старе, але це єдина відповідь вище, яка працювала на мене! Спасибі
jredd

Це echo -e "\033c"допомогло мені прибрати сеансовий термінал входу в SSH, який змішався після cat /etc/localtime.
Pro Backup

Це працювало з OpenBSD, коли всі інші цього не робили.
ГВС

1
подальший експеримент із екраном (1) виявив примусове від'єднання всіх сеансів (-D), після чого виконувались команди скидання на базовий екран термінала, це могло виправити проблему. може знадобитися також перейменувати пошкоджені імена вікна, які можуть повторно відображати ті самі бінарні дані в терміналі, що призводить до їх пошкодження (а потім ще раз скинутись).
математика

1
Мій термінальний розмір (LINES) був скорочений приблизно вдвічі після використання vi під час підключення до консолі віддаленого Linux-сервера через SOL. Віддалений сеанс мав LINES = 24, тоді як мій локальний сеанс MAC мав LINES = 51. echo -e "\ 033c" працював для мене, але жодного з інших виправлень, які я пробував, не робив ('stty sane', tput rs1, tput sgr0, скидання).
Марк

7

Жодна попередня відповідь не працювала для мене. Але це, здавалося, зробило трюк у .bashrc add:

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

а потім, коли виникає проблема, введіть це (хоча ви, ймовірно, не можете його побачити!)

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

Велике спасибі попереднім дописувачам. Крім того, як бічна примітка, причиною того, що ваш термінал стає непростим під час показу цих виконуваних файлів (або магазинів брелоків тощо), є те, що ці файли часто містять двійкові послідовності, що є кодами управління. Коди управління можуть виконувати випадкові речі, такі як перехід на графічний набір символів, встановлення кольорів переднього плану та фонових зображень на одне і те ж і т.д.


Те саме сталося. Ніщо не працювало для мене, тільки цей комбо ...
Правда,

1
Я зателефонував своємуsane
qodeninja

4

tmuxкористувачі, можливо, зможуть надіслати всі ці команди до своєї оболонки, але скидання не буде підвищено до tmuxобласті.

Створіть нове вікно tmux: ctrl-B c tmux list-panes Зауважте, як правило, номер панелі, який, на вашу думку, є зашкодженим 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

Ніщо вище мені не допомогло. Однак Джек Уейсі згадав про tmux, тому я просто побіг tmux, знову вийшов і все повернулося до норми.


0

На додаток до інших відповідей, що вказують на те, як скинути термінал, я вважав, що корупції не вдасться уникнути, якщо не захищено належним чином. Тому я краще надішліть вихід у простий текстовий конвертер cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

Перегляд та редагування двійкових файлів здається можливим за допомогою hexdump -Cта vi -R( :%!xxd -g1для шістнадцяткового перегляду та :%!xxd -g1 -rдля збереження шістнадцяткових змін).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.