share local and remote tmux sessions
There seem to be many related questions but I'd like to see a specific workaround.
So, I used to be an avid iTerm2 user (irrelevant) and I started using tmux remotely because I want to avoid SSH timeouts, i.e. my main concern is that should a nuclear apocalypse destroy my laptop I can pick up on the remote server from where I left off.
Now I use it locally as well. Is there a way to cleanly mix the two things? I only see two options.
- tmux on the local and on the remote machine (this is my current one). The sessions are completely independent, if my local one crashes the remote one will survive, etc.; unfortunately there can be no interaction, so I have to forget about preserving copy-paste history (correct me if I'm wrong) and similar things.
- ssh from the local tmux and attach to a remote tmux. This way I'll have a remote tmux session inside a local tmux window, which seems extremely cumbersome to use on a daily basis.
So mainly the problem is that I want my cake and eat it too. I want to keep my work on the ssh connection (and multi-task within it whilst it's alive), but I also want to share my work between all my tmux panes, disregarding whether they're local or remote. Is it possible?
My advice:
Use
mosh
to connect to the remote server, once the session starts, fire uptmux
mosh was built for the common, but less apocalyptic scenario of remote a session connecting through a cellular data link, before 3G was even a thing.
From the mosh
man page:
mosh (mobile shell) is a remote terminal application that supports intermittent connectivity, allows roaming, and provides speculative local echo and line editing of user keystrokes.
Compared with ssh, mosh is more robust — its connections stay up across sleeps and changes in the client's IP address — and more responsive, because the protocol is tolerant of packet loss and the client can echo most keystrokes immediately, without waiting for a network round-trip.
mosh uses ssh to establish a connection to the remote host and authen‐ ticate with existing means (e.g., public-key authentication or a pass‐ word). mosh executes the unprivileged mosh-server helper program on the server, then closes the SSH connection and starts the mosh-client, which establishes a long-lived datagram connection over UDP.
Back in those days, if you used your laptop to log in to your ssh server, for example in a commuter train, using a CDMA "pc-card" modem on your blindingly fast compaq armada (omg pentium!), or using a serial cable to hook up that palm VII thingy that had some sort of data service; you would have your session disconnected every time you switched from one radio cell to the next, which in a commuter train could be every 3 to 5 minutes.
That would be an equivalent scenario to the old Soviet Union raining down plutonium along the train's track, from the connection's point of view...
so mosh
to the rescue. It uses ssh to authenticate, but the rest of the session is handled by the mosh tunnel, which was specifically designed for session resilience on flaky links.
From a user's perspective, nowdays it's imperceptible. I still use it to ssh, er... mosh from my Android device using termux
even though the links on 4G don't have this issue anymore.
Another frequent use case was ssh connections through flaky modem links over POTS, that would drop the session if your sister decided that she wanted to call her boyfriend and picked up the other FIXED phone in the house, even though you warned her that you'd be downloading U2's new album in MP3 format from a shady WaReZ site.
So if you would like to use this, install mosh using your distro's package manager on both server and client (no root needed on either, it will do a userland install if it can't get root, handy for Android devices) and then do:
terminus:~>> mosh trantor.mydoman.tld tmux
Last login: Wed Apr 4 21:27:38 2018 from XX.XXX.XXX.XXX
trantor:~>>
Enjoy! =)
would sharing windows help?
tmux new-session -s shared "tmux new-window -n CoolName"
tmux link-window -s <src-window> -t <dst-window>
tmux link-window -s shared:CoolName -t $index# (target is optional)