Como obter o índice de cada painel em uma janela com painéis sincronizados?

Como obter o índice de cada painel em uma janela com painéis sincronizados?

Suponha o seguinte cenário. Tenho máquinas nomeadas host1pelas host4quais desejo me conectar em um painel cada.

Dividi minha janela do Tmux uniformemente em quatro painéis para que cada um deles possa hospedar uma conexão SSH com esses hosts.

Está tudo bem quando já conectado e com os painéis sincronizados. Posso emitir comandos que são executados em todos os hosts simultaneamente.

No entanto, agora eu estava pensando que seria muito bom poder conectar-me a cada host emitindo o comandoexatamente o mesmo comando. Dessa forma, eu poderia ativar a sincronização entre os painéis antes mesmo de conectar-me a esses hosts.

Infelizmente, não consigo encontrar um método que funcione. O que eu tentei foi isso:

ssh root@host$(tmux run "echo '#{pane_index}'")

A ideia aqui é que isso deve ser resolvido ssh root@host1dependendo ssh root@host4do painel em que o comando será executado.

Infelizmente o resultado foi bastante inesperado. Mesmo que o comando tenha sido executado (enquanto o painel 1 estava ativo), todas as conexões foram estabelecidas para host1. É evidente que essa variável pane_indexse refere ao painel atualmente ativo, e não ao painel no qual o comando está sendo emitido.

Como posso conseguir me conectar host1usando host4o índice do painel (ou qualquer outra coisa), emitindo oexatamente o mesmo comandoem cada painel, em vez de digitar comandos individuais?

NB: todos os índices começam em 1, mas é claro que isso poderia funcionar mesmo que não fosse o caso, por exemplo, por meio do $((...))Bash.

Responder1

Existem poucos problemas.

  1. Para $(foo)funcionar foodeverá imprimir as informações desejadas em seu stdout. tmux run …não faz isso; istoexibiçõeso resultado no modo de cópia. Você quer tmux display -p ….

  2. tmux display -p '#{pane_index}'pode fornecer números úteis quando você invoca o comando painel por painel, mas em painéis sincronizados a saída será idêntica. Isso ocorre porque se você não especificar um painel (com -t), o painel atualmente ativo será assumido. Quando você invoca painel por painel, sempre que o painel adequado estiver ativo. Quando você invoca painéis sincronizados, exatamente um painel fica ativo e seu índice será retornado por todos os comandos.

  3. Para identificar de forma confiável o painel em que um comando é executado, use a $TMUX_PANEvariável de ambiente. No seu caso, você não pode fazer isso diretamente.

    # flawed
    ssh root@host"${TMUX_PANE#%}"
    

    O problema $TMUX_PANEcorresponde a #{pane_id}, não a #{pane_index}. Os IDs do painel são exclusivos em todo o servidor tmux. Você obterá %0, %1, %2, %3para os primeiros quatro painéis criados. Os painéis em questão também podem fornecer %7, %8, %13, %14, se outros painéis foram criados anteriormente e nesse meio tempo.

    A maneira correta é usar $TMUX_PANEpara especificar um painel e #{pane_index}recuperar o número desejado.

Solução:

ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"

Gera host0.. host3mas parece que você sabe o que fazer para conseguir host1.. host4. Decidi não ofuscar a solução com $((…)).

Responder2

Você pode usar a variável $TMUX_PANEque o tmux coloca no ambiente do comando de cada painel. Por exemplo, se você der o comando

tmux send-keys  'echo host${TMUX_PANE#%}' Enter

você verá em cada painel host0, ou host1, e assim por diante. Então substitua echo pelo seu comando ssh.

informação relacionada