如何closures这个SSH隧道?

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

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

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

假设您运行以下命令: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N ,如链接的文章中所述。

命令的细分:

  1. ssh :这很好理解。 调用ssh
  2. -f :(从man ssh页面)

    请求ssh在执行命令之前转到后台。 如果ssh要求input密码或密码,但是用户希望在后台使用,这很有用。

    基本上,一旦你input了任何密码来build立连接,发送ssh到后台; 它会在localhost提供shell提示给您,而不是将您login到remote-host

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

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

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

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

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

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

是的,它在端口3306上build立localhostmysql-server.com之间的连接。

而且我怎么closures这个隧道

如果你已经使用了-f ,你会注意到你打开的ssh进程到了后台。 closures它的更好方法是运行ps aux | grep 3306 ps aux | grep 3306 ,findssh -f ... -L 3306:mysql-server.com:3306 -Npid ssh -f ... -L 3306:mysql-server.com:3306 -Nkill <pid> 。 (或者可能kill -9 <pid> ;我忘了是否只是kill作品)。 这有没有杀死所有其他的ssh连接的美丽的好处; 如果你有不止一个,重新build立他们可以是一个轻微的痛苦。

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

这是因为您已经有效地“捕获”了本地 mysql进程,并将任何试图连接到它的stream量转发给远程 mysql进程。 更好的解决scheme是在端口转发中不使用本地端口3306 。 使用一些未使用的东西,比如33060.(数字越大,使用的次数越less;端口转发组合如“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服务器。

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

 sudo killall ssh 

注意:由于注释不支持代码块,因此添加答案。

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

或者更好的是,创build一个包装脚本:

 # 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