如何关闭这个ssh隧道?

Jac*_*cob 86 mysql macos ssh ubuntu

我打开了一个ssh隧道,如本文所述:Zend_Db:如何通过SSH隧道连接到MySQL数据库?

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

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

sim*_*ont 219

假设您运行此命令: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.您显然仍然可以连接到localhost端口3306,因此您仍然可以使用本地mysql服务器.

  • 我读了一段时间的最佳解释.例如,当从本地安装的环境(例如R)访问远程数据库时,这非常有用.适用于公钥/私钥认证.没有密码,因为我没有找到传递密码的方法. (3认同)

the*_*imp 40

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

sudo killall ssh
Run Code Online (Sandbox Code Playgroud)

  • 运行`killall ssh`是一个相当鲁莽的命令.我建议搜索你的进程列表(即上面@simont建议的`ps aux | grep ssh`)来发现你的ssh隧道进程的具体进程id.然后你可以特别杀死pid. (7认同)
  • 好吧,如果它是一个刺激环境,你不想这样做......你会踢出所有其他管理员 (5认同)

aar*_*ron 20

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

在我看来,最好不要使用-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
Run Code Online (Sandbox Code Playgroud)

或者更好的是,只需将其创建为包装脚本:

# 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
Run Code Online (Sandbox Code Playgroud)

backend-tunnel mysql-workbench

backend-tunnel bash

  • 使用`-f`可以使`ssh`会话在终端会话关闭时继续,而不像推送到后台.使用`ps aux |抓住`pid` grep ssh | grep <LOCAL-PORT>`非常简单. (11认同)
  • 第一次<LOCAL-PORT>出现在进程的pid中,该进程还包含文本'ssh'(例如另一个ssh或sshd进程或编辑名称中带有'ssh'的文件),你会意识到这一点方法虽然在简单的场景中很方便,但并不是防弹的 (3认同)