Cách dễ dàng để lấy địa chỉ IP từ tên máy chủ bằng cách sử dụng shell Unix


12

Cách dễ nhất để lấy địa chỉ IP từ tên máy chủ là gì?

Tôi đã suy nghĩ về việc thử một pingvà phân tích nó từ đầu ra. Tuy nhiên, điều đó có vẻ không hay lắm và có lẽ sẽ không hoạt động theo cùng một cách trên tất cả các hệ thống.

Tôi đã tìm kiếm một chút xung quanh và tìm thấy giải pháp với nslookup, nhưng nó không hoạt động cho tên máy chủ lưu trữ /etc/hosts.


Tôi vẫn tự hỏi một chút tại sao shell Unix không được coi là ngôn ngữ lập trình ...
Albert

Bởi vì shell truyền thống được xem là kịch bản, không phải lập trình;)
Tino

Câu trả lời:


5

Bạn có thể làm điều này với các cuộc gọi hệ thống tiêu chuẩn. Đây là một ví dụ trong 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);

tạo ra đầu ra:

$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'
        ];

(Trên dòng lệnh, tập lệnh tương tự có thể được viết là perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Bạn có thể làm điều này tương tự trong các ngôn ngữ khác - xem trang hướng dẫn cho các cuộc gọi hệ thống tại, man -s3 gethostbynamev.v.


Thật tuyệt, thật tuyệt. Đặc biệt , perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert

Rất lạ khi câu trả lời này là một số mã chương trình ... :) Trông gần giống như một câu trả lời Stackoverflow. Không thực sự thuộc về Serverfault. Nhưng dù sao tôi cũng sẽ chấp nhận câu trả lời.
Albert

@Albert: cũng phải công bằng: 1. câu hỏi đã được đăng trên SO ban đầu và được chuyển sang SF và 2. loại dữ liệu bạn đang tìm kiếm cần được phân tích cú pháp bằng một cái gì đó ; một số người coi Perl là một dạng kịch bản shell tốt hơn: D
Ether

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

11

host <hostname>

Ví dụ:

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

Biên tập

Trên Linux, (ít nhất là một số biến thể OS X), bạn có thể sử dụng resolveip, đây là một phần của gói máy chủ MySQL:

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

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

Cũng không hoạt động. (Đối với máy chủ lưu trữ /etc/hosts.) Hãy thử host localhost.
Albert

serv ~ $ host localhost \n localhost has address 127.0.0.1

Hừm, không phải ở đây. Tôi tò mò tại sao điều đó làm việc cho bạn. Hoặc tại sao nó không dành cho tôi.
Albert

2
Xem chỉnh sửa của tôi - bạn có thể thử resolveip.

Hừm, resolveipkhông được cài đặt theo mặc định trên Debian của tôi.
Albert

9

Bài viết cổ này dường như có nhiều giải pháp sáng tạo.

Nếu tôi cần chắc chắn cũng /etc/hostsđược truy cập, tôi có xu hướng sử dụng

getent hosts somehost.com

Điều này hoạt động, ít nhất là nếu `/etc/nsswitch.conf 'đã được cấu hình để sử dụng các tệp (như thường lệ).


Đẹp, và hoạt động cho IPv6, quá.
Tino

Và không cần cài đặt syslinux!
Claudiu

Điều thú vị là đối với một số IP, nó không trả về gì trong khi ahoststrả về thông tin nhiều dòng.
akostadinov

7

Đối với IPv4, có một chương trình tiêu chuẩn hoạt động bên ngoài hộp bằng cách sử dụng trình phân giải bao gồm / etc / hosts:

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

Nó là một phần của Debian, cài đặt nó với:

apt-get install syslinux

Đối với các giao thức khác ngoài IPv4 (như IPv6) hiện tại tôi không biết một công cụ tương tự. Cập nhật: Vì điều này tôi chỉ viết một công cụ nhỏ có khả năng giải quyết IPv6:

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

Người ta nghĩ rằng việc sử dụng shell nhanh và bẩn cũng như gethostipcho phép IPv6:

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

Nó cũng có thể được sử dụng tương tác, ví dụ:

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

HTH


Đến đây để đưa ra câu trả lời này, thay vào đó bạn đã bình chọn.
Không phải bây giờ

3

Vâng, giải pháp hiện tại của tôi:

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

điều này không chỉ cung cấp IP: PING www.l.google.com (72,14.234.104): 56 byte dữ liệu
Federico klez Culloca

Phải, dường như sedhành xử hơi khác nhau trên mỗi hệ thống. :) Thật khó chịu. Tôi đã thay đổi nó một chút, tôi nghĩ rằng nó nên hoạt động ở mọi nơi bây giờ.
Albert

3

Tại sao không dig +short hostname?

(DNS truy vấn)


Nó không tính /etc/hostsđến.
Janne Pikkarainen

DNS được coi là một nguồn chính xác cho Độ phân giải tên và nếu bạn sử dụng tệp máy chủ để ghi đè, điều đó tốt. Nhưng đó là một ghi đè, không dứt khoát ...
gWaldo

Tôi biết, nhưng câu hỏi ban đầu muốn / etc / hosts :)
Janne Pikkarainen

đảm bảo đủ; khả năng đọc hiểu của tôi thất bại ...
gWaldo

0

Trên một số Unices, phần sau sẽ hoạt động:

arp <hostname>

Ví dụ: trên Mac OS X, tôi nhận được điều này:

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

Vâng, nó tìm thấy mục nhưng nó chỉ liệt kê MAC của nó, không phải IP của nó. :)
Albert

Ah, arp -n hostnamehiển thị IP.
Albert

Chỉ, cách này không hoạt động cho các máy chủ bên ngoài mạng. : P
Albert

0

Sử dụng ping không phải là xấu vì bạn thường không có bất kỳ sự phụ thuộc mạnh mẽ.

Đây là chức năng tôi đã sử dụng trên các hệ thống 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 lấy từ mạng con của bạn (192.168.1.0 hoặc bất cứ điều gì) các địa chỉ
  • với grep chỉ nhận được dòng của tên máy chủ bạn đang tìm kiếm
  • Với sed chỉ nhận địa chỉ IP bên trong dấu ngoặc đơn

2
Thông tin thêm một chút về các công tắc khác nhau và lý do được sử dụng sẽ thêm vào câu trả lời của bạn
Dave M

Có ít nhất bốn lý do khác nhau khiến câu trả lời này không hiệu quả. Bạn đưa ra các giả định về phạm vi địa chỉ IP trong đó câu trả lời sẽ được tìm thấy. Đó là không hiệu quả do sản xuất lưu lượng mạng nhiều hơn mức cần thiết. Nó chỉ hoạt động cho các địa chỉ IP đáp ứng với các đầu dò. Nó giả sử DNS ngược chứa các ánh xạ chính xác giống như DNS chuyển tiếp.
kasperd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.