假设以下场景。我在一个窗格中命名了每台机器,并希望host1
通过这些机器进行连接。host4
我把 Tmux 窗口均匀地分成四个窗格,以便每个窗格都可以托管到这些主机的 SSH 连接。
连接成功并且窗格同步后,一切正常。我可以发出命令,同时在所有主机上执行。
但是,现在我在想,如果能够通过发出以下命令连接到每个主机,那就太好了完全相同的命令。这样,我甚至可以在连接到这些主机之前启用窗格之间的同步。
唉,我没法想出一个可行的方法。我试过以下方法:
ssh root@host$(tmux run "echo '#{pane_index}'")
这里的想法是,这应该根据运行命令的窗格ssh root@host1
来解决。ssh root@host4
不幸的是,结果出乎意料。尽管命令已执行(当窗格 1 处于活动状态时),但所有连接都已建立host1
。因此显然该变量pane_index
指的是当前活动的窗格,而不是发出命令的窗格。
我如何才能host1
通过host4
利用窗格索引(或其他内容)通过发出完全相同的命令在每个窗格中,而不必键入单独的命令?
注意:所有索引都从 1 开始,但即使情况并非如此,当然也可以使其工作,例如通过$((...))
Bash。
答案1
问题很少。
为了
$(foo)
工作,foo
应该将所需的信息打印到其标准输出。tmux run …
不这样做;它显示器复制模式下的结果。你想要的tmux display -p …
。tmux display -p '#{pane_index}'
当您逐个窗格调用命令时,可以为您提供有用的数字,但在同步窗格中,输出将相同。这是因为如果您不指定窗格(使用-t
),则假定当前活动窗格。当您逐个窗格调用时,每次都会激活适当的窗格。当您在同步窗格中调用时,只有一个窗格处于活动状态,并且所有命令都将返回其索引。要可靠地识别命令运行的窗格,请使用
$TMUX_PANE
环境变量。对于您的情况,您不能直接执行此操作。# flawed ssh root@host"${TMUX_PANE#%}"
问题是
$TMUX_PANE
对应于#{pane_id}
,而不是#{pane_index}
。窗格 ID 在整个 tmux 服务器中都是唯一的。对于创建的前四个窗格,您将获得%0
、%1
、%2
。如果其他窗格是在此之前创建的,则相关窗格也可能为您提供、、、 。%3
%7
%8
%13
%14
正确的方法是使用
$TMUX_PANE
指定窗格并#{pane_index}
检索所需的数字。
解决方案:
ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"
它生成了host0
..host3
但看起来你知道该怎么做才能得到host1
..host4
我决定不用 来混淆解决方案$((…))
。
答案2
$TMUX_PANE
您可以使用tmux 在每个窗格的命令环境中放置的变量。例如,如果您给出命令
tmux send-keys 'echo host${TMUX_PANE#%}' Enter
您将在每个窗格中看到host0
、 或host1
等等。因此,请用您的 ssh 命令替换 echo。