我正在尝试设置一些用于弹跳 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.com
和target.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