Abusing screen(1)'s Default Shell

by
Annika Backstrom
in misc, on 25 April 2008. It is tagged #Scripting, #Bash, #screen, #ssh, and #Terminal.

Today I figured out a simple but non-obvious way of automatically connecting to a remote shell when I create new screen windows. I'm using this in conjunction with a development server that does not have screen installed.

Let's start at the beginning. My ~/.ssh/config file has many entries structured like so:

Host bob
    HostName robert.example.com
    User backstrom

This setup allows me to SSH to robert.example.com using the shortcut ssh bob. This shortcut could be made even shorter, though. I have a script (say, host-ssh) in my \$PATH with the following content:

#!/bin/sh
HOST=$(basename $0)
ssh $HOST $@

Now I can ln -s host-ssh bob to symlink host-ssh to bob, and bob becomes a shortcut for ssh bob. At this point, the following commands work as expected:

annika@local:~$ ssh bob
backstrom@robert:~$ exit
annika@local:~$ bob
backstrom@robert:~$ exit
annika@local:~$ scp -q myfile bob:
annika@local:~$

So, onto screen. Imagine that my workstation has screen, but my remote server "bob" does not. I can mimic the functionality by running screen locally and connecting each window to bob in its own SSH session. (In the past I have done this via exec bob so I have one less exit to type during disconnects.) However, screen allows you to set a custom shell. You can leverage this to force an SSH connection to a specific server whenever a new window is created. Just launch screen with screen -s bob and every ^A-c will automatically run your new SSH shortcut. Seamless, if you have public keys set up.

More information is available on my SSH wiki page.