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

sas*_*n13 3 linux ssh proxy sftp

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

/etc/密码

redtest:x:1002:1002::/home/redtest:/usr/bin/redtest
Run Code Online (Sandbox Code Playgroud)

/usr/bin/redtest

#!/bin/bash
/usr/bin/ssh redtest -t -F ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

/home/redtest/.ssh/config

Host redtest
        HostName redtest1
        User root
        IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

设置这样的事情的正确方法是什么,或者这是否可能?登录与容器是一对一的。感谢正确方向的推动!

Ken*_*ter 5

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

$SHELL -c 'the requested command'
Run Code Online (Sandbox Code Playgroud)

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

ssh user@somehost 'rm -rf /'
Run Code Online (Sandbox Code Playgroud)

和“user@somehost”/bin/bash作为他的外壳,那么服务器将运行相当于:

/bin/bash -c 'rm -rf /'
Run Code Online (Sandbox Code Playgroud)

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

Subsystem sftp /path/to/sftp-server
Run Code Online (Sandbox Code Playgroud)

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

$SHELL -c /path/to/sftp-server
Run Code Online (Sandbox Code Playgroud)

(有一种特殊情况称为“internal-sftp”,我不会在这里讨论。)

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

/usr/bin/redtest -c /path/to/sftp-server
Run Code Online (Sandbox Code Playgroud)

您的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
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想让redtest脚本更加复杂,您可以安排它在远程用户尝试运行 sftp 时运行如下所示的内容:

/usr/bin/ssh redtest -F ~/.ssh/config -s sftp
Run Code Online (Sandbox Code Playgroud)

-s参数sftp专门请求在目标主机上运行 sftp 子系统。