登录时重定向 SSH,但 SFTP 不起作用

登录时重定向 SSH,但 SFTP 不起作用

我正在尝试使用自动跳转箱为我们的用户设置 SSH 代理。用户登录后会自动通过 SSH 连接到其容器/虚拟机,效果很好。遗憾的是,通过它建立隧道的 SFTP 却不行。我确信这与我的设置方式有关,因为它基本上只是将术语传回管道,而不是正确地建立隧道。

密码文件 /etc/passwd

redtest:x:1002:1002::/home/redtest:/usr/bin/redtest

/usr/bin/redtest

#!/bin/bash
/usr/bin/ssh redtest -t -F ~/.ssh/config

/home/redtest/.ssh/config

Host redtest
        HostName redtest1
        User root
        IdentityFile ~/.ssh/id_rsa

设置此类东西的正确方法是什么,或者这是否可行?登录名与容器是一对一的。感谢您在正确方向上的推动!

答案1

当远程 ssh 客户端请求在服务器上运行命令时,OpenSSH 服务器会使用“-c”选项启动本地用户的 shell 来运行该命令。它运行的操作与此相同:

$SHELL -c 'the requested command'

例如,如果远程用户运行:

ssh user@somehost 'rm -rf /'

并且“user@somehost”拥有/bin/bash其 shell,则服务器将运行相当于以下内容的命令:

/bin/bash -c 'rm -rf /'

SFTP 稍微复杂一些,但最终结果是一样的。远程客户端请求服务器运行“sftp”子系统。在服务器的sshd_config文件中,您可能会看到如下一行:

Subsystem sftp /path/to/sftp-server

该行表示“当客户端请求‘sftp’子系统时,运行 /path/to/sftp-server”sftp-server是 OpenSSH 附带的一个程序,它实现了 SFTP 协议的服务器部分。因此,当 ssh 客户端连接并请求 sftp 子系统时,服务器最终会运行:

$SHELL -c /path/to/sftp-server

(有一个特殊情况称为“internal-sftp”,这里我就不多说了。)

现在,您已编写了一个名为的脚本/usr/bin/redtest并将其设置为用户的 shell。因此,当远程用户尝试运行 sftp 时,服务器最终将运行:

/usr/bin/redtest -c /path/to/sftp-server

您的redtest脚本忽略其命令行,只启动与目标服务器的普通 ssh 会话。它从不在目标服务器上运行 sftp-server 程序。

为了实现这一点,您需要sftp-server在以这种方式运行 redtest 时让 redtest 在目标主机上启动。如果您对用户在目标主机上运行的内容不太挑剔,那么类似这样的操作应该可以工作:

#!/bin/bash
if [ "$1" = "-c" ]
then
    /usr/bin/ssh redtest -F ~/.ssh/config "$2"
else
    /usr/bin/ssh redtest -t -F ~/.ssh/config
fi

这将传递客户端请求的任何命令,而不仅仅是 sftp。这应该不是问题,因为用户显然无论如何都具有对目标服务器的 root 命令行访问权限。

如果跳转主机和目标主机不在同一个位置,您可能会遇到问题sftp-server。跳转主机上的 ssh 服务器将尝试使用跳转主机配置中的路径运行 sftp-server,但该路径对于目标主机来说可能不正确。您必须确保sftp-server可以使用跳转主机的 sshd_config 中的路径在目标主机上调用。

如果您想使redtest脚本更加复杂,您可以安排它在远程用户尝试运行 sftp 时运行如下操作:

/usr/bin/ssh redtest -F ~/.ssh/config -s sftp

-s和参数sftp特别请求在目标主机上运行 sftp 子系统。

相关内容