Corrigir terminal após exibir um arquivo binário

122

Eu tentei comando catcom um arquivo executável:

cat /bin/ls

Agora não consigo ler nenhuma palavra neste terminal (console Linux). Como posso corrigir isso?

acaso
fonte
4
Se bem entendi, talvez seu terminal esteja ferrado; tente digitar reset.
Patrice Levesque
Na verdade eu acho que a resposta está aqui são melhores, então é melhor marca como dup para o outro lado
ilkkachu

Respostas:

165

Muitas vezes, em um terminal Unix / Linux (Bash), por exemplo, você usa os comandos moreou lessou catpara exibir um arquivo. Quando você faz isso e o arquivo não deve ser visualizado (como /bin/ls), você obtém uma saída como esta:

                ss de saída binária

O que está acontecendo aqui é que você apenas tentou visualizar um arquivo que é um programa. Um executável que não deve ser visualizado com visualizadores padrão, como mencionei acima.

método # 1 - redefinir

Para corrigir esse problema, você pode fazer o seguinte:

  1. Pressione Control + C algumas vezes ( Ctrl+ C)
  2. Digite o comando resete pressione return

Isso normalmente deve colocar seu terminal de volta em um modo mais normal. Vou mencionar mais uma coisa, quando você executar as etapas acima, digitando-as às cegas no seu terminal. Portanto, verifique se você está digitando corretamente.

método # 2 - stty sane

Conforme sugerido nos comentários de @sendmoreinfo, você pode ter mais sorte usando os seguintes comandos, se o acima não funcionar:

$ stty sane
$ tput rs1

determinando o tipo de um arquivo

Aliás, se você encontrar um arquivo e não tiver certeza de que isso vai atrapalhar seu terminal, você pode inspecionar o arquivo usando o comando fileque informará o tipo de arquivo que ele é.

Por exemplo, com /bin/lsesse arquivo mostra a seguinte saída:

$ 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
fonte
15
resetnão é uma cura 100% para a loucura terminal. Tente stty saneseguido por tput rs1.
sendmoreinfo
@sendmoreinfo - obrigado Adicionei sua sugestão à resposta. Eu tinha usado, stty sanemas nunca tput.
Slm
1
na verdade, preciso pesquisar mais isso. reset deve enviar uma string rs1. Um bom teste (pelo menos para o xterm) é tornar o cursor invisível e ver se a redefinição o traz de volta.
sendmoreinfo
4
resetfuncionou no meu caso
code_monk 8/03/2015
1
cleartambém funciona para casos leves.
Navin
36

Eu tive uma ocasião em que nenhum dos truques habituais, resetou stty sane, trabalhou (depois de acidentalmente chamar printem um bytearray python). Eu tive sucesso com o método 2 listado neste blog útil .

Desde então, criei um alias mais útil:

alias fix='echo -e "\033c"'
Benjamin Riggs
fonte
2
Eu sei que isso é antigo, mas esta é a única resposta acima que funcionou para mim! Graças
jredd
Isso echo -e "\033c"me ajudou a limpar uma sessão de terminal de login SSH sem caracteres e misturada após a cat /etc/localtime.
Pro Backup
Isso funcionou com o OpenBSD, quando todos os outros não.
DHW
1
uma experimentação adicional com a tela (1) encontrou a remoção forçada de todas as sessões (-D) e a emissão dos comandos de reinicialização na tela do terminal subjacente foi executada, o que poderia resolver o problema. também pode ser necessário renomear nomes de janelas corrompidos que podem exibir novamente os mesmos dados binários no terminal, causando a corrupção (e redefinindo novamente).
math
1
O tamanho do meu terminal (LINES) foi reduzido pela metade após o uso do vi durante a conexão ao console de um host remoto do linux via SOL. A sessão remota teve LINES = 24 enquanto minha sessão local do MAC teve LINES = 51. echo -e "\ 033c" funcionou para mim, mas nenhuma das outras correções que tentei ('stty sane', tput rs1, tput sgr0, redefinição).
Mark
7

Nenhuma resposta anterior única funcionou para mim. Mas isso parecia fazer o truque no .bashrc add:

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

e quando o problema ocorrer, digite isto (mesmo que você provavelmente não consiga vê-lo!)

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

Muito obrigado aos autores anteriores. Além disso, como uma observação lateral, a razão pela qual seu terminal fica instável ao mostrar os arquivos executáveis ​​(ou keystores, etc) é que esses arquivos geralmente contêm sequências binárias que são códigos de controle. Os códigos de controle podem fazer coisas aleatórias, como mudar para um conjunto de caracteres gráficos, definir cores de primeiro plano e plano de fundo para a mesma coisa, etc.

Steven, o Facilmente Divertido
fonte
O mesmo aconteceu. Nada funcionou para mim, apenas esta combinação ...
TrueY
1
Liguei para meusane
qodeninja 16/03
4

tmuxos usuários podem enviar todos esses comandos para seu shell, mas a redefinição não é elevada ao tmuxpainel.

Crie uma nova janela do tmux: ctrl-B c tmux list-panes Anote o número do painel que você acha que está borked, normalmente 0. Vamos chamá-loPPP

Selecione a janela do tmux, onde XXXé o número da janela que é acionada, não necessariamente o mesmo que o número do painel. ctrl-B XXX tmux send-key -R -t PPP

Você verá todos os comandos nas outras respostas a esta pergunta que chegaram ao seu shell, mas não funcionaram! Talvez um cego tmux send-key -R -t PPPfuncione, mas não posso testar.

Jack Wasey
fonte
3

Eu tenho quase o mesmo alias que o post anterior, com uma pequena alteração (em tput resetvez de rs1) e um comando adicionado ( setterm -reset):

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

Nada acima me ajudou. No entanto, Jack Wasey mencionou o tmux, então eu apenas corri tmux, saí novamente e tudo voltou ao normal.

xdevs23
fonte
0

Além de outras respostas que recomendam como redefinir o terminal, achei que a corrupção não pode ser evitada, a menos que seja adequadamente protegida. Então é melhor eu enviar a saída para um simples conversor de texto cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

A visualização e edição de arquivos binários parece possível com hexdump -Ce vi -R( :%!xxd -g1para uma visualização hexadecimal e :%!xxd -g1 -rpara salvar alterações hexadecimais).

enguia ghEEz
fonte