Pencarian host yang menghormati / etc / hosts

19

Utilitas menyukai hostdan digmembiarkan Anda melihat alamat IP yang sesuai dengan nama host.

Ada juga getentutilitas yang dapat digunakan untuk query /etc/hostsatau database NSS lainnya.

Saya mencari utilitas standar yang nyaman (yang tersedia di Debian, katakanlah) yang menyelesaikan nama host terlepas dari mana ia didefinisikan.

Seharusnya kurang lebih setara dengan

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'
Roman Cheplyaka
sumber
5
Apa yang sebenarnya salah getent?
Patrick
2
Ya, saya tidak berpikir itu bisa lebih mudah daripada mendapatkan.
Bratchley
@ Patrick: hmm, saya tidak menyadari getentjuga terlihat di DNS (saya pikir itu hanya terlihat di /etc/hosts). Sekarang saya sudah mencobanya, inilah yang salah dengan getent: karena google.com, ia mengembalikan satu alamat, dan alamat itu adalah IPv6. Yang tidak membantu, karena saya berada di jaringan IPv4, dan perintah saya sebenarnya akan mencetak alamat IPv4.
Roman Cheplyaka
@RomanCheplyaka - Lihat jawaban eppesuig yang menunjukkan cara menggunakan getent untuk hanya mencari alamat IPv4: unix.stackexchange.com/a/71392/7453
slm

Jawaban:

4

Satu-satunya perintah yang saya tahu melakukan apa yang Anda inginkan adalah resolip:

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

Namun itu hanya dilengkapi dengan mysql-server, yang mungkin tidak ideal untuk dipasang di mana-mana.

Georgyo
sumber
14

Jika masalahnya adalah Anda tidak ingin menyelesaikan nama-nama ini menggunakan ipv6, maka minta getent untuk menggunakan ipv4 saja. Ini akan menghitung semua alamat 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
eppesuig
sumber
Bagi mereka yang ingin melupakan sejarah (yaitu IPv4), gunakan ahostsv6.
Luc tanggal
2
Bagi mereka yang ingin menghindari mempertimbangkan perbedaan antara IPv4 dan IPv6, gunakan getent ahosts google.com.
Mikko Rantalainen
6

Masalahnya adalah ada beberapa API untuk menyelesaikan nama host gethostbyname, getaddrinfodan inet_ptonbeberapa dari mereka dapat mengembalikan lebih dari satu alamat dan / atau Anda dapat menanyakan jenis alamat yang Anda inginkan.

Jika Anda ingin cara portabel untuk mendapatkan satu alamat IPv4, maka mungkin:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com
Stéphane Chazelas
sumber
2

(Jawaban ini hanya berlaku jika Anda melakukan root pada mesin.)

Saya dulu merasa terganggu dengan ini juga, dan kemudian saya standar menjalankan dnsmasq di semua mesin saya. Dnsmasq adalah cache DNS yang ringan. Sebagai manfaat tambahan, ia melayani konten /etc/hostslebih dari DNS.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

gethostip -d name.domaindari syslinuxpaket di Ubuntu (dan mungkin Debian). -dmenghasilkan format desimal.

dan3
sumber
0

Saya menggunakan pengetahuan perl murni saya dan membuat skrip kecil dengan penanganan kesalahan:

/ 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";

Terima kasih kepada Stéphane Chazelas untuk ide awalnya

Daniel Alder
sumber