假设您从命令行使用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)
$
$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脚本中.