Comment gérer les tunnels comme processus d'arrière-plan à partir d'un script shell?

19

J'ai besoin de configurer quelques tunnels ssh à partir d'un script shell. J'ai essayé de les exécuter en tant que tâches bg en utilisant:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

mais les tunnels ne semblent pas fonctionner correctement lorsque je les lance de cette façon.

Ils fonctionnent bien lorsque je les configure manuellement dans leurs propres onglets, donc mon idée suivante est que le script ouvre de nouveaux onglets dans Terminal et y exécute les commandes en tant que processus de premier plan.

Remarque: cette question était à l'origine "Comment puis-je lancer un nouvel onglet de terminal à partir du shell puis y exécuter une commande?", Mais j'ai obtenu deux réponses sur le traitement des tunnels. Pour la question "ouverture d'un shell", j'ai trouvé cela sur SuperUser , qui fonctionnera, bien que de nouveaux onglets en arrière-plan soient préférables aux fenêtres de premier plan qu'il ouvre.

sprugman
la source
Gardez-vous une session SSH active sur le serveur? Autrement dit, avez-vous vos tunnels en arrière-plan et une session SSH au premier plan dans laquelle vous travaillez réellement?
Jack M.
Jusqu'à présent, j'ai gardé trois onglets ouverts: un pour chaque tunnel, plus un autre pour quoi que ce soit. La plupart de mes travaux se déroulent dans Eclipse et dans un navigateur.
sprugman
(Les tunnels sont uniquement pour que je puisse accéder à certains dbs distants à partir de mon instance Tomcat locale.)
sprugman

Réponses:

26

Ce n'est techniquement pas une réponse à la question posée, mais plutôt une réponse à votre problème tel que décrit. La commande ssh possède deux commutateurs qui peuvent vous être utiles:

ssh -f -N -L 3000:server1:5029 me@server2

indique à ssh de rester au premier plan juste assez longtemps pour demander les mots de passe nécessaires, puis de se mettre en arrière-plan, sans exécuter de commande à distance mais simplement gérer le tunnel.

Si vous voulez vraiment que cela apparaisse dans un onglet, vous voudrez peut-être une solution différente.

zzz
la source
J'ai configuré des clés, donc je n'ai pas besoin d'entrer de mots de passe, mais cela semble fonctionner. Merci! Une question: comment puis-je accéder aux tunnels pour voir s'ils ont expiré, ou pour y mettre fin, etc.? Ni jobsni ne leur psdonne une poignée ....
sprugman
2
ps -wwajx | grep ssh devrait vous montrer les processus, alors vous pouvez les tuer comme bon vous semble.
zzz
2
Je voudrais ajouter que si vous omettez -fet mettez en arrière-plan le processus via &à la fin, vous pouvez obtenir le PID via $!comme poignée pour tuer le processus de tunnel plus tard dans votre script.
bk138
6

Je suggérerais simplement d'intégrer vos tunnels dans votre connexion "un pour n'importe quoi". Vous pouvez le rendre facile en ajoutant les entrées appropriées à votre ~/.ssh/configfichier:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Vous pouvez alors simplement vous connecter en exécutant:

> ssh server2

Les tunnels devraient apparaître et commencer à fonctionner, vous laissant une seule instance SSH dans laquelle faire "quoi que ce soit". Si vous avez besoin d'ouvrir une deuxième connexion à server2, vous pouvez obtenir une erreur, cependant:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Cela ne fait rien de mal à vos yeux. Vous pouvez également configurer ces transferts pour plusieurs serveurs en ajoutant des lignes similaires pour d'autres serveurs, et cela se produirait automatiquement.

Jack M.
la source
La réponse de @ zzz semble faire la même chose, plus ou moins, et est un peu plus simple. Merci quand même.
sprugman
Ceci, combiné avec les options -f -N, est un excellent moyen de configurer la redirection pour plusieurs ports en une seule fois. Merci mec.
Narsk