如何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
,如链接的文章中所述。
命令的细分:
-
ssh
:这很好理解。 调用ssh
。 -
-f
:(从man ssh
页面)请求ssh在执行命令之前转到后台。 如果ssh要求input密码或密码,但是用户希望在后台使用,这很有用。
基本上,一旦你input了任何密码来build立连接,发送
ssh
到后台; 它会在localhost
提供shell提示给您,而不是将您login到remote-host
。 -
user@mysql-server.com
:您想要login的远程服务器。 -
-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
。 -
-N
:不要执行命令。 这对于“只是转发端口”(引用手册页)很有用。
此命令是否影响服务器上的任何内容?
是的,它在端口3306上build立localhost和mysql-server.com之间的连接。
而且我怎么closures这个隧道
如果你已经使用了-f
,你会注意到你打开的ssh
进程到了后台。 closures它的更好方法是运行ps aux | grep 3306
ps aux | grep 3306
,findssh -f ... -L 3306:mysql-server.com:3306 -N
的pid
ssh -f ... -L 3306:mysql-server.com:3306 -N
, kill <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