我打开了一个ssh隧道,如本文所述:Zend_Db: How to connect to a MySQL database over SSH tunnel?
但现在我不知道我到底做了什么。此命令是否会影响服务器上的任何内容? 我如何关闭此隧道,因为现在我无法正确使用我的本地mysql。
我使用OSX Lion,服务器在Ubuntu 11.10上运行。
答案 0 :(得分:205)
假设您运行了此命令:ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N
,如您链接的帖子中所述。
命令细分:
ssh
:这是不言自明的。调用ssh
。 -f
:(来自man ssh
页面)
请求ssh在命令执行之前转到后台。 如果ssh要求输入密码,那么这很有用 密码,但用户想要它在后台。
基本上,在输入任何密码以建立连接后,将ssh
发送到后台;它会在localhost
向您提供shell提示,而不是将您登录到remote-host
。
user@mysql-server.com
:您要登录的远程服务器。 -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
。
-N
:不执行命令。这对“只转发端口”非常有用(引用手册页)。
此命令是否会影响服务器上的任何内容?
是的,它在端口 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
,这将连接到33060
在mysql-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