ssh somename起作用而nslookup somename不能起作用吗?


16

如何知道somename我可以访问的某些主机的IP地址ssh?如果我nslookup在此主机上这样做,则说“没有答案”。那怎么ssh解决它的名字呢?


既不/etc/hosts也不.ssh/config解释工作。


编辑

对不起somename,完全合格。

ssh somename.somedomain

工作,而

ping somename.somedomain

nslookup somename.somedomain


12
是在/etc/hosts或中列出的~/.ssh/config吗?
史蒂芬·基特

1
还可以使用mDNS(多播DNS)或LLMNR(链接本地多播名称解析)来解析名称。
约翰·迈伦(JohanMyréen)'19年

它可能在您的.ssh / config文件中包含一个条目
Tagwint,

1
@Dims您可以尝试ping somename.local.local是为mDNS保留的特殊域。对于LLMNR,您可以使用 NMAP脚本。
约翰·迈伦(JohanMyréen),

2
@mckenzm不,不会。
史蒂芬·基特

Answers:


31

Nslookup是用于查询Internet域名服务器的程序。Nslookup对于查询DNS服务器非常有用,但在名称解析方面却无法为您提供全面的信息。

在Linux上,名称解析最常见的是由NSS控制,该功能由配置/etc/nsswitch.conf。具体来说,此配置包含一个hosts条目。例如:

hosts:          files dns

在上面的条目中,您可以看到要查询的第一件事files后面是dns,这意味着/etc/hosts将在DNS之前进行查询。存在其他选项,包括LDAP多播DNSWINS

SSH直接回答您的问题,使用NSS(从多个来源中提取结果)将主机名解析为IP地址,其中nslookup仅查询DNS。

您可以查看哪个IP NSS将主机名解析为使用getent。例如解决somename

getent hosts somename

同样 ,对于SSH,您可以在/etc/ssh/ssh_config和中配置主机特定的信息~/.ssh/config。这甚至可以让您为主机名指定IP地址,而完全跳过名称解析。

以下内容告诉SSH 192.168.1.25用于devdev.example.com。SSH 是否会使用该地址这些名称作为其他IP的DNS名称存在,:

# contents of $HOME/.ssh/config
Host dev dev.example.com
    HostName 192.168.1.25

10

如何知道某台主机的IP地址 somename我可以ssh

使用详细标志(-vssh命令):

ssh somename -v

除其他事项外,输出应包含一行,该行显示您要连接到的服务器的已解析IP:

debug1: Connecting to aur.archlinux.org [5.9.250.164] port 22.

如果我在此主机上执行nslookup,则会显示“无答案”。那怎么ssh解决它的名字呢?

最可能的原因 ssh能够解析无法解决的主机名nslookup是它是在该ssh级别配置的。

ssh_config(5)手册中,有三个地方ssh会查看配置文件:

  1. 命令行选项
  2. 用户的配置文件(〜/ .ssh / config)
  3. 系统范围的配置文件(/ etc / ssh / ssh_config)

这些文件之一可能包含您的主机名somename(或与之匹配的模式),作为另一主机名或IP的别名。例如:

# explicit alias of somename to 8.8.8.8 IP
Host somename
    HostName 8.8.8.8

# pattern alias (that obviously matches somename) to another hostname
# that is itself resolved via DNS (and that can be nslookup-ed).
Host *
    HostName anotherhostname

请参阅ssh_config(5)手册页中的HostHostName指令说明以及PATTERNS更多信息。


此答案不能回答问题,即如何识别主机名,即使它不是DNS服务器所提供的服务器。
约翰·迈伦(JohanMyréen),

1
答案正确地提到了一个非常可能的情况,其中ssh user@someserver似乎“解析”了someserverDNS名称(即使实际上没有发生)。如果Host someserver.ssh/config文件中配置了,则即使完全someserver不在DNS中,也可以完全按照OP的状态使用ssh命令。
菲沙

2
@JohanMyréen的输出ssh -v somename包括IP地址(无论任何ssh_config条目)。因此,它直接回答了“如何知道我可以通过SSH传递的某个主机的IP地址?”这个问题,同时也是回答“如何通过ssh的渗透如何起作用……?”的第一步。
JigglyNaga

4

菲利普(Philip)快要在那里了,但要出发 .ssh/config您不太可能配置棘道开始。

命令...

getent hosts somename

...使用中的hosts:查询行查询NSS /etc/nsswitch.conf,而不仅仅是DNS nslookup。您的Unix环境可能使用了不止一种命名服务。可能是某种类型的AD集成。


3
我不会说我沿着那条路走了。为了完整性,我添加了“也”。
菲利普·库林

@PhilipCouling可以,但是您的“前置”也是不完整的-当问题涉及“ $ thing vs nsloookup”时,您没有显示如何任意解析名称。
Rich

3
正如对Q的评论,host通常是bind-utils(或同等功能)的一部分,并且两者都一样,nslookup并且dig仅使用DNS。OTOH getent hosts(或可能是ahosts)按照您的描述进行。
dave_thompson_085

@ dave_thompson_085不正确。host查询其他名称服务。商定这getent hosts是查询“任何已配置名称服务”的最佳方法。
丰富

1
host是每个手册页中唯一的DNS,并通过在我使用的系统(CentOS,Ubuntu,FreeBSD,Solaris)以及上游系统上的测试得到确认。另请参阅我在Q上发表评论的(近)重复。
dave_thompson_085
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.