164

I have a ssh connection to a machine which gets disconnected by that machine after 30 minutes of no user input. However, if I start something like top, the connection stays alive. Since this is a client's machine, I can not reconfigure that machine's SSH server. So I am looking for a way to automatically detect idleness and start something like top. Kind of a "screensaver" for Bash.

I know that I can do that with screen, but unfortunately screen is not installed, and I can not install software. So I need to use what Bash offers.

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. Also, I am not looking to tunnel stuff (for that I recommend the great tool sshuttle)

Any ideas?

Isaac
  • 2,064

6 Answers6

197

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"

putty_screenshot

76

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 of ServerAliveCountMax 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 allow ssh to keep trying to reestablish the connection.

See also:

4wk_
  • 205
Murmel
  • 1,325
17

I am using Mobaxterm and have also met with this problem. Mobaxterm also ships with an option to keep the client alive when the client is idle. Go to Settings -> Configuration -> SSH. There is section titled SSH settings, check the option SSH keepalive. Then it the problem should disappear.

enter image description here

jdhao
  • 399
3

I usually do:

while true; do echo -n a; sleep 10; done
1

It is never too late...

But if you only using non GUI than something better than top might be crontab.

Just create a bash script that mkdir and rm that folder each 5 minutes

or

send /dev/null to /dev/null. lol.

Hastur
  • 19,483
  • 9
  • 55
  • 99
-2

How about a watch 'mkdir temp; ls -l temp; rmdir temp?