A maneira mais simples de verificar se uma determinada string é um nome FQDN válido?

1

Eu preciso fornecer '-name' ou '-sname' ao iniciar uma VM Erlang dependendo se a string especificada é um nome totalmente qualificado (FQDN) ou não. Qual seria a maneira mais rápida e independente do ambiente de validar isso? Estou mais interessado em usar algum comando bash (como 'getent' ou 'nslookup' ou outros) em vez de uma expressão regex. Melhor se funciona no Ubuntu, FreeBSD e Solaris sem alterações e pode ser usado no 'if' do bash facilmente.

    
por Amiramix 06.05.2014 / 15:59

3 respostas

1

O host parece funcionar:

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
    
por 06.05.2014 / 19:12
1

Infelizmente, não posso comentar, mas este é, na verdade, um comentário à resposta aceita: A solução não verifica se o argumento fornecido é realmente um FQDN. Nomes de host simples que podem realmente ser resolvidos também se qualificam (exemplo mais simples: "localhost"). Então, talvez o título da questão deva ser alterado de acordo, se a questão não for para um fqdn, mas simplesmente para um nome de resolução. Para realmente adicionar à solução: Se um fqdn for realmente necessário, você poderia simplesmente verificar um ponto no nome dado, assim:

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

Isso ainda permitirá "localhost", mas isso é tecnicamente um fqdn, de qualquer maneira.

    
por 09.03.2016 / 09:21
0

A opção "ndots" do nome do host pode ser usada para fazer tudo em um comando:

host -N 0 $hostname

Isso não acrescentará domínios listados na diretiva de pesquisa ou domínio em /etc/resolv.conf.

Atualize com um exemplo:

Suponha que você tenha uma variável "hostname" que contenha uma string, você deseja saber, se a string for um FQDN. Usando o "host" simples, ele tentará a string e, se não for encontrado, anexará "search" e "domain" de "/etc/resolv.conf".

$ 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

O que significa que "www" é não um FQDN. Se fosse um FQDN, deveria ser encontrado por "host".

Outra atualização:

Eu uso o Linux, mas assumi que o comando "host" é o mesmo que no FreeBSD.

    
por 07.06.2017 / 16:15