Tra cứu máy chủ tôn trọng / etc / hosts


19

Các tiện ích thích hostdigcho phép bạn xem địa chỉ IP tương ứng với tên máy chủ.

Ngoài ra còn có getenttiện ích có thể được sử dụng để truy vấn /etc/hostshoặc cơ sở dữ liệu NSS khác.

Tôi đang tìm kiếm một tiện ích tiêu chuẩn tiện lợi (có sẵn trong Debian), giải quyết một tên máy chủ bất kể nó được định nghĩa ở đâu.

Nó nên ít nhiều tương đương với

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'

5
Chính xác thì điều gì là sai getent?
Patrick

2
Vâng, tôi không nghĩ nó có thể thuận tiện hơn getent.
Bratchley

@Patrick: hmm, tôi không nhận ra getentDNS cũng vậy (tôi nghĩ nó chỉ nhìn vào /etc/hosts). Bây giờ tôi đã thử nó, đây là những gì sai với getent: vì google.com, nó trả về một địa chỉ duy nhất và địa chỉ đó là IPv6. Điều này không hữu ích, vì tôi đang sử dụng mạng IPv4 và lệnh của tôi thực sự sẽ in một địa chỉ IPv4.
Roman Cheplyaka

@RomanCheplyaka - Xem câu trả lời của eppesuig chỉ ra cách sử dụng getent để chỉ tìm địa chỉ IPv4: unix.stackexchange.com/a/71392/7453
slm

Câu trả lời:


4

Lệnh duy nhất mà tôi biết rằng thực hiện những gì bạn muốn là giải quyết:

http://linux.die.net/man/1/resolveip

Tuy nhiên, nó chỉ đi kèm với máy chủ mysql, có thể không lý tưởng để cài đặt ở mọi nơi.


14

Nếu vấn đề là bạn không muốn giải quyết các tên này bằng ipv6, thì chỉ cần yêu cầu getent sử dụng ipv4 mà thôi. Điều này sẽ liệt kê tất cả các địa chỉ ipv4:

giuseppe@blatta:~$ getent ahostsv4 www.google.com | cut -d' ' -f1 | sort -u
173.194.40.80
173.194.40.81
173.194.40.82
173.194.40.83
173.194.40.84

Đối với những người quan tâm đến việc quên lịch sử (ví dụ: IPv4), hãy sử dụng ahostsv6.
Luc

2
Đối với những người muốn tránh xem xét sự khác biệt giữa IPv4 và IPv6, hãy sử dụng getent ahosts google.com.
Mikko Rantalainen

6

Vấn đề là có một số các API để tên quyết tâm máy chủ như gethostbyname, getaddrinfoinet_ptonvà một số người có thể trả về nhiều hơn một địa chỉ và / hoặc bạn có thể truy vấn các loại địa chỉ mà bạn muốn.

Nếu bạn muốn một cách di động để có được một địa chỉ IPv4, thì có thể:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com

2

(Câu trả lời này chỉ áp dụng nếu bạn đã root trên máy.)

Tôi cũng từng bị làm phiền bởi điều này, và sau đó tôi đã chuẩn hóa việc chạy dnsmasq trên tất cả các máy của mình. Dnsmasq là một bộ đệm DNS nhẹ. Là một lợi ích phụ, nó phục vụ nội dung của /etc/hostsDNS.


2

gethostip -d name.domaintừ syslinuxgói trên Ubuntu (và có lẽ là Debian). -dđầu ra định dạng thập phân.


0

Tôi đã sử dụng kiến ​​thức perl thuần túy của mình và tạo một tập lệnh nhỏ với xử lý lỗi:

/ usr / local / bin / gethostip:

#!/usr/bin/perl

# inspired by: /unix/71379/host-lookup-that-respects-etc-hosts#71393

use strict;
use Socket;

my $name = $ARGV[0];
if ($name eq '') {
  print STDERR "Usage: gethostip <hostname>\n";
  exit 1;
}
my $ip = inet_aton($name);
die("Unable to resolve host name $name") if ($ip eq '');
my $ipstr = inet_ntoa($ip);
print "$ipstr\n";

Thx đến Stéphane Chazelas cho ý tưởng ban đầu

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.