SSH is definitely one of my most often used tools, not only for system
administration at work but also on the road with my netbook, an
EeePC
701 running
Debian Sid.
On the road, it often happens that I have a flaky
WLAN or
UMTS
connection, so I often have to kill (via
<Enter>~.
)
and reconnect my
SSH session due to a changed
IP address or so.
First step against problems arising from using
SSH over unreliable
network connections is of course
GNU Screen. Second step is use
SSH
keys and ssh-agent to not needing to type the password on every
reconnect.
But it s still very annoying to kill the
SSH connection and call ssh
again manually. For luck there is
autossh, a wrapper around
SSH which
regularily checks via two tunnels connect to each other on the remote
side if the connection is still alive, and if not, it kills the ssh
and starts a new one with the same parameters (i.e. tunnels, port
forwardings, commands to call, etc.).
It s quite obvious that this is perfect to be combined with screen s
-R
and
-d
options (Reattach if a detached
screen is around, else start a new screen; detach a currently attached
screen), so I found myself very often typing (or fetching it from the
commandline history :-):
autossh -t sym.noone.org 'screen -Rd'
-t
is necessary to allocate a terminal device on the
remote machine which is not done by default if you directly call a
command via
ssh
.
In comparision to
OpenSSH, autossh needs the single quotes, because
otherwise it would parse
-Rd
as options to parse to
ssh
and bail out. That s not a real problem, but when
you re used to just type
ssh -t sym.noone.org screen -Rd
without any quotes, you ll run into this then and when.
Update, 25-May-2010, 14:55: As Carsten Hey points
out,
autossh
also supports the
--
option to
declare that all following options and parameters must be passed to
ssh
itself. (End of Update)
Typing that often and mistyping it then and when cries for an shell
alias or an shell function. So I came up with the following shell
function:
asc()
autossh -x -a -t "$@" 'screen -RdU'
I used a function instead of an alias in case of
autossh
will in future regard all parameters given after the command as part
of the command as
ssh
does.
The additional options
-x
and
-a
disable X
and
SSH Agent forwarding which both don t work if you reattach to an
already running
screen
.
And if you re using
Zsh as I do, you can even add some more format
string magic to set the window title more or less to the expanded
alias, eh, function:
function asc()
# Set the title to something more obvious, e.g. the expanded
# alias, eh, function
print -Pn "\e]0;%n@%m: autossh -t $* 'screen -RdU'\a";
autossh -x -a -t "$@" 'screen -RdU'
compdef asc=ssh
Update, 25-May-2010, 14:59: As Hauke points out in a
comment, Zsh users should also declare that
asc
should
have the same tab completion as
ssh
itself. The example
above has been updated accordingly. (End of Update)
In the meanwhile on the EeePC I use
asc
on the
commandline more often than
ssh
itself. And I nearly no
more type
autossh
. (The most common exception here is
autossh hostname tail -F /path/to/some/logfile
.)
Using that function you can also add common
ssh
options
for tunneling, etc. I use it most often like this:
asc -D 1080 sym.noone.org
This opens a
SOCKS proxy on localhost, port 1080 and that way I can
surf via the host I m connecting to by
SSH.
There s one small drawback though: You didn t expect that I can just
invent some new three letter command without a namespace clash, did
you? There is a free game called
Advanced Strategic Command whose binary (and
Debian package)
is named
asc
, too. If you have that game installed, you
can always call it using its full path, e.g.
/usr/games/asc
on Debian.
P.S.: My whole
grml based
.zshrc is also
available via git
at
git.noone.org as well as
on github.