用例是使用SSH建立临时端口转发,运行本地命令并在此之后退出,关闭ssh连接。
我再说一遍,该命令必须在本地运行,而不是在删除站点上运行。
例如,您在DMZ中有一台服务器,您需要允许您的计算机上的应用程序连接到本机的端口8080,但您只能访问该计算机的端口。
答案 0 :(得分:3)
假设您从命令行使用OpenSSH ....
SSH可以打开一个维持隧道的连接,并尽可能长时间保持活动状态:
ssh -fNT -Llocalport:remotehost:remoteport targetserver
您可以在运行一段时间的服务器上交替启动SSH。隧道将在那时开放。只要隧道仍在使用中,远程命令退出后,SSH连接应保留。如果你只使用隧道一次,那么指定一个短暂的“睡眠”让隧道在使用后过期。
ssh -f -Llocalport:remotehost:remoteport targetserver sleep 10
如果您希望能够从本地运行的脚本中杀死隧道,那么我建议您在shell中对其进行后台处理,然后记录pid以便稍后执行。假设您正在使用包含Bourne shell的操作系统....
#/bin/sh
ssh -f -Llocalport:remotehost:remoteport targetserver sleep 300 &
sshpid=$!
# Do your stuff within 300 seconds
kill $sshpid
如果使用shell对ssh进行后台处理不符合您的喜好,您还可以使用高级ssh功能来控制后台进程。作为described here,SSH功能ControlMaster
和ControlPath
就是您如何使用它。例如,将以下内容添加到~/.ssh/config
:
host targetserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
现在,您与targetserver
的第一次连接会设置一个控件,以便您可以执行以下操作:
$ ssh -fNT -Llocalport:remoteserver:remoteport targetserver
$ ssh -O check targetserver
Master running (pid=23450)
$ <do your stuff>
$ ssh -O exit targetserver
Exit request sent.
$ ssh -O check targetserver
Control socket connect(/home/sorin/.ssh/cm_socket/sorin@192.0.2.3:22): No such file or directory
显然,这些命令也可以包装到你的shell脚本中。
答案 1 :(得分:2)
您可以使用与此类似的脚本(未经测试):
#!/bin/bash
coproc ssh -L 8080:localhost:8080 user@server
./run-local-command
echo exit >&${COPROC[1]}
wait