Bash脚本来build立一个临时的SSH隧道

在CYGWIN上,我想要一个BASH脚本来:

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

“关机部分”让我感到困惑。

目前,我有一个蹩脚的解决scheme。 在一个shell中,我运行以下命令创build隧道。

# Create the tunnel - this works! It runs forever, until 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) 

最后,当我完成。 我closures第一个shell窗口来杀死隧道。

我想这样做在一个脚本,如:#创build隧道#做工作#杀死隧道

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

你可以用ssh“控制套接字”干净地做这个。 要和一个已经运行的SSH进程交谈并获得它的pid,请杀死它。使用'control socket'(-M代表master,-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. 

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

我从OpenSSH邮件列表的RTFM回复中得到了这个信息。

  • 你可以通过命令行标志告诉ssh使用&而不是在另一端创build一个shell(只需打开隧道)(我已经看到你已经使用了-N )。
  • PID=$!保存PID
  • 做你的东西
  • kill $PID

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

您可以通过-f选项告诉SSH后台自己,但是您不会使用$!获得PID。 同样,在使用隧道之前,您也可以不使脚本任意睡眠一段时间,而是使用-o ExitOnForwardFailure = yes和-f,并且在将自己置于后台之前,SSH将等待所有远程端口转发成功build立。 你可以grep输出ps来获得PID。 比如你可以使用

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

并相当肯定你正在得到所需的PID

我更喜欢为独立的任务启动一个新的shell,我经常使用下面的命令组合:

  $ sudo bash; exit 

或有时:

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit 

这些命令创build一个嵌套的shell,我可以做所有的工作; 当我完成后,我击中了CTRL-D,父shell清理并退出。 你可以轻松地扔bash; 进入你的SSH隧道脚本就在kill部分之前,以便当你注销嵌套的shell时,你的隧道将被closures:

 #!/bin/bash ssh -nNT ... & PID=$! bash kill $PID 

你可以启动一个&最后的ssh ,把它放在后台,并在做的时候抓住它的ID。 那么当你完成之后,你只需要kill那个ID。

另一个可能的select – 如果你可以安装expect软件包,你应该能够编写整个脚本。 这里有一些很好的例子: http : //en.wikipedia.org/wiki/Expect