SSH Escape Sequence


Overview

An escape sequence is a set of characters which signals to the application, another action will be taken. For example, sending the break sequence to a serial console, or the hangup / terminate sequence to a stuck ssh session.

To access the escape sequence in a terminal based ssh session use the ~ followed by the option. For example, ~? displays the escape sequence menu within SSH.

Details

Connect to a server through ssh:

jemurray@jasons-mbp:~ $ ssh -A shell.jasonmurray.org
Autopushing login request to phone...
Success. Logging you in...
jemurray@shell:~$

Press ~? to bring up the escape sequence menu:

jemurray@shell:~$ ~?
Supported escape sequences:
 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

The most common reason to access the escape menu is to send break to a serial terminal server or terminate a hung ssh session.

To send break, enter: ~B. I don’t have a serial console server in my home lab to demo this option. If you are reading this I suspect you know what it does.

What happens if you have to jump through two SSH hosts and need to access the escape menu on the second host? ssh has an option to send an escape sequence to the escape sequence by entering two ~’s.

If we log into 2 hosts, one after another, like this: jasons-mbp -> shell -> sdf; The escape sequence menu on the SDF server, must be accessed by entering 2 ~ characters.

For example, after logging into SDF, I need to end a hung ssh session. By pressing ~~. (2 tildes and a dot), the hung ssh session will disconnect from SDF only.

jemurray@shell:~$
jemurray@shell:~$ ssh sdf.org
jemurray@sdf:~ $
jemurray@sdf:~ $ Connection to sdf.org closed.
jemurray@shell:~$
jemurray@shell:~$

If a single ~ was entered, you will disconnect from the first host. In this example, we connected to SFD and pressed ~. which disconnected all ssh sessions:

jemurray@sdf:~ $
jemurray@sdf:~ $ Connection to shell.jasonmurray.org closed.
jemurray@jasons-mbp:~ $

This works for ssh sessions that are N deep by entering ~ * N-times. For example, if you were connected to a ssh server, chained through four servers, sending the break sequence would look like this:

~~~~B