如何終止使用 -f 選項啟動的 SSH 會話(在後台執行)
我對此很迷茫。從手冊頁:
-f Requests ssh to go to background just before command execution.
使用該選項啟動 SSH 後
-f
,我有一個工作隧道。但是在我用完它之後,我不知道如何與它進一步互動。例如,當我完成它時,我無法關閉 SSH 隧道。我知道的常用方法不起作用。例如,
jobs
不返回任何內容。該~
命令無法辨識(無論如何我也不知道如何使用它)。但是,
pgrep
告訴我 SSH 隧道仍在執行(在我關閉終端等之後)。我如何與之互動?我該如何關閉它?
我在這裡找到了解決方案:http ://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
最好的方法——自動關閉的隧道
如前所述,我們可以單獨使用-f,而不是使用-f -N 開關組合,還可以在遠端機器上執行命令。但是,應該執行哪個命令,因為我們只需要初始化一個隧道?
這時候 sleep 可能是最有用的命令了!在這種特殊情況下,睡眠有兩個優點:
- 它什麼都不做,所以不消耗任何資源
- 使用者可以指定執行多長時間
下面解釋了這些如何幫助自動關閉 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)並在遠端伺服器上執行睡眠命令 10 秒(睡眠10)。
此方法與前一種方法(-N 開關)的區別基本上在於,在這種情況下,ssh 客戶端的主要目標不是創建隧道,而是執行 10 秒的 sleep 命令。隧道的創建是某種副作用,是次要目標。如果不使用 vncviewer,ssh 客戶端將在 10 秒後退出,因為它沒有更多工作要做,同時破壞隧道。
在 sleep 命令執行期間,如果另一個程序(在本例中為 vncviewer)開始使用該隧道並將其占用超過 10 秒,那麼即使 ssh 客戶端完成其遠端作業(執行睡眠),它也不能退出,因為另一個程序佔用了隧道。換句話說,ssh 客戶端不能破壞隧道,因為它也必須殺死 vncviewer。當 vncviewer 停止使用隧道時,ssh 客戶端也會退出,因為它已經完成了它的目標。
這樣,沒有 ssh 程序在後台執行。
腳本編寫的一個特別好的解決方案是使用
master mode
, 帶有用於控制命令的套接字:ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>
再次關閉它:
ssh -S <path-to-socket> -O exit <server>
這避免了對程序 ID 的 grepping 以及可能與其他方法相關的任何時間問題。