Many of the hosts I wish to use my ssh-and-tmux script to connect to are behind firewalls so I can't connect to them directly. I find that it is more reliable to just ssh through a gateway host rather than using any VPN that might be available. This can easily be bolted on to the ssh-and-tmux script provided a good guess can be made as to which network you're actually on:
#!/bin/sh if [ -n "$TMUX" ]; then echo Already in tmux exit 1 fi if [ -n "$STY" ]; then echo Already in screen exit 1 fi while true; do # First work out where we are based on our IP address. # We do this every time round the loop in case we've # moved network since last time. addrs=`ip --family inet --oneline addr` work_via=gateway.example.com home_via=gateway.randombitsofuselessinformation.blogspot.com case "$addrs" in *192.168.1.*) # We're on the home network home_via= ;; *172.16.*) # We're on the work network work_via= ;; esac extra= via= case "$1" in work-host1) via=$work_via # Add a port forward for this host too extra=-L8080:work-host1:8080 dest=work-host1 ;; home-host1) via=$home_via dest=home-host1 ;; home-host2) via=$home_via dest=home-host2 ;; *.*) # Hosts with dots are assumed to be on the # Internet at large via= dest="$1" ;; *) # All other hosts are assumed to be on the work # network via=$work_via dest="$1" ;; esac if [ -n "$via" ]; then ssh $extra -A -t "$via" \ ssh -t "$dest" "tmux -2 -L netbook attach \ || tmux -2 -L netbook" else ssh $extra -t "$dest" "tmux -2 -L netbook attach \ || tmux -2 -L netbook" fi stty sane echo "Dropped, press Enter to reconnect." if read x; then echo "Reconnecting..." else # Something bad happened to our tty. We'd better exit. exit 1 fi done
So now I can connect to work-host1 from home via the gateway, shut the laptop, travel to work, open it again, hit Enter and reconnect directly to work-host1 without losing any state. What's not to like? Well, there's still some more things we can do.