Предположим следующий сценарий. У меня есть машины, названные 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}
. Идентификаторы панелей уникальны на всем сервере 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
, и т. д. Поэтому замените echo на вашу команду ssh.