Last Updated: November 14, 2018
·
15.55K
· jinnko

smux: SSH with auto reconnect & tmux, a mosh replacement

Mosh was a great idea, but the lack of IPv6 is enough of a nuisance that I've come up with a suitable alternative that's working great for me now.

This approach uses autossh + tmux. The benefits are:

  • IPv6 support
  • Uses ssh_config, therefore you can use ProxyCommand transparently
  • Auto launches a tmux session, or reconnects to a running one
  • Reconnects to the host if you lose your connection

The only real feature mosh adds that is not addressed here is the low-latency feedback.

Getting this going on OSX:

  • Install autossh. I use MacPorts: sudo port install autossh
  • Create the new smux script

    #!/bin/sh
    if [ "X$1" = "X" ]; then
        echo "usage: `basename $0` <host>"
        exit 1
    fi
    
    if [ "X$SSH_AUTH_SOCK" = "X" ]; then
            eval `ssh-agent -s`
            ssh-add $HOME/.ssh/id_rsa
    fi
    
    AUTOSSH_POLL=20
    AUTOSSH_PORT=$(awk 'BEGIN { srand(); do r = rand()*32000; while ( r < 20000 ); printf("%d\n",r)  }' < /dev/null)
    #AUTOSSH_GATETIME=30
    #AUTOSSH_LOGFILE=$HOST.log
    #AUTOSSH_DEBUG=yes
    #AUTOSSH_PATH=/usr/local/bin/ssh
    export AUTOSSH_POLL AUTOSSH_LOGFILE AUTOSSH_DEBUG AUTOSSH_PATH AUTOSSH_GATETIME AUTOSSH_PORT
    
    # -t is the ssh option to force a pseudo terminal (pty)
    autossh -t $@ "tmux attach-session"
  • Make the new smux script executable:

    chmod 755 /path/to/smux

- On the server make sure you have the following line in your /etc/tmux.conf. This will ensure tmux will start a new session if one doesn't already exist.

new-session -s main
  • Connect to your server with

    smux your.serv.er
  • Test the auto reconnect by disabling your network then re-enabling it, or switching from wire to wifi, etc.

9 Responses
Add your response

You don't need autossh monitoring if you use ServerAliveInterval and ServerAliveCountMax in your ssh config.

I've documented the something similar https://coderwall.com/p/f528fw, details on my site: http://pempek.net/articles/2013/04/24/vpn-less-persistent-ssh-sessions/

over 1 year ago ·

@gpakosz. Thanks for that. I do use those settings and it works well in suspend scenarios, but if there's a network issue without the suspend the ServerAliveCountMax may be triggered and the connection drops. This is where autossh comes in useful.

over 1 year ago ·

It's not about getting rid of autossh. It's about not requiring opening monitoring ports

over 1 year ago ·

Look who it is! Hi Jinn.

over 1 year ago ·

This is great! I replaced "tmux attach-session" on the last line of the smux script with "tmux attach || tmux new" so that I don't have to modify the .tmux.conf on every server I connect to. Awesome-sauce! ;]

over 1 year ago ·

@gpakosz Personally rather than testing with a tmux attach || tmux new I prefer to use the -A option to tmux new-session to attach if a session exists or create one otherwise through tmux itself. This also lets me tweak the session name to include the host it was started from in case I had a lot of different places I was coming from (though you don't want to include the FQDN in case somebody tries to jump back through using your agent session).

over 1 year ago ·

@dragon788 I believe my alias predates the -A option to tmux new-session. Thanks for the tip!

over 1 year ago ·

Hey Jinn,

Just to know, do you think this script is deprecated because Mosh supports IPv6 now? I'm doing a comparison between autossh+Tmux and Mosh+Tmux.

Cheers!

over 1 year ago ·

Unfortunately, this doesn't work with tmux -CC
Do u have an idea maybe?

over 1 year ago ·