A solution to the classic problem: you SSH somewhere, start something, and you
forgot to run it inside screen
or tmux
and need to leave (protip:
reptyr
can save your day in a pinch). This script solves that for you,
re-attaching to your session if you later SSH in from someplace else. To use,
make the top of your .bashrc
look like this:
[ -z "$PS1" ] && return # this still comes first
source path/to/bashrc-tmux
# rest of bashrc below...
Note: Also works with zsh.
bashrc-tmux
won't do anything for local shells. It kicks in when:
- You are logging in via SSH, and
- You have
tmux
installed on the machine.
If both of these things are true, it will create a special tmux session called
ssh-$USER
(where $USER
is your username on the server) and drop you into a
throwaway session linked to ssh-$USER
. This linkage lets you change windows
independently among multiple logins, but all windows themselves are shared.
There are two ways to logout of this configuration. To leave the shell running,
you can use the kill-session
command [sic!]. This kills the throwaway session
and leaves the ssh-$USER
session running in the background. When you want to
get rid of all sessions, you can just ^D
out of all shells in all windows,
which will cause tmux to kill the ssh-$USER
session and any open throwaways,
forcing a logout.
You can also create isolated sessions; see below for details.
Note: this example assumes ^A
is the escape key, not tmux's default of ^B
.
$ ssh foo # creates tmux session ssh-spencertipping on foo
foo$ tmux ls # we are now in tmux
ssh-spencertipping: 1 windows ... (group 0)
ssh-spencertipping-1: 1 windows ... (group 0) (attached)
foo$ du -sh / & # start something that will take a while
foo$ ^Ak # kill the throwaway session to logout
$ ssh foo # ssh-spencertipping already exists, so reuse it
foo$ jobs
[1]+ Running du -sh / &
foo$ fg # reattach to job from last tmux
^C
foo$ ^D # exit shell, killing all tmuxen and logging out
Normally you'll share tabs with existing SSH connections if you log into a server; but you can specify a session suffix if you want to. This will create a new set of shared tabs for anyone logging into that session suffix:
$ ssh -t foo BASHRC_TMUX_SESSION=bar bash
foo$ tmux ls
ssh-spencertipping-bar: 1 windows ... (group 0)
ssh-spencertipping-bar-1: 1 windows ... (group 0) (attached)
xpra
is to X11 what tmux
is to ssh, and you can source bashrc-xpra
to
enable it in similar situations. You can then temporarily attach to the remote
display by saying this:
$ xpra attach ssh:remote-system:100