是否可以配置 ssh ProxyJump 但仍然让用户在命令行上指定远程服务器?
情况
workstation -> jumpserver -> remote1
-> remote2
-> remote3
-> remote4
-> remote5
使用与此类似的配置:
host jumpserver
User jump_user
HostName JJ.JJ.JJJ.JJ
ForwardX11 yes
host remote
ForwardX11 yes
ProxyJump jumpserver
host remote1
User remote_account_A
HostName remote1
ForwardX11 yes
ProxyJump jumpserver
我希望能够在命令行上运行(类似的)这个:
$ ssh remote remote_account_A@remote55
答案1
可能最简单的方法是使用现有的命令行选项,-J
对于 ProxyJump:
$ ssh -J jumpserver remote55
这和您示例中的输入量大致相同。
如果所有遥控器都有相同的前缀或后缀,Host
则为所有遥控器定义一个通配符部分:
Host remote*
HostName %h.example.com
ProxyJump jumpserver
您可以使用 将其应用于所有“裸”名称Host * !*.*
。
如果它们都在同一个域下解析,请使用较新版 OpenSSH 中的主机名规范化支持(它会执行两遍配置查找,一次查找短名称,另一次查找扩展域名)。这样就可以ssh remote55
在一个域下使用远程主机名,而不会影响另一个域下远程主机名的相同使用。
Host *.example.com
ProxyJump jumpserver
Host *
CanonicalizeHostname yes
答案2
该ProxyJump
命令用于连接堡垒主机,但它有更灵活的替代方案。
来自 RedHat 文章 使用 ProxyJump 通过代理或堡垒机通过 SSH 连接到远程主机:
替代方案:转发 stdin 和 stdout
ProxyJump
是使用 ssh 早已拥有的功能的简化方法:ProxyCommand
。ProxyCommand
通过代理或堡垒主机转发来自远程机器的标准输入 (stdin) 和标准输出 (stdout)。本身
ProxyCommand
是一个用于连接远程服务器的特定命令 - 就前面的示例而言,这将是首次连接堡垒时使用的手动 ssh 命令:$ ssh -o ProxyCommand="ssh -W %h:%p bastion-host" remote-host
%h:%p
上述标志的参数指定-W
将标准输入和输出转发到远程主机(%h
)和远程主机的端口(%p
)。
您可以在帖子中找到更多信息 ProxyCommand 用于多跳和提示身份验证,但我只想引用一条命令 Jakuje 的回答:
为了好玩,这里有一行,但请注意,这种方法很难输入,也很难阅读:
ssh -oProxyCommand= \ 'ssh -W %h:%p -oProxyCommand= \ \'ssh -W %h:%p -oProxyCommand= \ \\\'ssh -W %h:%p username1@jumphost1\\\' \ username2@jumphost2\' \ username3@jumphost3' \ username4@server
基本上你需要从里面进去。
还给出了上述命令的等效配置文件:
这是您所给出的示例的示例
~/.ssh/config
文件:Host jumphost1 User username1 Host jumphost2 User username2 ProxyCommand ssh -W %h:%p jumphost1 Host jumphost3 User username3 ProxyCommand ssh -W %h:%p jumphost2 Host server User username4 ProxyCommand ssh -W %h:%p jumphost3