web-dev-qa-db-fra.com

Comment fermer ce tunnel ssh?

J'ai ouvert un tunnel ssh comme décrit dans cet article: 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 quoi que ce soit sur le serveur? Et comment puis-je fermer ce tunnel, car je ne peux plus utiliser correctement mon mysql local.

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

80
Jacob

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

Une ventilation de la commande:

  1. ssh: c'est assez explicite. Invoque ssh.
  2. -f: (Du man ssh page)

    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 secrètes, mais que l'utilisateur le souhaite en arrière-plan.

    Envoyez essentiellement ssh à l’arrière-plan une fois que vous avez entré un mot de passe pour établir la connexion; il vous renvoie l'invite du shell à localhost plutôt que 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 la partie intéressante. -L (du man ssh page):

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

    Alors -L 3306:mysql-server.com:3306 lie le port local 3306 vers le port distant 3306 sur l'hôte mysql-server.com.

    Lorsque vous vous connectez au port local 3306, la connexion est transférée sur le canal sécurisé à mysql-server.com. L'hôte distant , mysql-server.com se connecte ensuite à mysql-server.com sur le port 3306.

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

Cette commande affecte-t-elle quoi que ce soit sur le serveur?

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

Et comment puis-je fermer ce tunnel ...

Si vous avez utilisé -f, vous remarquerez que le processus ssh que vous avez ouvert se situe en arrière-plan. La meilleure méthode pour le fermer consiste à exécuter ps aux | grep 3306, trouvez le pid du ssh -f ... -L 3306:mysql-server.com:3306 -N, et kill <pid>. (Ou peut-être kill -9 <pid>; J'oublie que si kill fonctionne). Cela a le bel avantage de pas de tuer tous vos autres ssh connexions; Si vous en avez plusieurs, les rétablir peut être un peu ... douloureux.

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

En effet, vous avez effectivement "capturé" le processus local mysql et transféré tout trafic qui tente de s'y connecter, le processus distant mysql. Une solution beaucoup plus agréable consisterait à ne pas utiliser le port local 3306 dans le transfert de port. Utilisez quelque chose qui n'est pas utilisé, tel que 33060. (Les nombres élevés sont généralement moins utilisés; il est assez courant de transférer un port comme suit: "2525-> 25", "8080-> 80", "33060-> 3306" ou similaire, facilite la mémorisation).

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

214
simont

Cela va tuer toutes les sessions SSH que vous avez ouvertes à partir du terminal.

Sudo killall ssh
39
thenetimp

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

À mon avis, il vaut mieux ne pas utiliser -f et plutôt que d’arrière-plan le processus comme d'habitude avec &. Cela vous donnera le exact pid que vous devez 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 ceci en tant que 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

18
aaron