我按照这篇文章中的描述打开了一个ssh隧道:Zend_Db:如何通过SSH隧道连接到MySQL数据库?
但是现在我不知道我实际上做了什么。此命令会影响服务器上的任何内容吗?以及如何关闭此隧道,因为现在我无法正确使用本地mysql。
我使用OSX Lion,并且服务器在Ubuntu 11.10上运行。
我按照这篇文章中的描述打开了一个ssh隧道:Zend_Db:如何通过SSH隧道连接到MySQL数据库?
但是现在我不知道我实际上做了什么。此命令会影响服务器上的任何内容吗?以及如何关闭此隧道,因为现在我无法正确使用本地mysql。
我使用OSX Lion,并且服务器在Ubuntu 11.10上运行。
Answers:
假设您运行了此命令:ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N
如您所链接的文章中所述。
命令的细分:
ssh
:这很不言自明。调用ssh
。-f
:(从man ssh
页面)
请求ssh在执行命令之前进入后台。如果ssh要求输入密码或密码短语,但用户希望在后台使用它,这将很有用。
本质上,ssh
一旦您输入了用于建立连接的任何密码,便发送到后台。它会在提示您时提示shell,localhost
而不是让您登录remote-host
。
user@mysql-server.com
:您要登录的远程服务器。 -L 3306:mysql-server.com:3306
:这是有趣的一点。-L
(来自man ssh
页面):
[bind_address:] port:host: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
的ssh -f ... -L 3306:mysql-server.com:3306 -N
,和kill <pid>
。(或者也许kill -9 <pid>
;我忘记了是否kill
可行)。这样做的好处是不会杀死其他所有ssh
连接;如果您不止一个,那么重新建立它们可能会有点...痛苦。
...因为现在我无法正确使用本地mysql。
这是因为您已经有效地“捕获”了本地 mysql
进程,并将尝试连接到该本地进程的所有流量转发到了远程 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函数指向localhost
on port 33060
,它将连接到mysql-server.com
on port 3306
。您显然仍然可以连接到localhost
port 3306
,因此仍然可以使用本地mysql
服务器。
-9
不需要kill
,因为该过程仍然可以正常工作;-)
这将杀死您从终端打开的所有ssh会话。
sudo killall ssh
killall ssh
是相当鲁ck的命令。我建议搜索您的进程列表(即ps aux | grep ssh
上面@simont所建议的)以发现ssh隧道进程的特定进程ID。然后,您可以专门杀死pid。
注意:由于注释不支持代码块,因此添加为答案。
在我看来,最好不要使用-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
-f
可以使ssh
会话继续进行,即使关闭终端会话也是如此,这与推送到后台不同。抓住pid
使用ps aux | grep ssh | grep <LOCAL-PORT>
是很琐碎的。
-f
如果需要,使用还具有提示本地用户输入登录密码的优点。如果使用&
,则除非用户将流程置于前台(例如,使用fg
),否则用户不会看到该提示。