SSH vers le serveur, exécuter la commande et maintenir la connexion

12

Je veux écrire un script qui ouvre un terminal avec différents onglets, me connecter à un serveur en utilisant sshdans chaque onglet et exécuter une commande dans chaque onglet. Par exemple: htop.

Le script ci-dessous ouvre un terminal avec 4 onglets tous connectés sur le serveur. Mais si j'essaye d'ajouter la htopcommande dans la cmd=ligne ça ne marche plus ...

#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

J'ai essayé ça ...

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

... car le ssh --helpdit que la syntaxe de sshest:

utilisation: ssh [utilisateur @] nom d'hôte [commande]

rouge
la source

Réponses:

14

Dans sa forme la plus simple:

ssh -t user@host "command; bash"

-test la partie critique ici. Il oblige l'hôte à allouer un terminal virtuel au processus, ce qui lui permet de rester ouvert.

Si vous souhaitez simplement exécuter htop sur une charge de serveurs, vous pouvez omettre le bashà la fin, mais cela signifie que si vous quittez htop, vous reviendrez sur un terminal local.

Oli
la source
J'ai essayé cmd = "bash -c 'ssh -t user @ host htop'; bash". Cela fonctionne, mais si je quitte htop, je reviens au terminal local et je ne veux pas que cela se produise
Red
1
@Red Vérifiez vos devis - ils sont partout - vous devez regrouper htop et bash afin qu'ils soient tous les deux exécutés sur le serveur distant. bash -c 'ssh -t user@host "htop;bash"'serait mieux, mais je ne vois pas pourquoi vous essayez de faire frire cette chose dans un emballage bash en premier lieu. Ce n'est pas obligatoire - vous n'exécutez qu'une seule commande localement.
Oli
Merci, cela fonctionne maintenant avec cmd = "ssh -t user @ host htop; bash"
Red
Une bonne réponse, mais il doit y avoir quelque chose de mieux à utiliser que bash pour ne pas terminer.
mc0e
@ mc0e Cela dépend de ce que vous voulez faire. Cette question concerne davantage l'obtention d'un shell utile après l'exécution de votre commande. Si vous voulez juste faire une pause, vous pouvez remplacer bashpar read.
Oli