You are here

Resuming after sleep mode, terminating/hanging up a frozen SSH session in Linux

Submitted by Druss on Fri, 2015-03-20 11:55

So, I am often SSH'd into a remote server from my Kubuntu desktop. I also rarely switch off my desktop and prefer to just hit sleep instead. One of the things that can be annoying when I resume the desktop is that the previous SSH session is now unresponsive/frozen as SSH believes that it is still connected to the remote server while the server has given up on the old session long ago. No amount of CTRL + C or CTRL + Z banging is going to terminate the session which can take an inordinately long wait to time out.

This is of course not a unique problem and SSH offers a series of escape sequences for situations like this. The following is the relevant section from the SSH man page:

     When a pseudo-terminal has been requested, ssh supports a number of functions
     through the use of an escape character.

     A single tilde character can be sent as ~~ or by following the tilde by a charac‐
     ter other than those described below.  The escape character must always follow a
     newline to be interpreted as special.  The escape character can be changed in con‐
     figuration files using the EscapeChar configuration directive or on the command
     line by the -e option.

     The supported escapes (assuming the default ‘~’) are:

     ~.      Disconnect.

     ~^Z     Background ssh.

     ~#      List forwarded connections.

     ~&      Background ssh at logout when waiting for forwarded connection / X11 ses‐
             sions to terminate.

     ~?      Display a list of escape characters.

     ~B      Send a BREAK to the remote system (only useful for SSH protocol version 2
             and if the peer supports it).

     ~C      Open command line.  Currently this allows the addition of port forwardings
             using the -L, -R and -D options (see above).  It also allows the cancella‐
             tion of existing port-forwardings with -KL[bind_address:]port for local,
             -KR[bind_address:]port for remote and -KD[bind_address:]port for dynamic
             port-forwardings.  !command allows the user to execute a local command if
             the PermitLocalCommand option is enabled in ssh_config(5).  Basic help is
             available, using the -h option.

     ~R      Request rekeying of the connection (only useful for SSH protocol version 2
             and if the peer supports it).

     ~V      Decrease the verbosity (LogLevel) when errors are being written to stderr.

     ~v      Increase the verbosity (LogLevel) when errors are being written to stderr.

Make note of the fact that the escape sequence only works after a newline. IOW, hit RETURN + ~ + ~ + . to disconnect from the session.

Hope this helps :)