我的设置:本地 Tmux,与不同窗格中的不同服务器有许多连接
我想要做什么:按一个窗格中的快捷方式,打开一个已设置相同连接的新窗格。
为什么:工作流程。很多时候,当我在我的服务器上工作时,我需要打开一个新窗格来做一些事情,而其他事情正在运行。如果我可以打开一个已设置所有内容的新窗格,我将节省大量时间和精力。
我愿意接受其他方式来实现我想做的事情。我可以在远程机器上设置 tmux,但我更喜欢在本地运行 tmux。
编辑:
我遇到了 ssh 多路复用,它解决了我的问题的一部分(每台服务器只需登录一次)。我已将此添加到我的~/.ssh/config
文件中:
### Multiplexing ###
Host *
ControlMaster auto
ControlPath ~/.ssh/sessions/%C
ControlPersist 1h
现在我必须弄清楚如何在 tmux 中设置快捷方式以连接到新窗格中的同一主机。
解决方案
将以下脚本保存
_tmux_duplicate_pane
在您的目录中PATH
:使脚本可执行 (
chmod +x _tmux_duplicate_pane
)。最后将其绑定到tmux
. 例子:该命令旨在在 shell 中调用。在
~/.tmux.conf
(永久设置)中,命令应该是bind-key …
.现在prefixu应该按您的意愿工作。
解释
该脚本通过查找与当前窗格关联的进程的控制终端的前台进程组 ID 来工作
tmux
。它假定前台进程组 ID 的领导者是您要复制的命令。它从中检索信息/proc
并相应地调用tmux split-window
。注意事项和注意事项
不要
_tmux_duplicate_pane
在窗格中作为命令运行。如果你这样做,那么脚本将在一个新的窗格中复制自己,它将成为一个以线性方式产生的分叉炸弹。如图所示绑定到一个键并以这种方式使用它。该脚本假定您要执行的命令是活动窗格中前台进程组的领导者。如果出现以下情况,它将无法按您的预期工作:
该脚本应该成功地复制在当前窗格的交互式现代 shell(如 Bash 或 Zsh)中运行的简单命令。
来自的条目
/proc/$pid/cmdline
不足以复制命令。第 0 个条目是任意的(例如,参见help exec
Bash 中的注释-a
)。另一方面/proc/$pid/exe
,剩下的参数 from/proc/$pid/cmdline
也是不够的,同一个可执行文件可能会有不同的行为,这取决于第 0 个参数。该脚本使用exec -a
Bash 并构建一个保留可执行文件和第 0 个参数的 shell 命令。在某些情况下
/proc/$pid/cmdline
,/proc/$pid/exe
对于我们的目的可能是错误的。示例场景:cmdline
. 原始参数数组可能会丢失。exec
编辑到另一个带有另一个参数数组的可执行文件。您也许可以复制后者,但如果需要前者来为后者进行设置,那么复制的实例可能会失败。在这种情况下不应该发生这种情况
ssh
。该脚本将尝试复制任何命令,而不仅仅是
ssh
. 您可以添加一些逻辑、测试$exe
和/或${args[0]}
,使脚本成为无操作,除非命令是ssh …
.当重复命令退出时,其窗格中将没有 shell。除非该
remain-on-exit
选项位于on
中,否则该窗格将终止tmux
。一个简单的解决方法是在命令之后强制使用交互式 shell 。例如,而不是tmux split-window … "…"
你做tmux split-window … "…; bash"
。在复制命令时,脚本会尝试在原始进程的当前工作目录中执行此操作。在某些情况下,这是错误的,尤其是当进程将相对路径作为参数然后更改其工作目录时。脚本无法知道调用命令时哪个目录是当前目录;它知道现在的当前目录可能相同也可能不同。
该脚本不会尝试复制原始进程的整个环境。如果您
SSH_ASKPASS=… ssh …
在窗格中运行并尝试复制它,那么新ssh
命令将不知道该变量。我猜,解析/proc/$pid/environment
是可能的;脚本没有这样做。该脚本在不同的时刻检索不同的信息。这意味着它容易出现竞争条件。
in 脚本的目的
cd
是让脚本在遇到麻烦时尽早失败。您提供给脚本本身的参数将传递给
tmux split-window
. 这意味着您可以绑定tmux bind-key … '_tmux_duplicate_pane -h'
并享受水平拆分。