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

jm.*_*jm. 124 ssh bash

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

然后,在另一个shell窗口中,我做我的工作

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)
Run Code Online (Sandbox Code Playgroud)

最后,当我完成.我关闭第一个shell窗口来杀死隧道.

我想在一个脚本中完成所有这些:#create tunnel #do work#Kill tunnel

我如何跟踪隧道过程,所以我知道要杀死哪一个?

Chr*_*ick 309

您可以使用ssh'控制套接字'干净利落地完成此操作.交谈已经运行SSH进程,并得到它的PID,杀吧等使用"控制插座"(-M硕士和-S套接字)如下:

$ ssh -M -S my-ctrl-socket -fnNT -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. 
Run Code Online (Sandbox Code Playgroud)

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

我从OpenSSH邮件列表上的RTFM回复中获得了这些信息.

  • 这是迄今为止我在这个主题上看到的最佳答案.非常感谢,它应该是被接受的.我使用它连接到我的Vagrant VM并运行FlywayDB更新脚本. (6认同)
  • 显然,控制插座无处不在.例如,我在drone.io持续集成环境中得到`Operation not allowed`:`muxserver_listen:link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket:不允许操作 (2认同)
  • 如果在脚本中使用它,则需要等待控制套接字几秒钟才能使用.我的解决方案:`while [!-e $ ctrl_socket]; 睡觉0.1; done` (2认同)

小智 20

您可以使用-f选项将SSH告知后台本身,但不会使用$!获取PID.此外,在使用隧道之前,您可以使用-o ExitOnForwardFailure = yes而不是让脚本在任意时间内休眠,并且在将自身置于后台之前,SSH将等待所有远程端口转发成功建立.您可以grep ps的输出来获取PID.例如,您可以使用

...
ssh -Cfo ExitOnForwardFailure=yes -NL 9999:localhost:5900 $REMOTE_HOST
PID=$(pgrep -f 'NL 9999:')
[ "$PID" ] || exit 1
...
Run Code Online (Sandbox Code Playgroud)

并且非常确定你获得了所需的PID


Zei*_*ssS 18

  • 您可以通过命令行标志告诉ssh我们进入后台&并且不在另一侧创建一个shell(只是打开隧道)(我看到你已经这样做了-N).
  • 用PID保存PID PID=$!
  • 做你的东西
  • kill $PID

编辑:固定$?到$!并添加了&

  • $?不,$ !! .. (8认同)
  • 如果我的脚本在它到达KILL之前就死了,我必须小心处理它. (3认同)
  • 为了使其可靠地工作,我必须在创建隧道后稍微"睡觉",但在使用它之前. (3认同)
  • @jm:`trap'will $ PID'1 2 15`将涵盖许多脚本失败案例. (2认同)