我正在尝试为用户建立一种连接到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
并给我一个到机器的 SFTP 会话some_other_server
。
但
当我做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.
我需要弄清楚我在这里做错了什么,或者是否有更好的方法来为我的用户提供这种连接。
答案1
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,则需要使用Subsystem
指示对于 SFTP,不是ForceCommand
:
Subsystem sftp ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
或者,为了避免必须分别为 SSH 和 SFTP 重复隧道,您可以使用SSH_ORIGINAL_COMMAND
环境变量来决定是否使用-s sftp
。
sftp-server
如果您实际上知道(最)远程 SFTP 服务器也有 OpenSSH 并且与中间服务器具有相同的二进制路径,那么这应该涵盖 SSH 和 SFTP:
ForceCommand ssh -i /home/someuser/.ssh/id_rsa someuser@some_other_server $SSH_ORIGINAL_COMMAND