如何关闭这个 ssh 隧道?

如本文所述,我打开了一个 ssh 隧道: Zend _ Db: 如何通过 SSH 隧道连接到 MySQL 数据库?

But now I don't know what I actually did. Does this command affect anything on the server? 以及如何关闭这个隧道,因为现在我不能正确地使用本地 mysql。

我使用 OSX Lion,服务器运行在 Ubuntu 11.10上。

144538 次浏览

这将终止从终端打开的所有 ssh 会话。

sudo killall ssh

假设您运行这个命令: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N,就像您链接的文章中描述的那样。

命令细目:

  1. ssh: that's pretty self-explanatory. Invokes ssh.
  2. -f: (来自 man ssh页)

    在命令执行之前请求 ssh 转到后台。 如果 ssh 要求输入密码或者 密码短语,但用户希望它在后台。

    实际上,一旦您输入了建立连接的任何密码,就将 ssh发送到后台; 它会在 localhost处将 shell 提示返回给您,而不是将您登录到 remote-host

  3. user@mysql-server.com: 要登录的远程服务器。
  4. -L 3306:mysql-server.com:3306: 这是有趣的部分:

    [ bind _ address: ] port: host: hostport 指定本地(客户端)主机上的给定端口为 转发到给定的主机和远程端口。

    So -L 3306:mysql-server.com:3306 binds the 本地 port 3306 to the remote port 3306 on host mysql-server.com.

    当您连接到 本地端口 3306时,连接将通过安全通道转发到 mysql-server.com。然后,远程主机mysql-server.com在端口 3306上连接到 mysql-server.com

  5. -N: 不要执行命令。这对“只是转发端口”(引用手册页)很有用。

这个命令会影响服务器上的任何东西吗?

是的,它在端口 3306上建立了 本地主机Mysql-server.com之间的连接。

And how do I close this tunnel...

如果您使用了 -f,您将注意到 ssh进程将头部打开到后台。关闭它的更好方法是运行 ps aux | grep 3306,找到 ssh -f ... -L 3306:mysql-server.com:3306 -Npidkill <pid>。(或者可能是 kill -9 <pid>; 我忘了如果只有 kill工作)。这有美丽的好处 没有杀死所有其他 ssh连接,如果你有一个以上,重新建立他们可以是一个轻微的... 痛苦。

因为我现在不能正确使用本地的 mysql。

这是因为您已经有效地“捕获”了 本地 mysql进程,并将任何试图连接到它的流量转发给了 remote mysql进程。一个 好多了解决方案将是在端口向前的 不使用本地端口3306。用不常用的东西,比如33060。(较高的数字通常使用较少; 移植像这样的组合很常见: “2525-> 25”,“8080-> 80”,“33060-> 3306”或类似。让记忆变得稍微容易一些)。

因此,如果您使用 ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -N,那么您可以将 Zend connect-to-mysql 函数指向端口 33060上的 localhost,这将连接到端口 3306上的 mysql-server.com。显然,您仍然可以在端口 3306上连接到 localhost,因此仍然可以使用本地 mysql服务器。

注意: 添加作为回答,因为注释不支持代码块。

在我看来,最好不要使用 -f,而只是背景的过程与 &一样正常。这将给你需要杀死的 一模一样 PID:

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

或者更好的做法是,将其创建为一个包装器脚本:

# 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