我对此很迷茫。从手册页:
-f Requests ssh to go to background just before command execution.
使用以下命令启动 SSH 后-f
,我就有了一个工作隧道。但当我用完它之后,我不知道如何进一步与它交互。例如,我无法关闭 SSH 隧道当我完成它时。
我所知道的常用方法不起作用。例如,jobs
不返回任何内容。该~
命令无法识别(而且我也不知道如何使用它)。
但是,pgrep
告诉我 SSH 隧道仍在运行(在我关闭终端等之后)。我如何与它互动?我该如何关闭它?
答案1
一个特别好的脚本解决方案是使用master mode
, 以及用于控制命令的套接字:
ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>
要再次关闭它:
ssh -S <path-to-socket> -O exit <server>
这避免了对进程 ID 的 grep 以及可能与其他方法相关的任何计时问题。
答案2
我在这里找到了解决方案:http://www.g-loaded.eu/2006/11/24/auto-looking-ssh-tunnels/
最好的方法——自动关闭的隧道
正如前面提到的,我们可以单独使用 -f,而不是使用 -f -N 开关组合,但也可以在远程计算机上执行命令。但是,既然我们只需要初始化一个隧道,那么应该执行哪个命令呢?
这时 sleep 就可以成为最有用的命令了!在这种特殊情况下,睡眠有两个优点:
- 它不执行任何操作,因此不会消耗任何资源
- 用户可以指定它将执行多长时间
下面解释了这些如何帮助自动关闭 ssh 隧道。
我们在后台启动 ssh 会话,同时在远程计算机上执行 sleep 命令 10 秒钟。秒数并不重要。同时,我们像以前一样执行vncviewer:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 [email protected] 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 客户端的主要目标不是创建隧道,而是执行 sleep 命令 10 秒。隧道的创建是某种副作用,是次要目标。如果不使用 vncviewer,ssh 客户端将在 10 秒后退出,因为它没有更多工作要做,同时会破坏隧道。
在执行 sleep 命令期间,如果另一个进程(本例中为 vncviewer)开始使用该隧道并保持其占用时间超过 10 秒,那么,即使 ssh 客户端完成其远程作业(执行 sleep),也无法继续使用该隧道。退出,因为另一个进程占用了隧道。换句话说,ssh 客户端无法破坏隧道,因为它还必须终止 vncviewer。当 vncviewer 停止使用隧道时,ssh 客户端也会退出,因为它已经完成了它的目标。
这样,就不会在后台运行任何 ssh 进程。
答案3
要终止隧道,请使用ps -C ssh
或ps | grep ssh
或任何其他变体来确定哪个 ssh 进程正在运行您的隧道。然后杀掉它。
或者,您可以通过确定哪个进程打开此端口来查找进程:
netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'
如果您想终止您的机器上运行的所有 ssh 客户端(作为您的用户),pkill ssh
请这样做。
答案4
当我开始一条隧道时:
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