使用 ProxyCommand 和 netcat 模式时让 ssh 从配置解析主机名

使用 ProxyCommand 和 netcat 模式时让 ssh 从配置解析主机名

我正在尝试设置一些用于弹跳 ssh 连接的通用选项。这是我的~/.ssh/config文件,缩写为:

Host *%via
  ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p

Host gateway
  HostName gateway.example.com
  User username
  ForwardAgent yes
  IdentityFile keypathg

Host target
  User username
  HostName target.example.com
  IdentityFile keypatht

当我*%via使用Host别名时,我得到:

% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host

但是,如果我利用

% ssh target.example.com%via

我访问了目标服务器,但作为错误的用户并且没有 pubkey 身份验证。

思考此时我的问题是,在使用时ForwardAgent,这种弹跳方法是否会通过我的 ssh 配置/环境整个,或者只是密钥。如果只是钥匙,前者可以以某种方式利用吗?

我的ssh版本是5.9v1,网关是5.9v1,目标是5.3p1。我相信-W是在 5.4 中引入的,但这对于最终的盒子来说应该不重要吧?使用旧学校nc似乎没有什么不同。

我已经验证我可以手动 ssh 到线路中的每个盒子。这样做表明主机名别名信息未传递,因为在网关上时,我不能,ssh target但我可以ssh target.example.com。这适用于 pubkey auth。网关和目标偶然具有相同的用户名,这就是为什么在没有推送配置的情况下它会起作用的原因。

如果ForwardAgent或类似的配置无法推送此信息,那么最明智的解决方法是什么,在网关上保留包含此信息的 .ssh/config ?

答案1

哇,谢谢你问这个问题。我发现很少有人充分利用 SSH,这个问题涉及到几个领域。

这不是ProxyCommand问题。它ProxyCommand只是指示本地 ssh 客户端在尝试与远程客户端通信之前做一些准备工作。是的,在我们的实例中,我们与另一个 ssh 会话进行通信,但该会话只是-W简单地获取我们的输入并将其转发到另一台机器。您可以认为准备 ssh 会话是完全独立的。不可避免的汽车类比:无论您是否需要乘坐渡轮从 A 点到 B 点,您的汽车都是同一辆车。

这不是ForwardAgent问题。 ForwardAgent让本地客户端提供一种工具,使本地密钥在远程会话的环境中可用。您还没有完成建立远程会话的任务。

这是一个.ssh/config格式问题。请注意第二行和第三行 debug1。它们列出了从您的.ssh/config.您注意到这$ ssh target.example.com%via有效,但用户名和密钥错误。好吧, 的 节Host target没有被读取(这将提供正确的用户名和密钥文件)。使用了哪些节? **%via

如何让这些选项通过?嗯,很有趣,通配符匹配 0 长度的字符串。 Host target*将匹配target, target%via,target.example.comtarget.example.com%via

所以你问这个问题,会在机器.ssh/config上设置一个gateway帮助吗?不,不会的。它永远不会被阅读。一切都发生在我们的本地机器上。

我所解释的只是回答为什么$ ssh target.example.com%via不起作用。

你比较喜欢$ ssh target%via。确实如此,这样更方便。缩写形式失败,因为作为主机名,target找不到;它没有解决。为什么 ssh 不喷出:ssh: Could not resolve hostname target: Name or service not known?因为ProxyCommand已经成功建立了。 ssh 连接的元素已经建立,但主机名故障发生在意想不到的地方,因此它会发出更通用的消息。我会就此提交一份错误报告,以帮助确定调试信息可以改进的地方。

最后评论:

我确实喜欢它的Host *%via语法。它很干净,但又灵活。我以前见过Host *+*,它使用 的第一部分和最后一部分来%h(ost)确定去哪里。但你需要付出更多的努力才能理解这一点。关联:http://wiki.gentoo.org/wiki/SSH_jump_host

相关内容