ยูทิลิตี้บรรทัดคำสั่ง Linux เพื่อแก้ไขชื่อโฮสต์โดยใช้ / etc / hosts ก่อน


36

มีสาธารณูปโภคบรรทัดคำสั่งหลายอย่างเพื่อแก้ไขชื่อโฮสต์ (มีhost, dig, nslookup) แต่พวกเขาทั้งหมดเซิร์ฟเวอร์ใช้งานเฉพาะในขณะที่การใช้งานในลักษณะทั่วไป/etc/hostsเป็นครั้งแรก (ใช้ gethostbyname ผมเชื่อว่า)

มียูทิลิตีบรรทัดคำสั่งเพื่อแก้ไขชื่อโฮสต์ที่ทำงานเหมือนกับแอปพลิเคชันทั่วไปหรือไม่ดังนั้นจึงต้องค้นหาชื่อ/etc/hostsก่อนแล้วจึงถามชื่อเซิร์ฟเวอร์หรือไม่

(ฉันรู้ว่ามันอาจจะเป็น 3 บรรทัดของ c แต่ฉันต้องการมันในสคริปต์เชลล์แบบพกพา)


คุณช่วยอธิบายสถานการณ์ของคุณให้มากกว่านี้หน่อยได้ไหม? ไม่awk '/hostname/ { print $1 }' /etc/hostsช่วยเหลือ?
quanta

@quanta ที่จริงแล้วทางออกปัจจุบันคือ grep / sed magic บน / etc / hosts ฉันต้องการทำให้เป็นเรื่องทั่วไปมากขึ้นด้วยทางเลือก
Zulan

คำตอบ:


56

นี่คือความสำเร็จได้อย่างง่ายดายด้วยgetent:

getent hosts 127.0.0.1

getentจะทำการค้นหาสำหรับประเภทของข้อมูลใด ๆ nsswitch.confการกำหนดค่าใน


นี้เป็นเครื่องมือที่ผมใช้ในภาชนะบรรจุที่นักเทียบท่าอัลไพน์ของฉันที่มีไม่มีกลไกอื่น ๆ เช่นหรือdig nslookup
Bruno Bronosky

26

getentเครื่องมือหนึ่งที่จะทำงานเป็น เพื่อให้คุณสามารถใช้หรือgetent hosts www.google.com getent hosts localhostมันจะดึงรายการจากฐานข้อมูลตามที่ระบุไว้ในการกำหนดค่าการสลับชื่อบริการของ/etc/nsswitch.confคุณ


1
ใช่ แต่นั่นจะไม่ถอยบน DNS
slowpoison

ไม่มันแก้ไขได้ในลำดับ nsswitch.conf
cjc

@slowpoison ลองดูการกำหนดค่า nsswitch ของคุณ ระบบของฉันมีfiles dnsสำหรับโฮสต์ซึ่งหมายถึง / etc / hosts ได้รับการพิจารณาจากนั้นจึงใช้ตัวแก้ไข DNS การกำหนดค่าของคุณอาจแตกต่างกัน
Zoredache

@cjc มันทำ ฉันไม่คิดว่าฉันพยายามอย่างถูกต้อง
slowpoison

@Zoredache getentผมประทับใจมากกับ ขอบคุณสำหรับคำแนะนำสำหรับคำสั่งนี้
slowpoison

8

คุณสามารถใช้กระดาษห่อ gethostbyname () (คัดค้าน) เช่น:

python -c 'import socket;print socket.gethostbyname("www.google.com")'

หรือเสื้อคลุม getaddrinfo () เช่น:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

โปรดทราบว่า getaddrinfo จะส่งคืนอินสแตนซ์ทั้งหมดเป็นรายการ ส่วนสุดท้ายของคำสั่งเลือกเฉพาะอันดับแรก สิ่งนี้สามารถส่งคืนที่อยู่ IPv6 ได้


1
สิ่งนี้จะใช้งานได้ แต่ล้าสมัยไประยะหนึ่งแล้ว ดูlinux.die.net/man/3/gethostbyname
Kyle Smith

ขอบคุณฉันไม่รู้เกี่ยวกับเรื่องนี้ ;)
Mircea Vutcovici

มี upvote ไม่มีการเสนอสายการบินหนึ่งซับรองแบบพกพาอื่น ๆ
user239558

ในกรณีนี้เป็นสิ่งที่มีค่าสำหรับคนอื่น ๆ ฉันได้สร้าง Python 3 เวอร์ชันพร้อมตัวเลือกบรรทัดคำสั่งบางตัว: github.com/acdha/unix_tools/blob/master/bin/getaddrinfo
Chris Adams

6

resolveip จะทำเช่นนี้

มันเป็นส่วนหนึ่งของแพ็คเกจ mysql-server บน RHEL และ Ubuntu


6

คุณสามารถใช้ [ภาษาที่คุณชื่นชอบที่นี่] การเขียนสคริปต์ที่โทรgetnameinfo นั่นคือวิธีที่ไบนารี (เช่น ping) ควรทำเช่นนั้นดังนั้นคุณจึงมั่นใจได้ว่าคุณจะได้รับการรักษาแบบเดียวกัน


6

ใช้getent ahostsตัวอย่างเช่น:

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

คุณจะได้รับที่อยู่ IPv4 และ IPv6 ทั้งหมดผ่านทางตัวแก้ไข glibc (ซึ่งจะใช้/etc/hostsก่อนตามที่ได้รับการกำหนดค่าตามปกติ/etc/nsswitch.conf)

อย่าใช้getent hostsเนื่องจากจะให้ที่อยู่ IPv6 หรือ IPv4 (ไม่ใช่ทั้งสองอย่าง) และโปรโตคอลที่เลือกอาจไม่ใช่ที่ใช้งานไม่ได้ โดยทั่วไปแล้วจะต้องการที่อยู่ IPv6 แต่ในบางสถานที่เราเตอร์จะกรองข้อมูล IPv6 (ไม่รองรับ)



2

คุณอาจแฮ็คจริงๆและใช้arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

แต่นั่นน่าเกลียดจริง ๆ ดังนั้นคุณไม่ควรทำอย่างนั้น


2

getent hostsเสีย มันชอบที่อยู่ IPv6 gai.confควรกำหนดค่าให้ชอบ ipv4 แต่ ....

Perl gethostbynameใช้สิ่งที่สำคัญกว่า/etc/nsswitch.conf

hosts: files dns

ดังนั้นงานนี้getent hostsควรจะเหมาะกับฉัน

นอกจากนี้:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

ควรทำงาน.


5
มันไม่แตกมันแค่ไม่ใช้ getaddrinfo (ซึ่งอ่าน /etc/gai.conf) หากต้องการใช้ getaddrinfo getent ahostsวิ่ง
craig65535


-1

คำสั่งต่อไปนี้จะทำการค้นหาผ่าน DNS / etc / hosts ผ่านการค้นหาเซิร์ฟเวอร์ DNS โดยตรง

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

คำสั่งนี้จะพยายาม ping โดเมน (ในกรณีนี้ google.com) หนึ่งครั้งด้วยการรอเวลา 2 วินาทีรับบรรทัดแรกของคำสั่ง PING ซึ่งจะระบุว่า "PING google.com (216.58.199.36) 56 (84) ) ไบต์ของข้อมูล "จากนั้นใช้ Stream Editor (sed) เพื่อตรวจสอบชุดแรกของวงเล็บและแยกข้อมูลที่อยู่ภายในซึ่งเป็นที่อยู่ IP ที่เรากำลังมองหา

หมายเหตุ: นิพจน์ regex จะไม่ทำงานหากมีวงเล็บ (หรือที่รู้จักว่าวงเล็บเหลี่ยม) ใน URL แต่นี่จะเป็นกรณีที่ไม่ค่อยเกิดขึ้น

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