How to prevent SSH from disconnecting if it's been idle for a while
Solution 1:
To make it clear: I am looking for a solution that I start once after logging in, and then I want to use that terminal, walk away, come back two hours later and continue working, without typing anything before walking away.
The problem is that there is something (usually a firewall or load-balancer), which is dropping idle sessions. If you configure session keepalives, the keepalives will prevent network devices from considering the session as idle.
Linux / Unix / Cygwin OpenSSH fix:
The simplest fix is to enable ssh client keepalives; this example will send an ssh keepalive every 60 seconds:
ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>
If you want to enable this on all your sessions, put this in your /etc/ssh/ssh_config
or ~/.ssh/config
:
ServerAliveInterval 60
For more information, see the ssh_config
manpage
Putty Fix:
Save this to your PuTTY "Default Settings"...
- Click on Connection
- Type 60 into "Seconds between keepalives"
Solution 2:
In addition to Mike Pennington's answer, I would like to make you aware of ServerAliveCountMax
too.
- The
ServerAliveInterval
will send a keepalive every x seconds (default is 0, which disables this feature if not set to something else). - This will be done
ServerAliveCountMax
times if no response is received. The default value ofServerAliveCountMax
is 3 (see manpage ssh_config).
Example: If you set ServerAliveInterval
to 60 and leave ServerAliveCountMax
as it is, this means the keepalive will only wait for 3 * 60 = 180 seconds =
3 minutes before quiting.
To increase this to e.g. 2 hours of trying to keep the connection alive, you can do:
Per command:
Therefore you should consider to set
ssh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 120" <SERVER_ADDRESS>
Persistent:
To make it persistent write it to /etc/ssh/ssh_config
(will apply system-wide) or ~/.ssh/config
(will apply user-only):
ServerAliveInterval 60
ServerAliveCountMax 120
#Note
As dislick correctly pointed out, this might not what you want, depending on your situation:
- If you would like to quickly terminate the session as soon as the server does not respond anymore, you should choose a low value for
ServerAliveCountMax
. - If you are more interested in keeping an already established connection (e.g. you go by train and have a high latency), you should choose a higher value for
ServerAliveCountMax
to allowssh
to keep trying to reestablish the connection.
See also:
- unix.stackexchange.com - What is the default idle timeout for OpenSSH?