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


16

我正在尝试设置一些通用选项来弹跳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 config / environment整体还是仅通过键。如果只是钥匙,前者可以某种方式利用吗?

我的ssh版本是5.9v1,网关是5.9v1,目标是5.3p1。我相信-W是在5.4中引入的,但对于最后一行来说,这应该没关系吗?利用较老的学校nc似乎没有什么不同。

我已经验证可以手动将ssh放入该行中的每个框。这样做表示未传递主机名别名信息,就像在网关上时一样,ssh target但不能ssh target.example.com。这适用于pubkey auth。网关和目标偶然具有相同的用户名,这就是为什么如果不推送配置该方法可以起作用的原因。

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

Answers:


14

哇,谢谢你问这个问题。我发现很少有人能充分利用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*将匹配targettarget%viatarget.example.comtarget.example.com%via

因此,您提出问题,将.ssh/configgateway计算机上设置帮助。不,不会。它永远不会被读取。一切都在我们的本地计算机上进行。

我已经解释了所有,仅回答了为什么$ 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.