Fix terminal after displaying a binary file

I’d tried command cat with an executable file:

cat /bin/ls

Now I can’t read any word in this terminal (Linux console). How can I fix it?

Asked By: lotusirous


Often times when in a Unix/Linux terminal (Bash) for example you’ll use the commands more or less or cat to view a file. When you do this and the file isn’t meant to be viewed (such as /bin/ls) you’ll get output like this:

                ss of binary output

What’s going on here is that you just tried to view a file that’s a program. An executable which aren’t meant to be viewed with standard viewers as I mentioned above.

method #1 – reset

To fix this issue you can do the following:

  1. Hit Control + C a couple of times (Ctrl+C)
  2. Type the command reset and hit return

This should usually put your terminal back into a more normal mode. I’ll mention one more thing, when you do the steps above, you’ll by typing them blind into your terminal. So just make sure you’re typing it correctly.

method #2 – stty sane

As suggested in the comments by @sendmoreinfo you might have better luck using the following commands instead if the above doesn’t work:

$ stty sane
$ tput rs1

determining a files’ type

Incidentally, if you come across a file and aren’t sure if it’s going to mess up your terminal you can inspect the file using the command file which will report back the type of file it is.

For example, with /bin/ls that file shows the following output:

$ 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
Answered By: slm

I’ve had an occasion where none of the usual tricks, reset or stty sane, worked (after accidentally calling print on a python bytearray). I had success with method 2 listed on this helpful blog.

I’ve since created a most helpful alias:

alias fix='echo -e "33c"'
Answered By: Benjamin Riggs

No single prior answer worked for me. But this seemed to do the trick in .bashrc add:

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

and then when the problem occurs type this (even though you probably can’t see it!)

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

Much thanks to the prior submitters. Also, as a side note, the reason that your terminal goes wonky when showing those executable files (or keystores, etc) is that those files often contain binary sequences that are control codes. The control codes may do random things like switch to a graphics character set, set foreground and background colors to the same thing, etc.

I have almost the same alias as the previous post, with one small change (tput reset instead of rs1) and one added command (setterm -reset):

alias clr='echo -e "33c" ; stty sane; setterm -reset; reset; tput reset; clear'
Answered By: Cyril Chaboisseau

tmux users might be able to send all these commands to their shell, but the resetting doesn’t get elevated to the tmux pane.

Make new tmux window:
ctrl-B c
tmux list-panes
Note the pane number you think is borked, typically 0. Let’s call it PPP

Select the tmux window, where XXX is the window number which is borked, not necessarily the same as pane number.
ctrl-B XXX
tmux send-key -R -t PPP

You will then see all the commands in the other answers to this question which made it to your shell, but didn’t work! Maybe a blind tmux send-key -R -t PPP will work, but I can’t test.

Answered By: Jack Wasey

Nothing above helped me. However, Jack Wasey mentioned tmux, so I just ran tmux, exited again and everything was back to normal.

Another solution is:

Answered By: xdevs23

In addition to other answers advising how to reset the terminal, I figured the corruption cannot be avoided unless properly guarded. So I better send the output to a simple text-friendly converter cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

Viewing and editing binary files seems possible with hexdump -C and vi -R (:%!xxd -g1 for a hex view and :%!xxd -g1 -r for saving hex changes).

Answered By: eel ghEEz

I know this has been here a while, but while many of the other answers have worked for me, reset, stty sane, sometimes neither of those has worked for me and I always resort to:

echo ^v^o

That’s echo Ctrl+V followed by Ctrl+O

Answered By: John L

This garbled terminal mode is called Alternate Character Set , ACS for short.

to get out of it:

$ tput sgr0             # stop all special effects, including ACS

$ setterm --default     # equivalent
$ setterm --reverse=off # equivalent


$ tput rmacs       # stop ACS

to start ACS:

$ tput smacs       # start  ACS

on some terminals you need to not only start it but also enable it:

$ tput enacs smacs   # enable and start ACS, only some terminals require this

if your terminal also has other defects like colors, background, bold, italic, blink, … :

$ tput sgr0        # disable all special effects, including ACS

# you can experiment with these control sequences:
$ tput bold       # bold/bright
$ tput rev        # reverse mode
$ tput setaf 1    # set foreground color to red [0-7]
$ tput setab 3    # set background color to yellow [0-7]
$ tput bold setaf 1 setab 3    # combined sequence

recommended :
if you want to never have to worry about these defects in your working environment, you can integrate the reset sequence into you prompt, at the appropriate place in your init script/config like this:

# in init script , for example ~/.bash_profile
export PS1='['`tput sgr0`'] u@h w $ '

# or prompt with colors and reset at the end
export PS1=' [e[37m]u[e[m]@[e[32m]h [e[37m]W $ ['`tput sgr0`

other commands that could influence it:

# the following two enable/disable ACS, the effects are reversed on some terminals
# these sometimes interact with tput smacs/rmacs in wierd ways
$ echo ^V^O    # echo Ctrl-V,Ctrl-O,Enter
$ echo ^V^N

more ways to stop ACS, also clears the screen:

$ echo -e 'ec'                  #
$ echo -e '33c'                # these 3 are equivalent
$ echo <ctrl-v><esc><c>          #

$ reset                 #
$ tput rs1              # rs2/rs3
$ tput reset            #          don't work on some terminals
$ setterm --reset       #
$ setterm --initialize  #

if you want to inspect the control sequences, which are different on different terminals:

$ tput sgr0 | cat -v
$ tput sgr0 | od -c    # or od -ca for more representations 
$ infocmp

more info in the man pages for terminfo, setterm, infocmp, tput, cat, od

Answered By: furiozo ga
Categories: Answers Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.