วิธีง่ายๆในการรับที่อยู่ IP จากชื่อโฮสต์โดยใช้ Unix shell


12

วิธีที่ง่ายที่สุดในการรับที่อยู่ IP จากชื่อโฮสต์คืออะไร

ฉันคิดเกี่ยวกับการลองpingและแยกวิเคราะห์จากผลลัพธ์ อย่างไรก็ตามนั่นไม่ได้ดูดีมากและอาจไม่ทำงานเหมือนกันในทุกระบบ

ฉันค้นหาบิตไปรอบ ๆ และพบกับการแก้ปัญหาแต่ที่ไม่ได้ทำงานในชื่อโฮสต์nslookup/etc/hosts


ผมยังสงสัยเล็กน้อยว่าทำไมหอย Unix จะไม่ได้รับการพิจารณาเป็นภาษาโปรแกรม ...
อัลเบิร์

เนื่องจากเชลล์ถูกมองว่าเป็นสคริปต์ไม่ใช่การเขียนโปรแกรม;)
Tino

คำตอบ:


5

คุณสามารถทำได้ด้วยการเรียกระบบมาตรฐาน นี่คือตัวอย่างใน Perl:

use strict; use warnings;
use Socket;
use Data::Dumper;

my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);

ผลิตผลลัพธ์:

$VAR1 = [
          '74.125.127.104',
          '74.125.127.103',
          '74.125.127.105',
          '74.125.127.106',
          '74.125.127.147',
          '74.125.127.99'
        ];

(ในบรรทัดคำสั่งสคริปต์เดียวกันสามารถเขียนเป็น: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)')

คุณสามารถทำได้เช่นเดียวกันในภาษาอื่น ๆ - ดู man page สำหรับการโทรของระบบที่man -s3 gethostbynameเป็นต้น


เจ๋งนั่นมันใช้ได้ Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
อัลเบิร์ต

แปลกมากที่คำตอบนี้เป็นรหัสโปรแกรม ... :) ดูเหมือนกับคำตอบของ Stackoverflow ไม่ได้อยู่ใน Serverfault จริง ๆ แต่ฉันจะยอมรับคำตอบต่อไป
อัลเบิร์ต

@Albert: ดีเพื่อความเป็นธรรม: 1. คำถามที่ถูกโพสต์ SO เดิมและย้ายไปยังเอสเอฟและ 2. ชนิดของข้อมูลที่คุณกำลังมองสำหรับความต้องการที่จะแยกวิเคราะห์กับบางสิ่งบางอย่าง ; บางคนคิดว่า Perl เป็นเชลล์สคริปต์ที่ดีกว่า: D
Ether

@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

host <hostname>

Ex:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211

แก้ไข

บน Linux (และ OS X บางรุ่นอย่างน้อย) คุณอาจสามารถใช้resolveipซึ่งเป็นส่วนหนึ่งของแพ็คเกจเซิร์ฟเวอร์ MySQL:

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

ยังใช้งานไม่ได้ (สำหรับโฮสต์ใน/etc/hosts.) host localhostลอง
อัลเบิร์ต

serv ~ $ host localhost \n localhost has address 127.0.0.1

หืมไม่อยู่ที่นี่ ฉันอยากรู้ว่าทำไมมันถึงได้ผลสำหรับคุณ หรือทำไมมันไม่เหมาะกับฉัน
อัลเบิร์ต

2
เห็นการแก้ไขของฉัน - resolveipคุณอาจลอง

อืมresolveipไม่ได้ติดตั้งเป็นค่าเริ่มต้นใน Debian ของฉัน
อัลเบิร์ต

9

โพสต์โบราณนี้ดูเหมือนจะมีทางออกที่สร้างสรรค์มากมาย

หากฉันต้องการให้แน่ใจว่า/etc/hostsจะสามารถเข้าถึงได้ฉันก็มักจะใช้

getent hosts somehost.com

ทำงานได้อย่างน้อยถ้า `/etc/nsswitch.conf 'ได้รับการกำหนดค่าให้ใช้ไฟล์ (ตามปกติ)


เป็นคนดีและใช้ได้กับ IPv6 ด้วย
Tino

และไม่จำเป็นต้องติดตั้ง syslinux!
Claudiu

น่าสนใจว่าสำหรับ IP บางตัวมันจะไม่ส่งคืนอะไรเลยในขณะที่ahostsส่งคืนข้อมูลหลายสาย
akostadinov

7

สำหรับ IPv4 มีโปรแกรมมาตรฐานที่ทำงานนอกกรอบโดยใช้โปรแกรมแก้ไขรวมถึง / etc / hosts:

host="localhost"
ip="`gethostip -d "$host"`"

มันเป็นส่วนหนึ่งของ Debian ติดตั้งด้วย:

apt-get install syslinux

สำหรับโปรโตคอลอื่น ๆ ที่ไม่ใช่ IPv4 (เช่น IPv6) ในปัจจุบันฉันไม่รู้จักเครื่องมือที่คล้ายกัน อัปเดต: ด้วยเหตุนี้ฉันเพิ่งเขียนเครื่องมือขนาดเล็กที่สามารถแก้ไข IPv6 ได้เช่นกัน:

https://github.com/hilbix/misc/blob/master/src/ipof.c

มันเป็นความคิดสำหรับการใช้งานเชลล์ที่รวดเร็วและสกปรกgethostipแต่อนุญาตให้ใช้ IPv6 ได้เช่นกัน:

ip="`ipof -6 -- heise.de`"

นอกจากนี้ยังสามารถใช้แบบโต้ตอบตัวอย่างเช่น:

ipof -a -d -x -v -h -

HTH


มาที่นี่เพื่อให้คำตอบนี้โหวตให้คุณแทน
ไม่ใช่ตอนนี้

4

ทำไมไม่dig +short hostname?

(สืบค้น DNS)


มันไม่ได้คำนึง/etc/hostsถึง
Janne Pikkarainen

DNS ควรจะเป็นแหล่งที่มาที่ชัดเจนสำหรับการจำแนกชื่อและถ้าคุณใช้ไฟล์โฮสต์เพื่อแทนที่มันก็ใช้ได้ แต่นั่นคือการแทนที่ไม่ชัดเจน ...
gWaldo

ฉันรู้ แต่คำถามเดิมอยาก / etc / hosts :)
เจนส์ Pikkarainen

นั่นเองค่ะ ความเข้าใจในการอ่านของฉันล้มเหลว ...
gWaldo

3

ทางแก้ปัญหาปัจจุบันของฉัน:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"

สิ่งนี้ไม่ได้ให้เฉพาะ IP: PING www.l.google.com (72.14.234.104): 56 ไบต์ข้อมูล
Federico klez Culloca

ใช่ดูเหมือนว่าsedจะมีความแตกต่างกันเล็กน้อยในแต่ละระบบ :) ช่างน่ารำคาญจริงๆ ฉันเปลี่ยนมันเล็กน้อยฉันคิดว่ามันน่าจะใช้ได้ทุกที่ตอนนี้
อัลเบิร์ต

0

ในบาง Unices สิ่งต่อไปนี้จะใช้ได้:

arp <hostname>

เช่นใน Mac OS X ฉันได้รับสิ่งนี้:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry

มันเจอรายการ แต่มันแสดงเฉพาะ MAC ไม่ใช่ IP :)
อัลเบิร์ต

อ่าarp -n hostnameแสดง IP
อัลเบิร์ต

วิธีนี้ใช้ไม่ได้กับเซิร์ฟเวอร์ที่อยู่นอกเครือข่ายเท่านั้น : P
Albert

0

การใช้pingไม่ได้เลวร้ายเพราะโดยทั่วไปคุณไม่มีการพึ่งพาที่แข็งแกร่ง

นี่คือฟังก์ชั่นที่ฉันใช้กับระบบ Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }

-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap ได้รับจากซับเน็ตของคุณ (192.168.1.0 หรืออะไรก็ตาม) ที่อยู่
  • ด้วย grep จะได้รับเฉพาะชื่อโฮสต์ที่คุณต้องการ
  • ด้วย sed จะได้รับเฉพาะที่อยู่ IP ภายในวงเล็บ

2
ข้อมูลเพิ่มเติมเกี่ยวกับสวิตช์ต่าง ๆ และทำไมการใช้จะเพิ่มเข้าไปในคำตอบของคุณ
Dave M

มีอย่างน้อยสี่เหตุผลที่แตกต่างกันว่าทำไมคำตอบนี้จะไม่ทำงาน คุณตั้งสมมติฐานเกี่ยวกับช่วงของที่อยู่ IP ที่จะพบคำตอบ มันไม่มีประสิทธิภาพเนื่องจากการผลิตเครือข่ายจำนวนมากเกินความจำเป็น ใช้งานได้เฉพาะที่อยู่ IP ที่ตอบสนองต่อโพรบ มันจะถือว่า DNS ย้อนกลับมีการแมปที่แน่นอนเช่นเดียวกับ DNS ข้างหน้า
kasperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.