Comment fermer ce tunnel SSH? [fermé]

96

J'ai ouvert un tunnel ssh comme décrit dans ce post: Zend_Db: Comment se connecter à une base de données MySQL via un tunnel SSH?

Mais maintenant, je ne sais pas ce que j'ai réellement fait. Cette commande affecte-t-elle quelque chose sur le serveur? Et comment puis-je fermer ce tunnel, car maintenant je ne peux pas utiliser correctement mon mysql local.

J'utilise OSX Lion et le serveur fonctionne sous Ubuntu 11.10.

Jacob
la source

Réponses:

241

En supposant que vous ayez exécuté cette commande: ssh -f [email protected] -L 3306:mysql-server.com:3306 -Ncomme décrit dans le message que vous avez lié.

Une panne de la commande:

  1. ssh: c'est assez explicite. Invoque ssh.
  2. -f: (À partir de la man sshpage)

    Demande à ssh de passer en arrière-plan juste avant l'exécution de la commande. Ceci est utile si ssh va demander des mots de passe ou des phrases de passe, mais que l'utilisateur le souhaite en arrière-plan.

    Essentiellement, envoyez sshen arrière-plan une fois que vous avez entré un mot de passe pour établir la connexion; il vous renvoie l'invite du shell au localhostlieu de vous connecter à remote-host.

  3. [email protected]: le serveur distant auquel vous souhaitez vous connecter.
  4. -L 3306:mysql-server.com:3306: C'est le peu intéressant. -L(à partir de la man sshpage):

    [bind_address:] port: host: hostport Spécifie que le port donné sur l'hôte local (client) doit être transféré vers l'hôte et le port donnés du côté distant.

    Ainsi , -L 3306:mysql-server.com:3306lie le locale le port 3306au port distant 3306 sur l' hôte mysql-server.com.

    Lorsque vous vous connectez au port local3306 , la connexion est transférée via le canal sécurisé vers mysql-server.com. L' hôte distant , mysql-server.compuis se connecte au mysql-server.comport 3306.

  5. -N: n'exécute pas de commande. Ceci est utile pour "simplement transmettre les ports" (en citant la page de manuel).

Cette commande affecte-t-elle quelque chose sur le serveur?

Oui, il établit une connexion entre localhost et mysql-server.com sur le port 3306 .

Et comment fermer ce tunnel ...

Si vous avez utilisé -f, vous remarquerez que le sshprocessus que vous avez ouvert se retrouve en arrière-plan. La meilleure méthode pour le fermer consiste à exécuter ps aux | grep 3306, trouver le fichier pidde ssh -f ... -L 3306:mysql-server.com:3306 -N, et kill <pid>. (Ou peut-être kill -9 <pid>; j'oublie si ça killmarche). Cela a le bel avantage de ne pas tuer toutes vos autres sshconnexions; si vous en avez plus d'un, les rétablir peut être une légère ... douleur.

... parce que maintenant je ne peux pas utiliser correctement mon mysql local.

C'est parce que vous avez effectivement «capturé» le processus local mysql et transféré tout trafic qui tente de s'y connecter, vers le processus distant mysql . Une solution bien plus intéressante serait de ne pas utiliser le port local 3306 dans le transfert de port. Utilisez quelque chose qui n'est pas utilisé, comme 33060. (Les nombres plus élevés sont généralement moins utilisés; il est assez courant de transférer une combinaison comme celle-ci: "2525-> 25", "8080-> 80", "33060-> 3306" ou similaire. Facilite légèrement la mémorisation).

Donc, si vous utilisiez ssh -f [email protected] -L 33060:mysql-server.com:3306 -N, vous pointeriez alors votre fonction Zend connect-to-mysql sur localhostle port 33060, qui se connecterait sur mysql-server.comle port 3306. Vous pouvez évidemment toujours vous connecter sur localhostle port 3306, vous pouvez donc toujours utiliser le mysqlserveur local .

Simont
la source
5
Meilleure explication que j'ai lue depuis un moment. Ceci est très utile pour accéder à une base de données distante à partir d'environnements installés localement comme R par exemple. Fonctionne bien avec l'authentification par clé publique / privée. Pas avec les mots de passe car je n'ai pas trouvé de moyen de passer les mots de passe.
Matt Bannert
Accepter cette réponse comme étant la meilleure en raison de l'explication approfondie.
Jacob
Bonne réponse! En passant, -9n'est pas nécessaire pour kill, étant donné que le processus fonctionne toujours bien ;-)
Lucio Paiva
46

Cela tuera toutes les sessions ssh que vous avez ouvertes depuis le terminal.

sudo killall ssh
alorsetimp
la source
«Aucun processus correspondant n'a été trouvé», dit-il.
Jacob
Il semble que ce soit le cas. Mysql fonctionnait bien aussi, mais Apache a commencé à se plaindre. J'ai fait un redémarrage et tout fonctionne comme prévu. Problème résolu je suppose :)
Jacob
5
Eh bien, vous ne voulez pas faire cela s'il s'agit d'un environnement de production ... vous
expulserez
12
La course killall sshest une commande plutôt imprudente. Je vous conseille de rechercher votre liste de processus (c'est- ps aux | grep sshà- dire comme suggéré par @simont ci-dessus) pour découvrir l'ID de processus spécifique de votre processus de tunnel ssh. Ensuite, vous pouvez tuer Pid spécifiquement.
Ben
Il y a de fortes chances que vous ne vouliez pas tous les tuer.
wobbily_col
22

Remarque: l'ajout comme réponse car les commentaires ne prennent pas en charge les blocs de code.

À mon avis, il est préférable de NE PAS utiliser -fet de simplement définir le processus comme normal avec &. Cela vous donnera le pid exact dont vous avez besoin pour tuer:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

Ou mieux encore, créez simplement ceci comme un script wrapper:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash

Aaron
la source
12
L'utilisation -fpermet à la sshsession de se poursuivre même lorsque la session du terminal est fermée, contrairement à la mise en arrière-plan. Saisir l' pidutilisation ps aux | grep ssh | grep <LOCAL-PORT>est assez trivial.
simont
1
@simont en utilisant le pid explicite renvoyé par le travail d'arrière-plan est plus sûr, quelle que soit la façon dont vous l'arrière-plan. si vous avez plus d'un processus ssh en cours d'exécution, vous allez passer un mauvais moment
aaron
L'utilisation a -fégalement l'avantage d'inviter l'utilisateur local à entrer le mot de passe de connexion, si nécessaire. Si vous utilisez &, cette invite n'est pas vue par l'utilisateur à moins qu'il ne place le processus au premier plan (par exemple en utilisant fg).
Bdoserror
3
la première fois que votre <LOCAL-PORT> apparaît dans le pid d'un processus qui contient également le texte 'ssh' (comme un autre processus ssh ou sshd ou éditer un fichier avec 'ssh' dans le nom), vous vous rendrez compte que cela approche, bien que pratique dans des scénarios simples, n'est pas à l'épreuve des balles
aaron