如何关闭此ssh隧道?[关闭]


94

我按照这篇文章中的描述打开了一个ssh隧道:Zend_Db:如何通过SSH隧道连接到MySQL数据库?

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

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

Answers:


239

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

命令的细分:

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

    请求ssh在执行命令之前进入后台。如果ssh要求输入密码或密码短语,但用户希望在后台使用它,这将很有用。

    本质上,ssh一旦您输入了用于建立连接的任何密码,便发送到后台。它会在提示您时提示shell,localhost而不是让您登录remote-host

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

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

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

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

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

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

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

以及如何关闭该隧道...

如果您使用过-f,则会注意到ssh打开的过程进入了后台。关闭它是运行的更好的方法ps aux | grep 3306,找到pidssh -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函数指向localhoston port 33060,它将连接到mysql-server.comon port 3306。您显然仍然可以连接到localhostport 3306,因此仍然可以使用本地mysql服务器。


4
我读过一段时间的最佳解释。从本地安装的环境(例如R)访问远程数据库时,这非常有用。与公钥/私钥身份验证配合使用。不使用密码,因为我没有找到传递密码的方法。
马特·班纳特

由于有详尽的解释,因此最好接受此答案。
2013年

好答案!顺便说一句,-9不需要kill,因为该过程仍然可以正常工作;-)
Lucio Paiva

46

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

sudo killall ssh

它说,“没有找到匹配的过程”。
Jacob

好像是。Mysql也运行良好,但是随后Apache开始抱怨。我重新启动,一切正常。问题已解决,我猜:)
雅各布(Jacob)

5
好吧,如果它是一个产品环境,您就不希望这样做……您将踢出所有其他管理员
texasbruce 2015年

12
运行killall ssh是相当鲁ck的命令。我建议搜索您的进程列表(即ps aux | grep ssh上面@simont所建议的)以发现ssh隧道进程的特定进程ID。然后,您可以专门杀死pid。
2016年

您很有可能不想杀死所有人。
wobbily_col

21

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

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


12
使用-f可以使ssh会话继续进行,即使关闭终端会话也是如此,这与推送到后台不同。抓住pid使用ps aux | grep ssh | grep <LOCAL-PORT>是很琐碎的。
simont 2013年

1
@simont使用从后台作业返回的显式pid更加安全,无论您如何后台使用它。如果您有多个ssh进程正在运行,那将是一段糟糕的时光
亚伦2015年

-f如果需要,使用还具有提示本地用户输入登录密码的优点。如果使用&,则除非用户将流程置于前台(例如,使用fg),否则用户不会看到该提示。
Bdoserror 2015年


3
第一次<LOCAL-PORT>出现在同时包含文本“ ssh”的进程的pid中(例如另一个ssh或sshd进程或编辑名称中带有“ ssh”的文件),您将意识到这种方法虽然在简单的场景中很方便,但并不是防弹的方法
aaron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.