Security

在 ControlMaster SSH 會話上以程式方式刪除埠轉發

  • December 15, 2012

不久前,我得到了一個答案,告訴我如何在正在執行的 SSH ControlMaster 程序上添加埠轉發。要知道這有很大幫助,但是在我不再需要這種埠轉發之後,我仍然缺少一種刪除此類埠轉發的方法。

據我所知,您可以通過正常連接上的內部命令鍵序列來執行此操作,這似乎對 ControlMaster 客戶端禁用。即使這是可能的,我也需要一個可以用腳本自動化的解決方案,這肯定不是那麼容易。

有沒有辦法做到這一點?它是否易於自動化?

正如我之前的回答所指出的,ssh 手冊頁-O ctl_cmd詳細解釋ctl_cmdcheck, forward,cancelexit.

-O ctl_cmd
       Control an active connection multiplexing master process.  When the -O option is
       specified, the ctl_cmd argument is interpreted and passed to the master process.
       Valid commands are: “check” (check that the master process is running), “forward”
       (request forwardings without command execution), “exit” (request the master to
       exit), and “stop” (request the master to stop accepting further multiplexing
       requests).

您可以使用ctl_cmd’s 來完成腳本所需的自動化。您需要首先使用like 和 ssh創建一個ControlMaster套接字到遠端主機,如下所示:-S

ssh -v -M -S/tmp/controlmaster-remotehost remotehost

然後從您的本地機器上,您可以隨意使用forwardcancel。您可以使用一個命令轉發多個埠:

ssh -O forward -S/tmp/controlmaster-remotehost -L5555:localhost:22 -L3333:localhost:22 remotehost

和/或一次處理一個:

ssh -O cancel  -S/tmp/controlmaster-remotehost -L5555:localhost:22 remotehost
ssh -O cancel  -S/tmp/controlmaster-remotehost -L3333:localhost:22 remotehost

我創建了一個並排會議的要點,展示了ssh -O ctl_cmd實際情況;左側是來自 localhost 的埠forward/ cancel,右側是連接到 remotehost 的 ssh 輸出:

https://gist.github.com/raw/4265549/999d90b8f85190a41eed00e4d60d5d22da6c67b9/ssh-controlmaster-side-by-side.log

這些命令僅在OpenSSH 6.0中可用:

* ssh(1): support for cancelling local and remote port forwards via the
  multiplex socket. Use ssh -O cancel -L xx:xx:xx -R yy:yy:yy user@host"
  to request the cancellation of the specified forwardings
* support cancellation of local/dynamic forwardings from ~C commandline

如果您有較早的版本,則需要升級。如果您使用的是 Mac OS X,您可以安裝 macports,然後使用以下命令進行升級sudo port install openssh這會將其安裝到/opt/local/bin.

引用自:https://serverfault.com/questions/457295