यह सत्यापित करने का सबसे सरल तरीका है कि क्या दिए गए स्ट्रिंग एक वैध FQDN नाम है?


1

मुझे '-name'या तो आपूर्ति करने की आवश्यकता है या '-sname'जब एक दिए गए तार पूरी तरह से योग्य नाम (FQDN) है या नहीं, इस पर निर्भर करते हुए एक Erlang VM शुरू करना। इसे सत्यापित करने का सबसे तेज और पर्यावरण-स्वतंत्र तरीका क्या होगा? मैं (जैसे कुछ बैश आदेश का उपयोग करने में अधिक दिलचस्पी है 'getent'या 'nslookup'नहीं बल्कि एक regex अभिव्यक्ति की तुलना में या अन्य)। यदि यह बिना किसी बदलाव के उबंटू, फ्रीबीएसडी और सोलारिस में काम करता है, तो सबसे अच्छा है और इसका उपयोग 'if'आसानी से किया जा सकता है ।


बहुत ज्यादा कोई भी स्ट्रिंग एक वैध fqdn हो सकती है बशर्ते उसमें एक डॉट हो या अंत में, इसलिए एक लुकअप निश्चित होने का एकमात्र तरीका है।
पॉल

आप nslookup मतलब है? मेरा मतलब वही था। मैं निश्चित होने के लिए एक खोज करना चाहता हूं। मुझे यकीन नहीं है कि 'nslookup' जाने का तरीका है या शायद 'होस्ट' के बजाय या कुछ और?
ग्रेग

ऐसा लगता है कि यह एक उपयोगिता को रोकने के बजाय एक अजगर या पर्ल विधि को लक्षित करने के लिए एक बेहतर विचार हो सकता है। गोले हर समय बदलते हैं, लेकिन पायथन 3 के साथ एक प्रणाली हमेशा एक ही विधि को सही ढंग से चलाएगी, भले ही इसके प्लेटफॉर्म को किस प्लेटफॉर्म पर स्थापित किया गया हो और यह कैसे कॉन्फ़िगर किया गया हो।
फ्रैंक थॉमस

मुझे सिर्फ एक मौजूदा बैश स्क्रिप्ट में इसका उपयोग करने की आवश्यकता है जब एक एरलंग नोड शुरू करना। पायथन या पर्ल पर निर्भरता जोड़ना मेरी राय में एक ओवरकिल होगा।
ग्रेग

जवाबों:


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

ऐसा लगता है कि होस्ट को nslookup से बदला जा सकता है और स्क्रिप्ट बहुत ज्यादा काम करेगी। धन्यवाद।
ग्रेग

1

दुर्भाग्य से, मैं टिप्पणी नहीं कर सकता, लेकिन यह वास्तव में स्वीकृत उत्तर के लिए एक टिप्पणी है: समाधान यह जांच नहीं करता है कि क्या प्रदान की गई तर्क वास्तव में एक FQDN है। सरल होस्ट नाम जिन्हें वास्तव में हल किया जा सकता है वे भी अर्हता प्राप्त करेंगे (सबसे सरल उदाहरण: "लोकलहोस्ट")। तो शायद सवाल का शीर्षक तदनुसार बदला जाना चाहिए, यदि प्रश्न एक fddn के लिए नहीं है, लेकिन केवल एक नाम बदलने के लिए है। वास्तव में समाधान में जोड़ने के लिए: यदि एक fqdn वास्तव में आवश्यक है, तो आप बस दिए गए नाम में एक डॉट के लिए जाँच कर सकते हैं, जैसे:

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

यह अभी भी "लोकलहोस्ट" के लिए अनुमति देगा, लेकिन तकनीकी रूप से एक fqdn, वैसे भी।


अच्छी बात। यह निश्चित रूप से पिछले उत्तर पर सुधार है। यह उत्तर स्वीकृत उत्तर हो सकता है यदि केवल पिछले उत्तर ने मेरी समस्या को हल करने में मेरी मदद नहीं की है :)
ग्रेग

मुझे यह उत्तर भी पसंद है लेकिन क्या यह एक से अधिक के लिए जाँच नहीं करनी चाहिए ""? [[ $hostname == *"."*"."* ]]
जॉनीबी

नहीं। एकल बिंदु सुनिश्चित करना मौजूद है, यह सुनिश्चित करता है कि कोई सादे होस्टनाम प्रदान नहीं किया गया है (पहले से उल्लेख किए गए "लोकलहोस्ट को छोड़कर", जो तकनीकी रूप से लोकलहोस्ट के लिए fqdn है, क्योंकि स्थानीयहोस्ट किसी भी डोमेन से संबंधित नहीं है (रूट लेबल को छोड़कर)। "))। किसी भी स्ट्रिंग में कम से कम एक डॉट संभावित रूप से एक वैध fqdn है। "होस्ट" कमांड का उपयोग सुनिश्चित करता है कि स्ट्रिंग एक आईपी पते पर हल होती है, जिसका अर्थ है कि यह वास्तव में एक fqdn है।
निकोलई एहमैन

0

Hostname के "ndots" विकल्प का उपयोग यह सब एक कमांड में करने के लिए किया जा सकता है:

host -N 0 $hostname

यह /etc/resolv.conf में खोज या डोमेन निर्देश में सूचीबद्ध डोमेन को जोड़ नहीं देगा।

एक उदाहरण के साथ अपडेट करें:

मान लें कि आपके पास एक वैरिएबल "hostname" है, जिसमें एक स्ट्रिंग है, आप जानना चाहते हैं कि क्या स्ट्रिंग FQDN है। सरल "होस्ट" का उपयोग करके यह स्ट्रिंग की कोशिश करेगा और यदि नहीं मिला तो यह "/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

जिसका अर्थ है "www" एक FQDN नहीं है। यदि यह एक FQDN था, तो इसे "होस्ट" द्वारा पाया जाना चाहिए।

एक और अपडेट:

मैं लिनक्स का उपयोग करता हूं, लेकिन यह माना जाता है कि "होस्ट" कमांड फ्रीबीएसडी पर समान है।


FreeBSD पर काम करने के लिए प्रतीत नहीं होता है। क्या आप एक उदाहरण आउटपुट जोड़ सकते हैं ताकि मुझे पता हो कि क्या उम्मीद है?
ग्रेग

0

मैं एक डोमेन नाम को मान्य करने के लिए इसका उपयोग करता हूं।

#!/bin/bash
DOMAIN=example.com    
[ -z "$(dig +short "$DOMAIN")" ]  &&  echo "$DOMAIN could not be looked up"

पाने के लिए dig:

  • डेबियन / उबंटू - apt-get install dnsutils
  • CentOS - yum install bind-utils
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.