วิธีที่ง่ายที่สุดในการตรวจสอบว่าสตริงที่กำหนดเป็นชื่อ FQDN ที่ถูกต้องหรือไม่?


1

ฉันต้องการจัดหาอย่างใดอย่างหนึ่ง'-name'หรือ'-sname'เมื่อเริ่มต้น Erlang VM ขึ้นอยู่กับว่าสตริงที่กำหนดเป็นชื่อเต็ม (FQDN) หรือไม่ อะไรจะเป็นวิธีที่รวดเร็วและเป็นอิสระต่อสิ่งแวดล้อมในการตรวจสอบความถูกต้องนั้น ฉันสนใจมากขึ้นในการใช้คำสั่งบางทุบตี (ชอบ'getent'หรือ'nslookup'หรือคนอื่น ๆ ) มากกว่าการแสดงออก regex ดีที่สุดถ้ามันทำงานใน Ubuntu, FreeBSD และ Solaris โดยไม่มีการเปลี่ยนแปลงและสามารถใช้ในการทุบตี'if'ได้อย่างง่ายดาย


สวยมากสตริงใด ๆ สามารถ fqdn ที่ถูกต้องหากมันมีจุดอยู่ในนั้นหรือในตอนท้ายดังนั้นการค้นหาเป็นวิธีเดียวที่จะมั่นใจได้
พอล

คุณหมายถึง nslookup? นั่นคือสิ่งที่ฉันหมายถึง ฉันต้องการค้นหาเพื่อให้แน่ใจ ฉันไม่แน่ใจว่า 'nslookup' เป็นวิธีไปหรืออาจเป็น 'โฮสต์' แทนหรืออย่างอื่น
เกร็ก

ดูเหมือนว่าอาจเป็นการดีกว่าถ้าคุณกำหนดเป้าหมายไปยังวิธีการของ python หรือ perl แทนที่จะทำการ shelling ยูทิลิตี้ เชลล์เปลี่ยนตลอดเวลา แต่ระบบที่มี python3 จะเรียกใช้วิธีการเดียวกันอย่างถูกต้องเสมอโดยไม่คำนึงถึงแพลตฟอร์มที่ติดตั้งไว้และวิธีการกำหนดค่าแพลตฟอร์ม
Frank Thomas

ฉันแค่ต้องใช้มันในสคริปต์ทุบตีที่มีอยู่เมื่อเริ่มต้นโหนด Erlang การเพิ่มการพึ่งพา Python หรือ Perl จะทำให้เกินความคิดของฉัน
เกร็ก

คำตอบ:


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 จริงหรือไม่ ชื่อโฮสต์แบบง่ายที่สามารถแก้ไขได้จริงจะมีคุณสมบัติ (ตัวอย่างที่ง่ายที่สุด: "localhost") ดังนั้นอาจจะเปลี่ยนชื่อของคำถามได้หากคำถามนั้นไม่ใช่คำถามสำหรับ fqdn แต่เพียงเพื่อแก้ไขชื่อ หากต้องการเพิ่มในโซลูชัน: หากจำเป็นต้องใช้ fqdn คุณสามารถตรวจสอบจุดในชื่อที่กำหนดดังนี้:

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

นี้จะยังคงอนุญาตสำหรับ "localhost" แต่นั่นเป็นเทคนิค fqdn ยังไงก็ตาม


จุดดี. นี่เป็นการปรับปรุงคำตอบก่อนหน้านี้อย่างแน่นอน คำตอบนี้อาจเป็นคำตอบที่ได้รับการยอมรับหากคำตอบก่อนหน้านี้ไม่ได้ช่วยฉันแก้ปัญหาของฉันก่อนหน้านี้ :)
Greg

ฉันชอบคำตอบนี้ แต่ไม่ควรตรวจสอบมากกว่าหนึ่ง "."? [[ $hostname == *"."*"."* ]]
johnnyB

ไม่ต้องมีจุดเดียวที่ทำให้มั่นใจได้ว่าไม่มีชื่อโฮสต์แบบธรรมดา (ยกเว้น "localhost" ที่กล่าวถึงแล้วซึ่งเป็นเทคนิค fqdn สำหรับ localhost เนื่องจาก localhost ไม่ได้อยู่ในโดเมนใด ๆ (ยกเว้นสำหรับป้ายชื่อรูท ") ")) สตริงใด ๆ ที่มีจุดอย่างน้อยหนึ่งจุดอาจเป็น fqdn ที่ถูกต้อง การใช้คำสั่ง "host" ทำให้แน่ใจว่าสตริงนั้นได้รับการแก้ไขเป็นที่อยู่ IP ซึ่งหมายความว่าเป็น fqdn จริง ๆ
Nicolai Ehemann

0

ตัวเลือก "ndots" ของชื่อโฮสต์สามารถใช้เพื่อทำทั้งหมดในคำสั่งเดียว:

host -N 0 $hostname

สิ่งนี้จะไม่ผนวกโดเมนที่ระบุในคำสั่งค้นหาหรือโดเมนใน /etc/resolv.conf

อัปเดตด้วยตัวอย่าง:

สมมติว่าคุณมีตัวแปร "ชื่อโฮสต์" ที่มีสตริงคุณต้องการทราบว่าถ้าสตริงนั้นเป็น 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 ควรพบ "โฮสต์"

การปรับปรุงอื่น:

ฉันใช้ Linux แต่สันนิษฐานว่าคำสั่ง "host" เหมือนกับใน FreeBSD


ดูเหมือนจะไม่ทำงานกับ FreeBSD คุณสามารถเพิ่มตัวอย่างผลลัพธ์เพื่อให้ฉันรู้ว่าจะเกิดอะไรขึ้น?
Greg

0

ฉันใช้สิ่งนี้เพื่อตรวจสอบชื่อโดเมน

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

ที่จะได้รับdig:

  • Debian / Ubuntu - apt-get install dnsutils
  • CentOS - yum install bind-utils
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.