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.
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:
ssh
: c'est assez explicite. Invoque ssh
.-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
.
[email protected]
: le serveur distant auquel vous souhaitez vous connecter.-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
.
-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.
Cela va tuer toutes les sessions SSH que vous avez ouvertes à partir du terminal.
Sudo killall ssh
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