มีเครื่องมือบรรทัดคำสั่งมาตรฐานเพื่อทำการค้นหาชื่อโฮสต์หรือไม่


0

ฉันอยู่ในเชลล์และฉันต้องการทราบที่อยู่ IP ที่สอดคล้องกันสำหรับชื่อโฮสต์

ฉันรู้ว่าฉันสามารถใช้งานได้ผ่าน Perl, PHP, Python หรือภาษาสคริปต์อื่น ๆ (อาจน่ากลัว!) และนี่จะเป็นวิธีแก้ปัญหาของฉัน แต่ฉันประหลาดใจที่ดูเหมือนว่าจะไม่มีเครื่องมือบรรทัดคำสั่งให้ทำ ไม่มีเสื้อคลุมเรียบง่าย ๆ getaddrinfo().

ฉันผิดหรือเปล่า? มีหรือไม่ host, dig และ getent ไม่ต้องนับฉันต้องการสิ่งที่ใช้ libc และทำตาม /etc/nsswitch.confและสิ่งที่อาจติดตั้งในระบบ (linux) ใด ๆ โดยค่าเริ่มต้น

ย้ายมาที่นี่จาก https://stackoverflow.com/questions/20211326/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup

คำตอบ: ฉันผิด getent ไม่ได้ดูเฉพาะใน /etc/hostsจริง ๆ แล้วมันเป็นการค้นหาที่เหมาะสม

คำตอบ:


3

เครื่องมือดั้งเดิมสำหรับการค้นหาชื่อโฮสต์คือ nslookup จากการโยง แต่มันจะถูกแทนที่ด้วยการขุด เครื่องมือทั้งสองนี้เป็นแบบพิเศษและไม่ใช้ nsswitch โฮสต์ getent ใช้ nsswitch แต่ใช้น้อยกว่ามาก


getent ไม่ใช้ nsswitch โดยจะดูเฉพาะใน hosts ไฟล์, host และ dig ไม่สนใจ hosts ไฟล์.
clacke

จากหน้า man "getent - รับรายการจาก Name Service Switch libraries" และ "hosts เมื่อไม่มีคีย์ให้ใช้ sethostent (3), gethostent (3), และ endhostent (3) เพื่อระบุฐานข้อมูลโฮสต์เมื่อหนึ่งหรือมากกว่านั้น มีการระบุอาร์กิวเมนต์ของคีย์ส่งผ่านแต่ละคีย์ไปยัง gethostbyaddr (3) หรือ gethostby ‐ name2 (3) ขึ้นอยู่กับว่าการเรียกไปยัง inet_pton (3) บ่งชี้ว่าคีย์เป็นที่อยู่ IPv6 หรือ IPv4 หรือไม่ ดังนั้นหากมันล็อคไฟล์โฮสต์นั่นคือวิธีการติดตั้ง nsswitch.conf ของคุณ หากคุณลบไฟล์มันจะไม่
hildred

Oh! ขอบคุณที่ให้ความกระจ่างแก่ฉัน
clacke

Btw หน้าคนนั้นมาจากไหน? หน้า man ของฉันใน Ubuntu นั้นไม่ชัดเจน gathers entries from the specified administrative database using the specified search keys. Where database is one of passwd, group, hosts, services, protocols, or networks. (Ubuntu 12.04, manpage สืบทอดมาจาก Debian Lenny)
clacke

และ RHEL ไม่มี manpage เลย พบคุณที่ linux.die.net/man/1/getent แต่ฉันสงสัยว่าแหล่งที่มาของพวกเขาคืออะไร
clacke

0

getent แน่นอนว่าเป็นเครื่องมือที่เหมาะสมสำหรับงาน แต่น่าเสียดายที่ไม่สามารถใช้ได้ทุกที่หนึ่งในเหตุผลที่เป็นเพราะไม่ได้รับคำสั่งจาก POSIX

ในขณะที่มันไม่ได้ระบุอย่างใดอย่างหนึ่งตามมาตรฐาน arp ไม่น่าเป็นไปได้มากที่จะไม่สามารถใช้งานได้บนเซิร์ฟเวอร์ใด ๆ ที่ทำการจำแนกชื่อ เช่น arp ดังต่อไปนี้ nsswitch.conf การตั้งค่าใช้งานเท่านั้น libcมีอยู่ในระบบ Linux / Unix ใด ๆ และให้ผลลัพธ์ที่ดูเหมือนจะสอดคล้องกันระหว่างการใช้งานการแยกวิเคราะห์ผลลัพธ์จะทำงาน:

$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16

นี่คือฟังก์ชั่นเชลล์ที่ใช้วิธีการนี้หลีกเลี่ยงปัญหากับ Linux arp ซึ่งเปลี่ยนไปใช้รูปแบบเอาต์พุตอื่นในบางกรณี:

resolve()
{
  : ${1:?Usage: resolve name}
  (
    PATH=$PATH:/usr/sbin
    ao=$(arp $1)
    [ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
    echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
  )
}

ฉันยังไม่เห็นการแจกจ่ายแบบอิง glibc ที่ไม่ได้มาพร้อมกับเครื่องมือบรรทัดคำสั่ง glibc ที่ติดตั้ง การกระจายดังกล่าวอาจมีอยู่ แต่ getent เหมาะกับความต้องการของฉันอย่างแน่นอน
clacke

คำถามของคุณถูกตัดออก getent และฉันคิดว่านั่นเป็นเพราะความไม่พร้อมในบางแพลตฟอร์ม Linux ที่คุณกำลังทำงานอยู่ getent ดูเหมือนว่าจะเป็นกระแสหลักที่มีลีนุกซ์รุ่นปัจจุบัน แต่ก็ไม่ใช่กรณีนี้เมื่อหลายปีก่อน ปรากฏตัวครั้งแรกบน Solaris และฉันเชื่อว่า Unix จำนวนมากอยู่นอก Solaris & amp; Linux ที่ใช้ยังคงหายไป getent ด้วยเหตุผลที่ฉันโพสต์
jlliagre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.