【问题标题】:test if hostname exists from command line without ping在没有 ping 的情况下从命令行测试主机名是否存在
【发布时间】:2013-01-08 11:11:59
【问题描述】:

我们有一个脚本需要对有限的主机列表执行操作。但是每次我们在 /etc/hosts 文件中添加或删除主机时,我们最终都必须更新这个脚本。

基本上,假设我的主机文件如下所示:

192.168.100.1     hostip_1
192.168.100.2     hostip_2
192.168.100.10    hostip_3
192.168.100.20    hostip_5

我的脚本 (bash) 执行以下操作:

callmyfunction hostip_1
callmyfunction hostip_2
callmyfunction hostip_3
callmyfunction hostip_5

如果我想将 hostip_4 添加到主机列表中,我现在必须进入并编辑我的脚本并将其添加到列表中。虽然这是一个小修改,但它仍然是一个可以在此过程中忘记的步骤(尤其是当系统有新人加入时)。

有没有一种方法可以测试“hostip_1”是否是系统中的有效主机名(无需 ping 主机或 grepping /etc/hosts 文件)?我们可能会使用多个主机文件,并且不同的配置可能有不同的文件名,所以我不能依赖尝试 grep 单个文件。我需要系统为我完成这项工作。

有什么线索吗?

【问题讨论】:

  • 你试过nslookup hostip_1(或更现代的dig hostip_1)吗?听起来您真正需要的是设置自己的本地 DNS 服务器...
  • 这两个都需要 DNS。我最终回答了我自己的问题。谢谢你看这个。感谢您的帮助。

标签: linux bash ip host


【解决方案1】:

可能不在您的 /etc/hosts 文件中...最好搜索名称并查看是否可以找到 ip:

(($(dig +noall +answer google.de |wc -c)>0)) && echo exists

这是 bash,几乎可以适应一切。

dig +noall +answer google.de

如果找到则返回 ips。如果为空,则该名称不能在运行此代码的计算机中使用。

【讨论】:

  • 谢谢。但正如你所说,它不适用于/etc/hosts ...有没有办法包含所有案例?
【解决方案2】:

如果所有目标都在同一个子网(同一个网络)上,使用arping,它会使用ARP检查主机是否可用。

【讨论】:

  • 这是一个不太理想的解决方案,因为我试图这样做而不产生任何额外的网络流量。但它仍然是一个解决方案,感谢您的贡献。
  • ARP 流量与 ping 流量相比非常有限。 ping 和任何其他涉及以太网和 IPv4 的网络交换都需要 ARP。但是getent hosts 是使用 /etc/hosts 作为目标列表的方法。
【解决方案3】:

首先,我关于不在 hosts 文件中的东西的说法是错误的。这正是他们所在的地方。我很笨。

但答案是:

getent hosts

这将使它打印出所有内容,我可以从那里进行查找。

【讨论】:

  • 其实你可以找getent帮你查:getent hosts www.stackoverflow.com
  • 你是对的。我正在做getent hosts | grep -c myhost1_ip 的事情,但只是将其缩短为getent hosts myhost1_ip。检查你是否得到一个空字符串(结果),你已经得到了答案。
  • 您甚至不需要将结果作为字符串检查:如果找不到主机,getent 将返回非零值 -- if getent hosts $name; then echo "$name is in hosts"; else echo "$name not found"; fi
  • 为什么不:for name in `getent hosts | grep 'host_ip[[:digit:]]\+' | awk '{ print $2 }'` ; do callmyfunction $name ; done
  • 注意getent hosts不限于搜索/etc/hosts。虽然getent hosts 自己列出了/etc/hosts 中的条目,但getent hosts <hostname> 将检查<hostname> 的主机名信息的所有 源;它将返回来自/etc/hosts 的值、DNS(如果已配置)、mdns(如果已配置)以及您为解析主机名而配置的任何其他内容。它直接使用gethostbyaddr 来解析名称。
【解决方案4】:

当您填充 /etc/hosts 文件时,我假设您没有使用 DNS。因此,以下解决方案不适合您的用例。但它仍然会给你一些指导。

在正常的 DNS 环境中,您可以使用以下命令检查主机名到其对应的 IP

# host host_name

这将给出主机的 IP 地址。如果主机名不存在,则会给出相应的主机未找到消息。

您可以解析上述命令的输出,并可以推断出给定的主机名是否存在。

【讨论】:

  • 抱歉,这些是未绑定到 DNS 的内部 IP。应该指定的。
  • @thkala 建议的 getent hosts
    可与主机文件和配置的名称服务(如 DNS 和 NIS)一起使用。搜索顺序通常由 /etc/nsswitch.conf 控制。
猜你喜欢
  • 2021-06-30
  • 2014-07-22
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2014-12-17
  • 2015-08-28
  • 2019-07-27
相关资源
最近更新 更多