Sur Cygwin, je souhaite qu'un script Bash:
- Créez un tunnel SSH vers un serveur distant.
- Effectuez un travail local qui utilise le tunnel.
- Puis fermez le tunnel.
La partie arrêt m'a perplexe.
Actuellement, j'ai une solution boiteuse. Dans un shell, j'exécute ce qui suit pour créer un tunnel:
# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com
Ensuite, dans une autre fenêtre shell, je fais mon travail:
# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)
Enfin, lorsque j'ai terminé, je ferme la première fenêtre shell pour tuer le tunnel.
J'aimerais faire tout cela dans un seul script comme:
# Create tunnel
# Do work
# Kill tunnel
Comment puis-je suivre le processus du tunnel pour savoir lequel tuer?
Réponses:
Vous pouvez le faire proprement avec un «socket de contrôle» ssh. Pour parler à un processus SSH déjà en cours d'exécution et obtenir son pid, tuez-le, etc. Utilisez le 'socket de contrôle' (-M pour le maître et -S pour le socket) comme suit:
Notez que my-ctrl-socket sera un fichier réel qui est créé.
J'ai obtenu cette information d' une réponse très RTFM sur la liste de diffusion OpenSSH .
la source
Operation not permitted
sur l'environnement d'intégration continue drone.io:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
my-ctrl-socket
fichier après son exécution? Lorsque je le faisls -la
dans le dossier actuel, je ne peux plus voir le fichier.while [ ! -e $ctrl_socket ]; do sleep 0.1; done
open failed: administratively prohibited: open failed
et je ne pense pas que cela ouvre le tunnelVous pouvez dire à SSH de se mettre en arrière-plan avec l'option -f mais vous n'obtiendrez pas le PID avec $ !. De plus, au lieu de mettre votre script en veille un laps de temps arbitraire avant d'utiliser le tunnel, vous pouvez utiliser -o ExitOnForwardFailure = yes avec -f et SSH attendra que tous les transferts de ports distants soient établis avec succès avant de se placer en arrière-plan. Vous pouvez grep la sortie de ps pour obtenir le PID. Par exemple, vous pouvez utiliser
et assurez-vous que vous obtenez le PID souhaité
la source
ssh
de passer en arrière-plan avec&
et de ne pas créer un shell de l'autre côté (ouvrez simplement le tunnel) avec un indicateur de ligne de commande (je vois que vous l'avez déjà fait avec-N
).PID=$!
kill $PID
EDIT: fixe $? à $! et ajouté le &
la source
trap 'kill $PID' 1 2 15
couvrira de nombreux cas d'échec de script.trap "kill $PID"
, parce que bash interpolera uniquement les variables à l'intérieur de chaînes entrePID
variable était redéfinie ultérieurement. La variable est soit développée lorsque la fonctiontrap
intégrée est appelée (l'approche de l'OP) ou lorsqu'un signal a été capté (votre approche); les deux approches produisent ici le même résultat.Je préfère lancer un nouveau shell pour des tâches séparées et j'utilise souvent la combinaison de commandes suivante:
ou parfois:
Ces commandes créent un shell imbriqué où je peux faire tout mon travail; lorsque j'ai terminé, j'appuie sur CTRL-D et le shell parent se nettoie et se ferme également. Vous pouvez facilement lancer
bash;
votre script de tunnel ssh juste avant lakill
partie pour que lorsque vous vous déconnectez du shell imbriqué, votre tunnel soit fermé:la source
Vous pouvez lancer le
ssh
avec un&
a la fin, pour le mettre en arrière-plan et saisir son identifiant en le faisant. Ensuite, il vous suffit de faire unkill
de cet identifiant lorsque vous avez terminé.la source
Une autre option potentielle - si vous pouvez installer le package expect, vous devriez être capable de tout script. Quelques bons exemples ici: http://en.wikipedia.org/wiki/Expect
la source