我正在尝试使用自动跳转箱为我们的用户设置 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 子系统。