Napraw terminal po wyświetleniu pliku binarnego


122

Próbowałem polecenia catz plikiem wykonywalnym:

cat /bin/ls

Teraz nie mogę odczytać żadnego słowa w tym terminalu (konsola Linux). Jak mogę to naprawić?


4
Jeśli dobrze rozumiem, być może twój terminal jest zepsuty; spróbuj pisać reset.
Patrice Levesque


Właściwie myślę, że odpowiedzi tutaj są lepsze, więc lepiej zaznacz jako dup w drugą stronę
ilkkachu

Odpowiedzi:


165

Często czasy, kiedy w terminalu Unix / Linux (bash) na przykład użyjesz polecenia morelub lessczy cataby wyświetlić plik. Gdy to zrobisz, a plik nie jest przeznaczony do przeglądania (np. /bin/ls), Otrzymasz wynik w następujący sposób:

                ss wyjścia binarnego

Chodzi o to, że właśnie próbowałeś wyświetlić plik, który jest programem. Plik wykonywalny, który nie powinien być oglądany w standardowych przeglądarkach, jak wspomniałem powyżej.

metoda nr 1 - reset

Aby rozwiązać ten problem, możesz wykonać następujące czynności:

  1. Kilkakrotnie naciśnij Control + C ( Ctrl+ C)
  2. Wpisz polecenie reseti naciśnij klawisz Return

Zwykle powinno to przywrócić terminal do normalnego trybu. Wspomnę jeszcze o jednej rzeczy, gdy wykonasz powyższe kroki, wpisując je na ślepo w swoim terminalu. Upewnij się więc, że wpisujesz go poprawnie.

metoda nr 2 - stty przy zdrowych zmysłach

Jak sugerowano w komentarzach @sendmoreinfo, możesz mieć więcej szczęścia, używając następujących poleceń, jeśli powyższe nie działa:

$ stty sane
$ tput rs1

określanie typu pliku

Nawiasem mówiąc, jeśli natkniesz się na plik i nie jesteś pewien, czy to zepsuje twój terminal, możesz sprawdzić plik za pomocą polecenia, filektóre zgłosi typ pliku.

Na przykład z /bin/lstym plikiem pokazuje następujące dane wyjściowe:

$ 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
resetnie jest w 100% lekarstwem na śmiertelne szaleństwo. Spróbuj, stty sanea następnie tput rs1.
sendmoreinfo

@sendmoreinfo - dzięki dodałem twoją sugestię do odpowiedzi. Użyłem, stty saneale nigdy tput.
slm

1
właściwie muszę to więcej zbadać. reset ma wysłać łańcuch rs1. Dobrym testem (przynajmniej dla Xterm) jest uczynienie kursora niewidocznym i sprawdzenie, czy reset go przywraca.
sendmoreinfo

4
resetpracował w moim przypadku
code_monk

1
cleardziała również w łagodnych przypadkach.
Navin

36

Miałem okazję, gdy żadna ze zwykłych sztuczek, resetlub stty sane, nie działała (po przypadkowym wywołaniu printbajtraya pytona). Odniosłem sukces z metodą 2 wymienioną na tym pomocnym blogu .

Od tego czasu stworzyłem najbardziej pomocny alias:

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

2
Wiem, że to stare, ale to jedyna powyższa odpowiedź, która zadziałała dla mnie! Dzięki
jredd

Ten echo -e "\033c"pomógł mi oczyścić sesję terminala SSH logowania znakowym zniekształcone, że miesza się po cat /etc/localtime.
Pro Backup

Działa to z OpenBSD, podczas gdy wszystkie inne nie.
Ciepła woda

1
dalsze eksperymenty z screenem (1) wykazały wymuszenie detatchowania wszystkich sesji (-D), a następnie wydanie komend resetowania na ekranie terminala, na którym został uruchomiony, może rozwiązać problem. może także wymagać zmiany nazw uszkodzonych nazw okien, które mogą ponownie wyświetlać te same dane binarne na terminalu, powodując ich uszkodzenie (a następnie zresetować jeszcze raz).
matematyka

1
Mój rozmiar terminala (LINES) został zmniejszony o około połowę po użyciu vi podczas łączenia się z konsolą zdalnego hosta Linux za pośrednictwem SOL. Sesja zdalna miała LINES = 24, natomiast moja lokalna sesja MAC miała LINES = 51. echo -e "\ 033c" nie działało dla mnie, ale żadna z innych poprawek, które próbowałem, nie działało ('stty sane', tput rs1, tput sgr0, reset).
Mark

7

Żadna wcześniejsza odpowiedź nie działała dla mnie. Ale wydaje się, że to załatwi sprawę w .bashrc dodaj:

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

a następnie, gdy wystąpi problem, wpisz to (nawet jeśli prawdopodobnie go nie widzisz!)

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

Ogromne podziękowania dla poprzednich zgłaszających. Na marginesie, powodem, dla którego twój terminal robi się nieporadny podczas wyświetlania plików wykonywalnych (lub magazynów kluczy itp.) Jest to, że pliki te często zawierają sekwencje binarne, które są kodami sterującymi. Kody kontrolne mogą wykonywać losowe czynności, takie jak przełączanie na zestaw znaków graficznych, ustawianie kolorów pierwszego planu i tła na to samo itp.


To samo się stało. Nic mi nie działało, tylko ta kombinacja ...
TrueY

1
Zadzwoniłem do mojegosane
qodeninja

4

tmuxużytkownicy mogą być w stanie wysłać wszystkie te polecenia do swojej powłoki, ale resetowanie nie zostanie podniesione do tmuxpanelu.

Utwórz nowe okno Tmux: Zazwyczaj zanotuj ctrl-B c tmux list-panes numer panelu, który Twoim zdaniem jest zablokowany 0. Nazwijmy toPPP

Wybierz okno tmux, gdzie XXXznajduje się numer okna, który jest wykorkowany, niekoniecznie taki sam jak numer panelu. ctrl-B XXX tmux send-key -R -t PPP

Zobaczysz wtedy wszystkie polecenia w pozostałych odpowiedziach na to pytanie, które trafiły do ​​twojej powłoki, ale nie działały! Może żaluzja tmux send-key -R -t PPPzadziała, ale nie mogę przetestować.


3

Mam prawie taki sam alias jak w poprzednim poście, z jedną małą zmianą ( tput resetzamiast rs1) i jedną dodaną komendą ( setterm -reset):

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

1

Nic powyżej mi nie pomogło. Jednak Jack Wasey wspomniał o tmuxie, więc po prostu pobiegłem tmux, wyszedłem ponownie i wszystko wróciło do normy.


0

Oprócz innych odpowiedzi wskazujących, jak zresetować terminal, doszedłem do wniosku, że korupcji nie da się uniknąć, jeśli nie będzie odpowiednio strzeżona. Lepiej więc wyślę dane wyjściowe do prostego konwertera tekstowego cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

Przeglądanie i edycja plików binarnych wydaje się możliwe przy pomocy hexdump -Ci vi -R( :%!xxd -g1dla widoku szesnastkowego i :%!xxd -g1 -rdo zapisywania zmian szesnastkowych).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.