在CYGWIN上,我想要一个BASH脚本:
"关闭部分"让我感到困惑.
目前,我有一个蹩脚的解决方案.在一个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回复中获得了这些信息.
小智 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=$!
kill $PID
编辑:固定$?到$!并添加了&