用于设置临时 SSH 隧道的 Bash 脚本

标签 bash ssh

在 Cygwin 上,我想要一个 Bash 脚本来:

  1. 创建到远程服务器的 SSH 隧道。
  2. 在本地使用隧道做一些工作。
  3. 然后关闭隧道。

关闭部分让我感到困惑。

目前,我有一个蹩脚的解决方案。在一个 shell 中,我运行以下命令来创建隧道:

# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com

然后,在另一个 shell 窗口中,我开始工作:

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)

最后,当我完成后,我关闭了第一个 shell 窗口以终止隧道。

我想在一个脚本中完成这一切,例如:

# Create tunnel
# Do work
# Kill tunnel

我如何跟踪隧道进程,以便知道要杀死哪个进程?

最佳答案

您可以使用 ssh“控制套接字”干净地完成此操作。与一个已经运行的 SSH 进程对话并获取它的 pid,杀死它等。使用“控制套接字”(-M 代表主控,-S 代表套接字)如下:

$ ssh -M -S my-ctrl-socket -fNT -L 50000:localhost:3306 jm@sampledomain.com
$ ssh -S my-ctrl-socket -O check jm@sampledomain.com
Master running (pid=3517) 
$ ssh -S my-ctrl-socket -O exit jm@sampledomain.com
Exit request sent. 

请注意,my-ctrl-socket 将是创建的实际文件。

我从 a very RTFM reply on the OpenSSH mailing list 得到了这个信息.

关于用于设置临时 SSH 隧道的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241063/

相关文章:

linux - 删除了仍在重定向输出的文件

linux - 以特定方式重新格式化文件内容

bash - 为什么我的菜单第一次选择失败?

python - ssh/登录到网络上的构建服务器并注销

bash - 如何在不复制存储库的情况下自动从github下载文件

regex - 使用 "grep -n"和 echo : : double backslash interpreted

python - 如何检查ssh.exec_command执行成功与否?

python - 使用 Python Paramiko 的嵌套 SSH

VPS 上的 Git 远程存储库接受推送但不创建文件?

bash - ssh bash -c 退出状态不传播