aircraft Asked: 2019-10-02 06:05:51 +0800 CST2019-10-02 06:05:51 +0800 CST 2019-10-02 06:05:51 +0800 CST OpenSSH 是否支持多跳登录? 772 Ansible 使用 OpenSSH 作为底层网络通信实现,但它是否支持多跳登录? 我的意思是,如果 Ansible 可以直接登录服务器,但它可以登录 server_a 然后从 server_a 登录 server_b 配置 server_b 吗? ssh openssh 2 个回答 Voted Best Answer Martin Prikryl 2019-10-02T06:12:27+08:002019-10-02T06:12:27+08:00 我不知道 Ansible 如何使用 OpenSSH。 但是 OpenSSH 本身支持“多跳登录”。 从 OpenSSH 7.3 开始,您可以使用-J(跳转)开关,例如: ssh -J [email protected] [email protected] -J相当于ProxyJump指令:_ ssh -o [email protected] [email protected] 请注意,对于文件传输工具,例如scp和sftp,-J仅从 8.0 开始支持该开关。对于旧版本(但至少 7.3),使用ProxyJump. 请参阅如何从只能通过 SSH 连接到另一台主机的主机下载文件? 另请注意,这些版本指的是 OpenSSH 的本地版本。OpenSSH 的远程版本不相关。 正如@GordonDavisson 评论的那样,对于旧版本(但至少为 5.4),您可以使用ProxyCommand指令和-Wswitch: ssh -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected] 即使是旧版本,您也可以使用nccommand而不是-W: ssh -o ProxyCommand="ssh user2@%h nc host2.example.com 22" \ -o HostKeyAlias=host2.example.com \ host1.example.com Wikibooks 文章OpenSSH/Cookbook/Proxies 和 Jump Hosts中详细介绍了上述所有选项 。 另一种选择是使用端口转发(-Lswitch)。但这涉及两个ssh例子。我不确定 Ansible 是否可行。 HoD 2019-10-05T00:06:38+08:002019-10-05T00:06:38+08:00 对于较旧的 Ansible 版本,您必须按照 Martin Prikryls 的回答中所述在通用 SSH 配置中执行此操作。新版本具有 Ansible 特定配置,如一般常见问题解答中所述 如何配置跳转主机以访问我无法直接 访问的服务器? 您可以在 ansible_ssh_common_args 库存变量中设置 ProxyCommand。连接到相关主机时,此变量中指定的任何参数都会添加到 sftp/scp/ssh 命令行。考虑以下库存组: [gatewayed] foo ansible_host=192.0.2.1 bar ansible_host=192.0.2.2 您可以使用以下内容创建 group_vars/gatewayed.yml: ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q [email protected]"' 当尝试连接到网关组中的任何主机时,Ansible 会将这些参数附加到命令行。(这些参数用于 ansible.cfg 中的任何 ssh_args,因此您无需在 ansible_ssh_common_args 中重复全局 ControlPersist 设置。) 请注意, ssh -W 仅适用于 OpenSSH 5.4 或更高版本。对于旧版本,必须在堡垒主机上执行 nc %h:%p 或一些等效命令。 对于早期版本的 Ansible,有必要在 ~/.ssh/config 中为一个或多个主机配置合适的 ProxyCommand,或者通过在 ansible.cfg 中设置 ssh_args 来全局配置。 这样,您就有了一种非常 Ansible-esque 的方式,仅在需要时设置 SSH 堡垒主机,以及任何其他特殊的 SSH 设置(如密钥、用户等)。
我不知道 Ansible 如何使用 OpenSSH。
但是 OpenSSH 本身支持“多跳登录”。
从 OpenSSH 7.3 开始,您可以使用
-J
(跳转)开关,例如:-J
相当于ProxyJump
指令:_请注意,对于文件传输工具,例如
scp
和sftp
,-J
仅从 8.0 开始支持该开关。对于旧版本(但至少 7.3),使用ProxyJump
. 请参阅如何从只能通过 SSH 连接到另一台主机的主机下载文件?另请注意,这些版本指的是 OpenSSH 的本地版本。OpenSSH 的远程版本不相关。
正如@GordonDavisson 评论的那样,对于旧版本(但至少为 5.4),您可以使用
ProxyCommand
指令和-W
switch:即使是旧版本,您也可以使用
nc
command而不是-W
:Wikibooks 文章OpenSSH/Cookbook/Proxies 和 Jump Hosts中详细介绍了上述所有选项 。
另一种选择是使用端口转发(
-L
switch)。但这涉及两个ssh
例子。我不确定 Ansible 是否可行。对于较旧的 Ansible 版本,您必须按照 Martin Prikryls 的回答中所述在通用 SSH 配置中执行此操作。新版本具有 Ansible 特定配置,如一般常见问题解答中所述
这样,您就有了一种非常 Ansible-esque 的方式,仅在需要时设置 SSH 堡垒主机,以及任何其他特殊的 SSH 设置(如密钥、用户等)。