無縫 SFTP 隧道/跳箱
我正在嘗試為使用者設置一種方式來連接到相同
gateway server
的 SSH/SFTP(SFTP 優先,SSH 很好),並讓該gateway
伺服器將使用者路由到我的網路內由使用者名和私有主機標識的私有伺服器他們想達到。這必須是無縫的使用者體驗,即 - 沒有特殊的配置文件設置,沒有用於命令行會話的標誌,並且在 Filezilla 等 UI 工具中沒有特殊設置。到目前為止,我設法做的是將此塊添加到伺服器
sshd_config
中的文件中gateway
:Match User someuser ForceCommand sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
現在,當我從客戶端電腦執行此操作時,這很有效:
ssh -i id_rsa someuser@gateway_server_machine
它將觸發
ForceCommand
並給我一個與some_other_server
機器的 SFTP 會話。但
當我做
sftp -i id_rsa someuser@gateway_server_machine
連接掛起並最終終止。
所以,sftp 沒有給出任何東西,即使是冗長的 - 只是掛在那裡 - 但這是我從伺服器端得到的:
debug1: subsystem: internal-sftp Starting session: forced-command (config) 'sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server ' for someuser from 10.16.2.149 port 58822 id 0
在 SSH 上我得到:
Starting session: forced-command (config) 'sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server ' on pts/1 for someuser from 10.16.2.149 port 33550 id 0 debug1: Setting controlling tty using TIOCSCTTY.
我需要弄清楚我在這裡做錯了什麼,或者是否有更好的方法來為我的使用者提供這種連接。
ForceCommand sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
以上將使用其文本界面在中間伺服器上啟動 SFTP客戶端。您的本地 SFTP 客戶端(或任何其他客戶端)無法與之通信。它需要二進制SFTP協議。這也解釋了為什麼似乎作為客戶工作。但事實並非如此。它只是在中間伺服器上傳遞客戶端的文本介面。
sftp``ssh``sftp``sftp
你需要的是這樣的:
ForceCommand ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
這使得(大多數)遠端伺服器啟動 SFTP伺服器(
-s sftp
)和中間伺服器將二進制SFTP 協議通過管道傳輸來回(ssh
只是管道遠端的二進制輸入/輸出sftp-server
,與設置本地ssh
管道文本輸入/的方式相同)中間體的輸出sftp
)。但是,如果您同時需要 SFTP 和 SSH,則需要對 SFTP 使用
Subsystem
指令,而不是ForceCommand
:Subsystem sftp ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
或者為了避免為 SSH 和 SFTP 分別重複隧道,您可以使用
SSH_ORIGINAL_COMMAND
環境變數來決定是否使用-s sftp
。如果您確實知道(大多數)遠端 SFTP 伺服器也具有 OpenSSH 並且與
sftp-server
中間伺服器具有相同的二進制路徑,那麼這應該涵蓋 SSH 和 SFTP:ForceCommand ssh -i /home/someuser/.ssh/id_rsa someuser@some_other_server $SSH_ORIGINAL_COMMAND