【问题标题】:How to close this ssh tunnel? [closed]如何关闭这个 ssh 隧道? [关闭]
【发布时间】: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 上运行。

【问题讨论】:

    标签: mysql macos ubuntu ssh


    【解决方案1】:

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

    命令分解:

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

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

      基本上,一旦您输入任何密码以建立连接,就将ssh 发送到后台;它通过localhost 将shell 提示返回给您,而不是让您登录到remote-host

    3. user@mysql-server.com:你想登录的远程服务器。
    4. -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

    5. -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),否则用户不会看到该提示。
    • 您的 第一次出现在进程的 pid 中,该进程还包含文本“ssh”(例如另一个 ssh 或 sshd 进程或编辑文件中包含“ssh”的文件)名称)你会意识到这种方法虽然在简单的场景中很方便,但并不是万无一失的
    猜你喜欢
    • 2017-12-07
    • 2015-09-30
    • 2011-05-23
    • 2011-12-06
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2010-12-13
    相关资源
    最近更新 更多