SSH al servidor, ejecutar comando y mantener conexión

12

Quiero escribir un script que abra una terminal con diferentes pestañas, iniciar sesión en un servidor usando sshen cada pestaña y ejecutar un comando en cada pestaña. Por ejemplo: htop.

El siguiente script abre un terminal con 4 pestañas todas iniciadas en el servidor. Pero si trato de agregar el htopcomando en la cmd=línea, ya no funciona ...

#bin/bash

tab="--tab"
cmd="bash -c 'ssh user@host';bash"
foo=""

for i in 1 2 3 4; do
      foo+=($tab -e "$cmd")         
done

gnome-terminal "${foo[@]}"

exit 0

He intentado esto ...

cmd="bash -c 'ssh user@host htop';bash"

... porque ssh --helpdice que la sintaxis para sshes:

uso: ssh [usuario @] nombre de host [comando]

rojo
fuente

Respuestas:

14

En su forma más simple:

ssh -t user@host "command; bash"

-tEs la parte crítica aquí. Obliga al host a asignar un terminal virtual al proceso, lo que le permite permanecer abierto.

Si solo desea ejecutar htop en una carga de servidores, puede omitir el bashal final, pero eso significa que si abandona htop, volverá a una terminal local.

Oli
fuente
Intenté cmd = "bash -c 'ssh -t usuario @ host htop'; bash". Funciona, pero si dejo de hacerlo, vuelvo a la terminal local y no quiero que esto suceda
Rojo
1
@Red Comprueba tus presupuestos, están por todas partes, debes agrupar htop y bash para que ambos se ejecuten en el servidor remoto. bash -c 'ssh -t user@host "htop;bash"'sería mejor, pero no veo por qué estás tratando de freír esto en una envoltura de bash en primer lugar. No es obligatorio: solo está ejecutando un comando localmente.
Oli
Gracias, ahora funciona con cmd = "ssh -t user @ host htop; bash"
Rojo
Una buena respuesta, pero debe haber algo mejor para usar que bash para no terminar.
mc0e
@ mc0e Depende de lo que quieras hacer. Esta pregunta es más acerca de obtener un shell útil después de ejecutar su comando. Si lo que desea es hacer una pausa, se puede sustituir bashpor read.
Oli