Answers:
一个特别好的脚本解决方案是使用master mode
,带有用于控制命令的套接字:
ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>
要再次关闭它:
ssh -S <path-to-socket> -O exit <server>
这样既避免了重复获取进程ID,也避免了可能与其他方法相关联的任何时序问题。
ssh -S <path-to-socket> -O exit <server>
可以是任何字符串,但是必须存在。有点笨拙。
我在这里找到了解决方案:http : //www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
如前所述,除了使用-f -N开关组合之外,我们还可以仅使用-f,还可以在远程计算机上执行命令。但是,由于只需要初始化隧道,应该执行哪个命令?
这是睡眠可以成为所有命令中最有用的命令!在这种特殊情况下,睡眠有两个优点:
下面介绍了这些方法如何自动关闭ssh隧道。
我们在后台启动ssh会话,同时在远程计算机上执行sleep命令10秒钟。秒数不是至关重要的。同时,我们完全像以前一样执行vncviewer:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
在这种情况下,将指示ssh客户端将ssh会话派生到后台(-f),创建隧道(-L 25901:127.0.0.1:5901),并在远程服务器上执行sleep命令10秒钟(sleep) 10)。
该方法与上一个方法(-N开关)之间的区别基本上是,在这种情况下,ssh客户端的主要目标不是创建隧道,而是执行睡眠命令10秒钟。隧道的创建是一种副作用,是次要目标。如果不使用vncviewer,则ssh客户端将在10秒后退出,因为它将没有更多的工作要做,同时破坏了隧道。
在执行sleep命令期间,如果另一个进程(在这种情况下为vncviewer)开始使用该隧道并将其占用的时间超过10秒,那么即使ssh客户端完成了其远程作业(执行睡眠),它也无法退出,因为另一个进程占用了隧道。换句话说,ssh客户端无法销毁隧道,因为它也必须杀死vncviewer。当vncviewer停止使用隧道时,ssh客户端也会退出,因为它已经完成了其目标。
这样,就不会在后台运行任何ssh进程。
vncviewer 127.0.0.1::25091
使用端口语法而不是显示语法进行指定。
要终止隧道,请使用ps -C ssh
或ps | grep ssh
或任何其他变体来确定哪个ssh进程正在运行您的隧道。然后杀死它。
另外,您可以通过确定哪个端口打开了端口来查找该过程:
netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'
如果您想杀死计算机上运行的所有ssh客户端(以您的用户身份),pkill ssh
请执行此操作。
当我使用以下方法启动隧道时:
ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
-f
请求ssh在执行命令之前进入后台。-N
不要执行远程命令。这对于仅转发端口很有用。-D
指定本地“动态”应用程序级端口转发。-l
指定用户以远程计算机上的身份登录。我可以用以下方法关闭它:
ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill
我发现在一个命令行中杀死所有隧道的最佳解决方案是
ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill
对于ssh会话,只需删除隧道选项
ps -lef|grep ssh|awk '{print $4}'|xargs kill
/tmp/session1
(尽管建议使用%模式命名-参见参考中的ControlPath描述man ssh_config
)