如何在没有域名的情况下通过主机名在内部 ssh 到服务器?

Cla*_*ied 11 networking ssh

我需要在工作时登录到多台服务器才能完成工作。我已经厌倦了键入要访问的服务器的 FQDN。我正在我们自己的专用网络上通过 ssh 登录/注销。我 99% 确定它在我们自己的专用网络上 b/c 所有服务器都有 ip addr 10.xyz 有没有办法只使用主机名而不是域名来 ssh 进入服务器?

我们在多个国家/地区拥有服务器。我们的服务器命名方式很长。它的命名如下:

hostname.country.domainname.com

我正在输入腕管 ssh me@hostname1.country.domainname.com

...每次我访问我们的一台服务器时。如果我在美国并且我尝试访问位于美国的另一台主机,则只需输入即可ssh me@hostname2正常连接。但是,如果我在美国并尝试连接到英国的服务器,则无法键入ssh me@hostname3.eng并连接到hostname3.

我所做的解决方法是在我的 ~/.ssh/config 文件中为某些服务器设置一个别名。但是,我认为将 1000 多个服务器添加到该文件中是不可行的。我已经添加了 20 多台服务器,我的同事认为我疯了,尽管我认为他们在四处闲逛时输入 FQDN 很疯狂。

有没有一种简单的方法可以让我们设置一些东西,这样我们就不必每次都输入我们的 domainname.com?

Ste*_*ris 18

您可以通配符并%h在您的配置中使用

例如

Host *.eng
  Hostname %h.domainname.com
Run Code Online (Sandbox Code Playgroud)

现在,当您这样做时,ssh foo.eng它会尝试连接到foo.eng.domainname.com.

您也可以向此配置添加其他选项;例如强制用户名

Host *.eng
  Hostname %h.domainname.com
  User me
Run Code Online (Sandbox Code Playgroud)

现在,当您这样做时ssh foo.eng,它将尝试以foo.eng.domainname.com用户身份连接me

% ssh foo.eng
ssh: Could not resolve hostname foo.eng.domainname.com: Name or service not known
Run Code Online (Sandbox Code Playgroud)

(好吧,显然在它对我来说不是有效主机名之前我收到了一个错误!)

所以现在每个国家只需要一个规则。

  • 使用我写的规则,您可以执行 `ssh foobar@somewhere.eng`,它会按预期工作。所有这些都是重写主机名组件。它甚至可以与 `scp` 和 `sftp` 等一起使用。 (3认同)

小智 9

您可以CanonicalDomains在 ssh 配置中使用该选项。

将以下内容添加到您的 ssh 配置文件将使 ssh 尝试附加domainname.com到名称中最多包含 1 个点的任何主机:

CanonicalizeHostname yes
CanonicalDomains domainname.com
Run Code Online (Sandbox Code Playgroud)

使用此配置ssh foo.eng将首先尝试foo.eng.domainname.comfoo.eng如果找不到主机则回退。同样,ssh github.com会先尝试github.com.domainname.com,所以如果你想连接到 GitHub,你的 DNS 服务器不应该返回非现有主机的记录。

CanonicalizeMaxDots可用于控制SSH认为完全合格的,且不添加之前多少个点可以在主机名出现domainname.com。它默认为 1,考虑到您目前拥有的方案,这对您来说应该足够了,但是如果您遇到类似的hostname.city.country情况,则需要增加它。


Jos*_* R. 9

如果添加

search domainname.com
Run Code Online (Sandbox Code Playgroud)

to /etc/resolv.conf, and use hostname.country, ssh(以及其他网络程序,就此而言)将自动domainname.com为您附加1

我认为将不同的国家/地区域添加到您的search路径中不是一个好主意,因为如果两个不同国家/地区的两台服务器共享相同的主机名,您可能会出现意外行为2

我相信这种方法比更改ssh配置更好,因为hostname.country无论您使用什么程序(telnet,VNC,...),这都可以解决。

resolv.conf(5)


1更准确地说,domainname.com如果它不能自行解决,它将追加hostname.country

2在这种情况下,hostname将解析为search路径中首先列出域的国家/地区的服务器。

  • 顺便说一句,您也可以通过环境变量 LOCALDOMAIN 作为非 root 用户和每个进程执行此操作。`人resolv.conf` (2认同)