验证给定字符串是否为有效的 FQDN 名称的最简单方法?

验证给定字符串是否为有效的 FQDN 名称的最简单方法?

启动 Erlang VM 时,我需要提供'-name'或,'-sname'具体取决于给定的字符串是否为完全限定名称 (FQDN)。验证这一点的最快且独立于环境的方法是什么?我更感兴趣的是使用一些 bash 命令(如'getent''nslookup'或其他命令),而不是正则表达式。最好它能够在 Ubuntu、FreeBSD 和 Solaris 中运行而无需更改,并且可以轻松地在 bash 中使用'if'

答案1

主机似乎可以工作:

jalderman@mba:/tmp$ cat test.sh
#!/bin/bash

for h in "bert" "ernie" "www.google.com"
do
    host $h 2>&1 > /dev/null
    if [ $? -eq 0 ]
    then
        echo "$h is a FQDN"
    else
        echo "$h is not a FQDN"
    fi
done

jalderman@mba:/tmp$ ./test.sh 
bert is not a FQDN
ernie is not a FQDN
www.google.com is a FQDN

答案2

不幸的是,我无法发表评论,但这实际上是对已接受答案的评论:解决方案不会检查提供的参数是否真的是 FQDN。实际上可以解析的简单主机名也将符合条件(最简单的示例:“localhost”)。因此,如果问题不是针对 fqdn 而只是针对解析名称,那么问题的标题可能应该相应地更改。实际上添加到解决方案中:如果确实需要 fqdn,您只需检查给定名称中的点,如下所示:

is_fqdn() {
  hostname=$1
  [[ $hostname == *"."* ]] || return 1
  host $hostname > /dev/null 2>&1 || return 1
}

这仍然允许“localhost”,但从技术上讲,无论如何,这都是一个 fqdn。

答案3

可以使用 hostname 的“ndots”选项在一个命令中完成所有操作:

host -N 0 $hostname

这不会附加 /etc/resolv.conf 中的搜索或域指令中列出的域。

更新一个例子:

假设您有一个变量“hostname”,其中包含一个字符串,您想知道该字符串是否是 FQDN。使用简单的“host”,它将尝试该字符串,如果未找到,它将从“/etc/resolv.conf”附加“search”和“domain”。

$ hostname=www
$ host $hostname
www.example.com has address 192.168.0.1
$ host -N 0 $hostname
Host www not found: 3(NXDOMAIN)
$ echo $?
1

这意味着“www”不是FQDN。如果是 FQDN,则应该由“主机”找到。

另一个更新:

我使用 Linux,但假设“host”命令与 FreeBSD 上的相同。

答案4

我发现使用 /usr/bin/host 对我来说太慢了,而对于我的目的,我只需要知道字符串是否包含点。请参阅https://unix.stackexchange.com/questions/63361/test-if-a-string-has-a-period-in-it-with-bash

相关内容