如何关闭这个ssh隧道?

时间:2012-02-25 19:18:01

标签: mysql macos ubuntu ssh

我打开了一个ssh隧道,如本文所述:Zend_Db: How to connect to a MySQL database over SSH tunnel?

但现在我不知道我到底做了什么。此命令是否会影响服务器上的任何内容? 我如何关闭此隧道,因为现在我无法正确使用我的本地mysql。

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

3 个答案:

答案 0 :(得分:205)

假设您运行了此命令:ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N,如您链接的帖子中所述。

命令细分:

  1. ssh:这是不言自明的。调用ssh
  2. -f :(来自man ssh页面)

      

    请求ssh在命令执行之前转到后台。            如果ssh要求输入密码,那么这很有用            密码,但用户想要它在后台。

    基本上,在输入任何密码以建立连接后,将ssh发送到后台;它会在localhost向您提供shell提示,而不是将您登录到remote-host

  3. user@mysql-server.com:您要登录的远程服务器。
  4. -L 3306:mysql-server.com:3306:这是有趣的一点。 -L(来自man ssh页面):

      

    [bind_address:]端口:主机:HOSTPORT            指定本地(客户端)主机上的给定端口            转发到远程端的给定主机和端口。

    因此-L 3306:mysql-server.com:3306本地端口3306绑定到主机3306上的远程端口 mysql-server.com

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

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

  6.   

    此命令是否会影响服务器上的任何内容?

    是的,它在端口 3306 上的 localhost mysql-server.com 之间建立了连接。

      

    我该如何关闭这条隧道...

    如果您使用了-f,则会注意到您打开的ssh进程会进入后台。关闭它的更好方法是运行ps aux | grep 3306,找到pid的{​​{1}}和ssh -f ... -L 3306:mysql-server.com:3306 -N。 (或者可能是kill <pid>;我忘记了kill -9 <pid>是否有效。这具有杀死所有其他kill连接的美妙好处;如果你有一个以上,重新建立它们可能会轻微......痛苦。

      

    ...因为现在我无法正确使用我的本地mysql。

    这是因为您已经有效地“捕获”了本地 ssh进程,并将尝试连接到该进程的所有流量转发到远程 mysql进程。一个更好的解决方案是在端口转发中不使用本地端口3306 。使用未使用的东西,例如33060.(较高的数字通常较少使用;将这样的组合移出前进是非常常见的:“2525-> 25”,“8080-> 80”,“33060-&gt; 3306“或类似。让记忆稍微容易一些)。

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

答案 1 :(得分:37)

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

sudo killall ssh

答案 2 :(得分:17)

注意:添加为答案,因为评论不支持代码块。

在我看来,最好不要使用-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