我想要的是
我正在尝试在多个单独的 ssh 终端中自动连接到远程机器,并为每个远程终端提供独立的 tmux 会话,同时共享相同的窗口(即,可以在不影响其他远程终端的情况下更改会话设置和活动窗口/窗格,同时仍然可以访问相同的 tmux 窗口)。
我想在不改变 tmux 可执行文件最初运行方式的情况下做到这一点,并且完全以每个用户的方式(所有更改仅限于/home/$USER/
)。
我如何努力实现它
Ubuntu 16.04
TMUX 2.1 (from package manager)
ssh
我在本地系统(Windows 10)上使用 MS 的端口(OpenSSH)。
目前,当我打开远程终端(或本地终端)时,tmux 会通过启动~/.zprofile
并创建一个全新的会话。我有一个~/.tmux.conf
包含以下行的文件:
#(this is a single line in my .tmux.conf, I've broken it up here for readability)
if-shell 'tmux has-session -t theonering' \
'new-session -t theonering' \
'rename-session theonering'
我也在destroy-unattached on
第二行中设置了会话级别,但是为了清晰起见,我在这里省略了它。它不会改变结果。
我期望发生什么
据我所知,这意味着“如果在 shell 中 tmux 说它有一个名为 的会话,theonering
则创建一个新的(未命名的)会话并将其与 分组theonering
。如果 tmux 没有名为 的会话,theonering
则将当前会话重命名为theonering
。”
实际情况
现在,如果我远程连接,脱离现有会话,然后运行上述命令(tmux
显然以 为前缀)?效果很好。
但如果我把它放在我的~/.tmux.conf
? bupkiss 中。就好像这条线根本不存在一样。没有错误,没有消息,没有偏离库存行为。
答案1
我找到了一种方法,可以做我想做的事情,但又不是真的,自从我发布这篇文章以来,我一直在使用这种方法。然而,我最近偶然发现了一个似乎完全没有文档记录的功能,它可以让我实现我想要的功能:
function smartgrpsc {
GRPSC_GID=${1:=grpsc}
GRPSC_CID=${GRPSC_GID}-$(date +'%H%M%S')
if ! tmux has-session -t ${GRPSC_GID} &>/dev/null; then
tmux new-session -d -s ${GRPSC_GID}
fi
tmux new-session -d -t ${GRPSC_GID} -s $GRPSC_CID \; set-option destroy-unattached \; attach-session -t $GRPSC_CID
}
if ! [[ -n "${TMUX}" || "${TERM}" =~ "tmux.*" || "${TERM}" =~ "screen.*" ]]; then
# we are (probably) not in a tmux session
smartgrpsc
sleep 5
exit
fi
秘诀是\;
s(转义分号),它会导致将new-session
后面的内容作为 tmux 命令传递给正在创建的 tmux 会话。这解决了我之前面临的先有鸡还是先有蛋的问题。它允许我创建一个会话,更改其设置,然后然后通过从启动会话的同一脚本向新的 tmux 会话发送命令(因此在会话之外运行)来附加到它。这样就不用在会话启动后试图弄清楚我在哪个会话中,而这似乎无法从.tmux.conf
.
.zshrc
通过将以上内容放在我的(或等)的顶部.bashrc
:
- 它会进行多次检查,看看它是否在 tmux 会话内
- 如果不是,则运行该
smartgrpsc
函数- 生成会话组名(上述情况下为默认)
- 根据组名和当前时间生成会话名称(以防止会话 ID 冲突)。
- 检查会话是否以...开头或等于组名存在。(这是对 的会话名称的独特处理
has-session
。属于该组的会话通常以组名开头。同样记录不全。)
- 如果没有,它会创建一个新的命名且分离的 tmux 会话(使用组名)。
- 除此之外什么也没有
- 最后,同时:
- 在同一组中创建另一个新的、分离的会话
- 当没有更多客户端连接时,将该会话设置为自毁
- 附加到新创建的会话。
- 除此之外什么也没有
最终效果正如我在上面的问题中所述。一个独立的、正在运行的“真实”会话,以及与该“真实”会话分组的每个登录的一个新的“查看器”会话,该会话可以看到它所看到的内容……但也可以更改它正在查看的窗口而不影响其他登录。当登录注销时,该“查看器”会话将被清理,而“真实”会话和所有其他“查看器”会话将继续。