Supongamos el siguiente escenario. Tengo máquinas con nombres host1
a host4
las que quiero conectarme en un panel cada una.
He dividido mi ventana de Tmux de manera uniforme en cuatro paneles para que cada uno de ellos pueda albergar una conexión SSH a esos hosts.
Todo está bien cuando ya está conectado y con los paneles sincronizados. Puedo emitir comandos que se ejecutan en todos los hosts simultáneamente.
Sin embargo, ahora estaba pensando que sería bastante bueno poder conectarme a cada host emitiendo elexactamente el mismo comando. De esta manera podría habilitar la sincronización entre paneles incluso antes de conectarme a esos hosts.
Lamentablemente, no puedo encontrar un método que funcione. Lo que probé fue esto:
ssh root@host$(tmux run "echo '#{pane_index}'")
La idea aquí es que esto debería resolverse ssh root@host1
dependiendo ssh root@host4
del panel en el que se ejecute el comando.
Desafortunadamente el resultado fue bastante inesperado. Aunque el comando se ejecutó (mientras el panel 1 estaba activo), todas las conexiones se establecieron en host1
. Evidentemente, esa variable pane_index
se refiere al panel actualmente activo en lugar del panel en el que se emite el comando.
¿Cómo puedo lograr conectarme host1
mediante host4
el uso del índice del panel (u otra cosa) emitiendo elexactamente el mismo comandoen cada panel, en lugar de tener que escribir comandos individuales?
NB: todos los índices comienzan en 1, pero, por supuesto, esto podría funcionar incluso si ese no fuera el caso, por ejemplo, mediante $((...))
Bash.
Respuesta1
Hay pocos problemas.
Para
$(foo)
que funcionefoo
debe imprimir la información deseada en su salida estándar.tmux run …
no hace esto; élmuestrael resultado en modo copia. Quierestmux display -p …
.tmux display -p '#{pane_index}'
puede brindarle números útiles cuando invoca el comando panel por panel, pero en los paneles sincronizados la salida será idéntica. Esto se debe a que si no especifica un panel (con-t
), se asume el panel actualmente activo. Cuando invoca panel por panel, cada vez que el panel adecuado está activo. Cuando invoca paneles sincronizados, exactamente un panel está activo y todos los comandos devolverán su índice.Para identificar de manera confiable el panel en el que se ejecuta un comando, use la
$TMUX_PANE
variable de entorno. En su caso no puede hacer esto directamente.# flawed ssh root@host"${TMUX_PANE#%}"
El problema es
$TMUX_PANE
corresponde a#{pane_id}
, no a#{pane_index}
. Los ID del panel son únicos en todo el servidor tmux. Obtendrá%0
,%1
,%2
,%3
para los primeros cuatro paneles creados. Los paneles en cuestión también pueden mostrarle%7
,%8
,%13
,%14
, si se crearon otros paneles antes y mientras tanto.La forma correcta es utilizar
$TMUX_PANE
para especificar un panel y#{pane_index}
recuperar el número deseado.
Solución:
ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"
Genera host0
... host3
pero parece que sabes qué hacer para conseguir host1
... host4
Decidí no ofuscar la solución con $((…))
.
Respuesta2
Puede usar la variable $TMUX_PANE
que tmux coloca en el entorno del comando de cada panel. Por ejemplo si das el comando
tmux send-keys 'echo host${TMUX_PANE#%}' Enter
verá en cada panel host0
, o host1
, y así sucesivamente. Entonces reemplaza echo por tu comando ssh.