Auto-reconnecting SSH connections with a specific 'screen' session

I typically have several terminal windows each of which is connected via ssh to a remote server. In each window I work using the gnu screen program, to ensure persistence of the interactive processes in case of a disconnection.

Currently, whenever the ssh connection drops (such as when I put my client computer to sleep overnight) I have to manually and tediously restart the ssh session inside each window, and then in each window tediously resume the specific screen session (e.g. "screen -r 3453" in one window, "screen -r 3462" in the other etc.)

Is there an elegant way to automate this? Specifically:

  • reconnect the ssh session if it drops, as soon as an Internet connection is detected

  • run the specific screen instance for the terminal window as soon as ssh reconnects

Thanks for any tips on this


You can run this: ssh -t hostname screen -r 3453 to reconnect. If you want to do it in a loop I use the following in a script.

while true; do
    ssh -t -o BatchMode=yes eeepc-rsi "screen -r 3453"
    sleep 2
done

This works best if you have ssh-keys setup so you can login without typing in your password. I'd also recommend that you look at tmux, a more modern implementation of screen. I actually use the above script with screen. You probably also want to use a named screen session rather than just using the pid like you do in your example.


No need to hack bash loops. You need to look into autossh. I haven't used it much myself, but my understanding is that you simply replace ssh with autossh in your command.

Edit: In fact, autossh comes with a script called rscreen which appears to be designed for exactly this purpose.