254

When I connect via ssh to certain servers, it timeouts and "freezes" the terminal (doesn't accept input, doesn't disconnect, can't Ctrl-C to kill the ssh process or anything).

This is in Ubuntu's gnome-terminal though it seems to be pausing the terminal input/output, and doesn't affect the operation of the GNOME Terminal software itself. So less a bug with gnome-terminal than an annoying inconsistency with ssh.

So, is there a way to prevent/regain the terminal from ssh connections that have timed out?

1

8 Answers 8

271

sshd (the server) closes the connection if it doesn't hear anything from the client for a while. You can tell your client to send a sign-of-life signal to the server once in a while.

The configuration for this is in the file ~/.ssh/config. To send the signal every four minutes to remotehost, put the following in your ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

This is what I have in my ~/.ssh/config.

To enable it for all hosts use:

Host *
  ServerAliveInterval 240

Also make sure to run chmod 600 ~/.ssh/config, because the config file must not be world-readable.

5
  • 1
    Thanks sblair for helping me with the wording, it's much appreciated. I changed "should not" back to "must not" because ssh checks the permissions of the file and if it is world or group readable it fails. Oct 1, 2011 at 20:26
  • 1
    This is not what the OP asked. He's not getting kicked off due to inactivity. He's attempting to connect and his terminal is freezing.
    – Cerin
    Jul 2, 2014 at 16:43
  • Where is this ~/.ssh/config?
    – User
    Sep 26, 2014 at 21:48
  • 1
    @User '~/' represents your home folder. '.ssh' is a folder within your home folder.
    – wkm
    Jan 28, 2015 at 12:44
  • 7
    this is useless if your connection is actually being lost...
    – so12311
    Feb 4, 2015 at 19:25
272

Press Enter, ~, . one after the other to disconnect from a frozen session.

The section "ESCAPE CHARACTERS" in the ssh man page explains the underlying details.

10
  • 43
    This answer appears to me to more accurately answer the question, and in any case, was the answer I was looking for. Dec 2, 2012 at 5:06
  • Note that you need to uncomment the line EscapeChar ~ in /etc/ssh/ssh_config (or ~/.ssh/ssh_config if you prefer).
    – Aditya M P
    Aug 3, 2013 at 6:19
  • 1
    @CoatedMoose The question title asks for ways to avoid ssh connection timeout; this is a way to terminate the connection after it has frozen. It's a very useful trick, but not a more accurate answer to the question.
    – Mark
    Apr 5, 2015 at 12:57
  • 2
    @Mark the question asks "is there a way to prevent regain the terminal from ssh connections that have timed out?" Emphasis mine. Apr 7, 2015 at 18:55
  • 3
    Eventhough it was incorrect in the context of the question, this is exactly what I wanted.
    – C--
    Apr 28, 2016 at 12:37
39

Even tho this is not a direct answer to your question, it is highly related to the problem you have. Instead of trying to keep the connection alive (all connections eventually die) you can use terminal multiplexors, like screen and tmux that keep the session alive in the background even if your terminal gets disconnected.

Essentially when you login in to the SSH server you immediately run screen which will create and attach a new session:

$ screen

Then you go ahead and do your work with the shell as you would normally do. Now if the connection gets dropped, when you can get back online and reconnect to the server over SSH, you get a list the current sessions with:

$ screen -ls

To reattach to a session:

$ screen -r <session>

where <session> is the PID or a session name. You will be reconnected to your session and you can continue from where you left off!

You can even detach the session and reconnect from home to pick up from the exact point where you left off. To detach the session you use C-a followed by C-d (thats Control + A and then Control + D).

There is simple online tutorial as well.

Using screen and tmux on remote servers is considered a best practice and is highly recommended. Some people go as far as to have screen as their default login shell, so when they connect they immediately start a new screen session.

2
  • 2
    another alternative is to use mosh: mosh.mit.edu
    – Zombies
    Dec 25, 2015 at 19:13
  • This is especially useful if you are using a hotspot or wifi that occasionally drops out.
    – Randall
    Jul 13, 2016 at 17:27
13

Try appending -o ServerAliveInterval=30 to your connection string (30 means 30 seconds and can of course be adjusted)

6

You can also set an idle timeout interval from SSH server side:

File: /etc/ssh/ssh_config

Content:

ClientAliveInterval XX
ClientAliveCountMax YY

This works in the exact same way as the client setting, but null packets are sent from from the server, rather than the client.

Extracted from:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

1
  • To configure server settings, you have to modify the /etc/ssh/sshd_config. The ssh_config is for client settings, the sshd_config (SSH Daemon) is the server part. Nov 18, 2020 at 17:05
2

For people who want to prevent the client from timing out in the first place.

You could try to set ConnectTimeout 0 in the configuration file. The value 0 means the connection will be kept alive Indefinitely unless closed.

your config (or ssh_config) file might look like this:

Host *
   ConnectTimeout 0
0

In my case problem was in large MTU size. You can change MTU on router if you using NAT, but I change MTU on server:

sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart

On Windows you can also increase this key:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010
0

Not sure if this works for gnome terminal too but you should be able to use the terminal again after you kill the ssh client process.

pgrep -a ssh

gives you the process ID which you can then kill

kill <pID>

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .