如何关闭这个 ssh 隧道? [关闭]

Posted

技术标签:

【中文标题】如何关闭这个 ssh 隧道? [关闭]【英文标题】:How to close this ssh tunnel? [closed] 【发布时间】:2012-03-15 21:01:00 【问题描述】:

我按照这篇文章的描述打开了一个 ssh 隧道:Zend_Db: How to connect to a mysql database over SSH tunnel?

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

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

【问题讨论】:

【参考方案1】:

假设您运行此命令: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页面):

    [绑定地址:]端口:主机:主机端口 指定本地(客户端)主机上的给定端口是 转发到远程端的给定主机和端口。

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

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

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

这个命令会影响服务器上的任何东西吗?

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

我该如何关闭这条隧道...

如果您使用过-f,您会注意到您打开的ssh 进程进入了后台。关闭它的更好方法是运行ps aux | grep 3306,找到ssh -f ... -L 3306:mysql-server.com:3306 -Nkill <pid>pid。 (或者也许kill -9 <pid>;我忘记了kill是否有效)。这具有杀死所有其他ssh 连接的美妙好处;如果您有多个,重新建立它们可能会有点……痛苦。

...因为现在我无法正常使用本地 mysql。

这是因为您已经有效地“捕获”了 local mysql 进程并将任何尝试连接到它的流量转发到 remote @987654354 @ 过程。 更好的解决方案是在端口转发中不使用本地端口 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 函数指向端口 33060 上的 localhost,这将连接到端口 3306 上的 mysql-server.com。您显然仍然可以在端口3306 上连接到localhost,因此您仍然可以使用本地mysql 服务器。

【讨论】:

我读过的最好的解释。这在从本地安装的环境(例如 R)访问远程数据库时非常有用。适用于公钥/私钥身份验证。没有密码,因为我没有找到传递密码的方法。 接受这个答案是最好的,因为解释很透彻。 不错的答案!顺便说一句,kill 不需要-9,考虑到该过程仍在正常工作;-) 有官方方法可以阻止吗?而不是常规的杀戮? 这是@simont 描述的code【参考方案2】:

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

sudo killall ssh

【讨论】:

'没有找到匹配的进程'它说。 好像是这样。 Mysql 也运行良好,但随后 Apache 开始抱怨。我进行了重新启动,一切都按预期工作。我猜问题解决了:) 好吧,如果它是一个 prod 环境,你不想这样做......你会踢出所有其他管理员 运行killall ssh 是一个相当鲁莽的命令。我建议搜索您的进程列表(即上面@simont 建议的ps aux | grep ssh)以发现您的 ssh 隧道进程的特定进程 ID。然后你可以专门杀死那个pid。 很有可能你不希望他们全部被杀。【参考方案3】:

注意:添加为答案,因为 cmets 不支持代码块。

在我看来,最好不要使用-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 会话在终端会话关闭时继续,这与推送到后台不同。使用ps aux | grep ssh | grep &lt;LOCAL-PORT&gt; 获取pid 非常简单。 @simont 使用从后台作业返回的显式 pid 更安全,无论您如何使用它。如果你有多个 ssh 进程在运行你会很糟糕 如果需要,使用-f 还具有提示本地用户输入登录密码的优点。如果您使用&amp;,除非用户将进程置于前台(例如使用fg),否则用户不会看到该提示。 另见Opening and closing an SSH tunnel in a shell script the smart way 您的 第一次出现在进程的 pid 中,该进程还包含文本“ssh”(例如另一个 ssh 或 sshd 进程或编辑文件中包含“ssh”的文件)名称)你会意识到这种方法虽然在简单的场景中很方便,但并不是万无一失的

以上是关于如何关闭这个 ssh 隧道? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在MacOS上创建ssh隧道? [关闭]

Java中的简单SSH隧道[关闭]

如何使用 Python 和 Paramiko 创建 SSH 隧道?

通过 ssh 隧道进行 rsync [关闭]

使用 JSCH Java 反向 SSH 隧道 [关闭]

通过 ssh 隧道的 ftp [关闭]