Исправить терминал после отображения двоичного файла

122

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

cat /bin/ls

Теперь я не могу прочитать ни слова в этом терминале (консоль Linux). Как я могу это исправить?

двуустка-нг
источник
4
Если я правильно понимаю, возможно, ваш терминал прикручен; попробуйте набрать reset.
Патрис Левеск
На самом деле я думаю, что ответ здесь лучше, поэтому лучше пометить как dup другой способ
ilkkachu

Ответы:

165

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

                сс двоичного вывода

Здесь происходит то, что вы только что попытались просмотреть файл, который является программой. Исполняемый файл, который не предназначен для просмотра стандартными средствами просмотра, как я упоминал выше.

метод № 1 - сброс

Чтобы исправить эту проблему, вы можете сделать следующее:

  1. Хит-контроль + C пару раз ( Ctrl+ C)
  2. Введите команду resetи нажмите Return

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

Способ № 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
SLM
источник
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работала (после случайного вызова printPython bytearray). Я имел успех со способом 2, перечисленным в этом полезном блоге .

С тех пор я создал самый полезный псевдоним:

alias fix='echo -e "\033c"'
Бенджамин Риггс
источник
2
Я знаю, что это старый, но это единственный ответ выше, который работал для меня! Спасибо
Jredd
Это echo -e "\033c"помогло мне очистить сеанс терминального входа в систему с SSH, который был перепутан после a cat /etc/localtime.
Pro Backup
Это работало с OpenBSD, когда все остальные - нет.
ГВС
1
Дальнейшие эксперименты с screen (1) показали, что принудительная отладка всех сеансов (-D) и последующая выдача команд сброса на базовый экран терминала может решить эту проблему. может также потребоваться переименовать поврежденные имена окон, которые могут повторно отображать те же двоичные данные на терминале, вызывая его повреждение (и затем снова сбрасывать).
математика
1
Мой размер терминала (LINES) был сокращен примерно вдвое после использования vi при подключении к консоли удаленного хоста linux через SOL. Удаленный сеанс имел LINES = 24, тогда как мой локальный сеанс MAC имел LINES = 51. echo -e "\ 033c" работал для меня, но ни одно из других исправлений, которые я пробовал, не помогло ('stty sane', tput rs1, tput sgr0, reset).
Марк
7

Ни один предыдущий ответ не работал для меня. Но, похоже, это помогло .bashrc add:

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

и затем, когда проблема возникает, напечатайте это (даже если вы, вероятно, не можете видеть это!)

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

Большое спасибо предыдущим заявителям. Кроме того, как примечание, причина того, что ваш терминал работает неправильно при отображении этих исполняемых файлов (или хранилищ ключей и т. Д.), Заключается в том, что эти файлы часто содержат двоичные последовательности, которые являются управляющими кодами. Управляющие коды могут выполнять случайные действия, например переключаться на набор графических символов, устанавливать один и тот же цвет переднего плана и фона и т. Д.

Стивен легко развлекается
источник
То же самое случилось Ничто не сработало для меня, только этот комбо ...
Правда
1
Я назвал мойsane
kodeninja
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, снова вышел и все вернулось на круги своя.

xdevs23
источник
0

В дополнение к другим ответам, советующим, как сбросить настройки терминала, я полагал, что коррупцию нельзя избежать, если ее не охранять должным образом. Поэтому я лучше отправлю вывод в простой текстовый конвертер cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

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

угорь боже
источник