SSH into tmux


Sometimes an alias on the local machine can save precious tenths of seconds when connecting to a remote machine with tmux.

I sometimes connect to some host in the inside of a lab, passing through an intermediate jumphost.

+--------+   +----------+   +--------+
| laptop |-->| jumphost |-->| target |
+--------+   +----------+   +--------+

Up to some time ago, it meant doing something like this:

foo@laptop$ ssh jumphost
bar@jumphost$ ssh target

This is a lot of typing. Additionally, sometimes the VPN would just go away, disconnecting all precious sessions, so it didn’t take long for me to adopt tmux to work around both problems. Hightly recommended as something to put in your #toolbox. So, the real interaction is actually more like this:

foo@laptop$ ssh jumphost
bar@jumphost$ ssh target
galook@target$ tmux attach -t mysession

I recently became aware of a solution provided by OpenSSH to the double jump problem - see ProxyJump and ProxyCommand for the details. The bottom line is that I can do this:

foo@laptop$ ssh target
galook@target$ tmux attach -t mysession

i.e. connect to the target using a single command from the laptop.

We can compact more

It never occurred to me before that I can also call tmux directly, because you can pass ssh a command to execute. It’s not exactly straightforward though:

foo@laptop$ ssh target tmux attach -t mysession
open terminal failed: not a terminal
foo@laptop$ echo $?

The problem is that, in this case, ssh is not requesting the allocation of a remote terminal, because it thinks that it’s a one-shot command that does not need one. It’s easy to ask for a terminal though, by means of ssh’s option -t:

foo@laptop$ ssh -t target tmux attach -t mysession

At this point, we can compact this into a shell alias:

alias target='ssh -t target tmux attach -t mysession'
# first attempt - we can do better - read on!

What if mysession does not exist?

If mysession does not already exist in target as a tmux session, you’ll get an error:

foo@laptop$ ssh -t target tmux attach -t my-missing-session
can't find session my-missing-session
Connection to target closed.

This hint by Wesley Baugh hits the nail right in the head in this case: just always ask for creation of a session with that name, but use option -A to reuse any existing one with that same name:

foo@laptop$ ssh -t target tmux new -A -s my-missing-session

So, going back to the original example, the right alias would be:

alias target='ssh -t target tmux new -A -s mysession'

And this is it for today, cheers!

Comments? Octodon, Twitter, GitHub, Reddit, or drop me a line!