Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过jumphost的CanonicalHostname和ssh连接_Ssh - Fatal编程技术网

通过jumphost的CanonicalHostname和ssh连接

通过jumphost的CanonicalHostname和ssh连接,ssh,Ssh,假设我有一个名为internal.sub.domain.net的内部子域,其主机类似于foo.internal.sub.domain.net和bar.internal.sub.domain.net。此外,这些主机只能通过jumphostinternal.sub.domain.net从外部世界访问。因此,以下~/.ssh/config允许我从外部直接连接到任何一个内部主机: Host foo-bar 主机名%h.internal.sub.domain.net ProxyJump internal.

假设我有一个名为
internal.sub.domain.net
的内部子域,其主机类似于
foo.internal.sub.domain.net
bar.internal.sub.domain.net
。此外,这些主机只能通过jumphost
internal.sub.domain.net
从外部世界访问。因此,以下
~/.ssh/config
允许我从外部直接连接到任何一个内部主机:

Host foo-bar
主机名%h.internal.sub.domain.net
ProxyJump internal.sub.domain.net
对于只有几台主机的子域来说,这是很好的,但是如果主机的数量很大和/或偶尔更改,它很快就会变得相当不可维护。但通配符可能会起到解救作用:

Host*.internal.sub.domain.net
ProxyJump internal.sub.domain.net
这避免了维护问题,但强制始终指定要连接的完全限定主机名,这相当繁琐。从ssh_config手册页来看,
cannonicializehostname
cannonicialdomes
选项似乎可以解决以下问题:

cannonicializeHostName始终
CannonicalDomes internal.sub.domain.net
主机*.internal.sub.domain.net
ProxyJump internal.sub.domain.net
但是,只有当要连接的主机的名称查找成功时,这才有效。但由于这些主机定义为内部主机,因此名称解析失败也就不足为奇了

一个不是很有用但很有说明性的黑客方法是通过将所有内部主机作为别名添加到
/etc/hosts
,来伪造成功的名称解析,例如将
/etc/hosts
添加到
/etc/hosts

127.0.0.1 foo.internal.sub.domain.net bar.internal.sub.domain.net
有了这一行,最后一个
~/.ssh/config
就像一个符咒。但是,除了这将是一个相当大的攻击之外,它只是将维护问题从
~/.ssh/config
转移到
/etc/hosts

正如所描述的场景不应该如此罕见,有没有办法让它工作?用一句话把它再说一遍:


我希望能够通过ssh连接到位于
internal.sub.domain.net
中的所有内部主机,即只能通过
internal.sub.domain.net
jumphost访问的主机,而不必在某个位置列出这些主机,因为它们可能经常从内部域中添加或删除,并且不必始终键入其完全限定的主机名。

如果您是从shell调用ssh,则可以为内部域定义一个短变量,并将其附加到相关主机名:

e、 g.在~/.bashrc或类似文件中:

i=".internal.sub.domain.net"
然后,在命令行上:

ssh foo$i
ssh bar$i
至少在更好的解决方案出现之前。它并不完美,但在命令行中只增加了2个字符

更新:出现了一个更好的解决方案

由Peter Stuge在openssh邮件列表中提出的一个更好的解决方案是在配置文件中包含如下内容:

Host *.i
    ProxyCommand ssh -W %hnternal.sub.domain.net:%p jumphost
这允许使用缩写主机名,如
foo.i
(而不是在我的第一个答案中使用
foo$i
)。能够使用
而不是
$
更好,因为它不需要使用shift键

但是,这仅限于内部域以
i
开头的单个远程jumphost。我认为以
internal.
开头的内部域很常见。如果您需要连接到多个这样的内部域,则需要对上面的内容进行轻微(但非常难看)调整。如果有人的眼睛开始流血,我提前道歉

例如,如果需要连接到这些内部域:

internal.a.com
internal.b.net
然后,需要将上述内容更改为以下内容:

Host *.a
    ProxyCommand sh -c "H=%h; exec sh -c \"exec ssh -W \${H%%.a}.internal.a.com:%p jumphosta\""

Host *.b
    ProxyCommand sh -c "H=%h; exec sh -c \"exec ssh -W \${H%%.b}.internal.b.net:%p jumphostb\""
相信我,我希望它能更简单,但这是我能做的最短的事情(不使用单独的shell脚本或环境变量)

如果命令行中提供了用户名,则该用户名仅适用于跳转到的主机。默认情况下,您的本地用户名将用于jumphost

如果需要为jumphost使用与本地用户名不同的用户名,请将其添加到
ProxyCommand
(例如
jumpuser@jumphosta