Cara mudah untuk mendapatkan alamat IP dari hostname menggunakan shell Unix

12

Apa cara termudah untuk mendapatkan alamat IP dari nama host?

Saya sedang berpikir tentang mencoba pingdan menguraikannya dari output. Namun, itu sepertinya tidak terlalu bagus dan mungkin tidak akan bekerja dengan cara yang sama pada semua sistem.

Saya mencari sedikit di sekitar dan menemukan solusi dengan nslookup, tetapi itu tidak berhasil untuk nama host di /etc/hosts.

Albert
sumber
Saya masih bertanya-tanya sedikit mengapa kerang Unix tidak dianggap sebagai bahasa pemrograman ...
Albert
Karena shell secara tradisional dipandang sebagai scripting, bukan pemrograman;)
Tino

Jawaban:

5

Anda dapat melakukan ini dengan panggilan sistem standar. Berikut ini contoh dalam 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);

menghasilkan output:

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

(Pada baris perintah, skrip yang sama dapat ditulis sebagai perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Anda dapat melakukan hal yang sama dalam bahasa lain - lihat halaman manual untuk panggilan sistem di man -s3 gethostbynamedll.

Eter
sumber
Keren, itu berhasil. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert
Sangat aneh bahwa jawaban ini adalah beberapa kode program ... :) Sepertinya hampir seperti jawaban Stackoverflow. Tidak benar-benar milik Serverfault. Tetapi saya tetap akan menerima jawabannya.
Albert
@Albert: well to be fair: 1. pertanyaan itu diposting pada awalnya SO dan bermigrasi ke SF, dan 2. jenis data yang Anda cari perlu diurai dengan sesuatu ; beberapa orang menganggap Perl bentuk skrip shell yang lebih baik: 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

Edit

Di Linux, (dan beberapa varian OS X, setidaknya), Anda mungkin dapat menggunakan resolveip, yang merupakan bagian dari paket server MySQL:

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

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1
Amber
sumber
Juga tidak berfungsi. (Untuk host di /etc/hosts.) Coba host localhost.
Albert
serv ~ $ host localhost \n localhost has address 127.0.0.1
Hm, yah, tidak di sini. Saya ingin tahu mengapa itu bekerja untuk Anda. Atau mengapa itu tidak cocok untuk saya.
Albert
2
Lihat hasil edit saya - Anda dapat mencoba resolveip.
Hm, resolveiptidak diinstal secara default di Debian saya.
Albert
9

Posting kuno ini tampaknya memiliki banyak solusi kreatif.

Jika saya perlu memastikan juga /etc/hostsdiakses, saya cenderung menggunakannya

getent hosts somehost.com

Ini berfungsi, setidaknya jika `/etc/nsswitch.conf 'telah dikonfigurasi untuk menggunakan file (seperti biasanya).

Janne Pikkarainen
sumber
Bagus, dan bekerja untuk IPv6 juga.
Tino
Dan tidak perlu menginstal syslinux!
Claudiu
Menarik bahwa untuk beberapa IP tidak mengembalikan apa-apa sambil ahostsmengembalikan info multi-line.
akostadinov
7

Untuk IPv4 ada program standar yang bekerja di luar kotak menggunakan resolver termasuk / etc / hosts:

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

Ini adalah bagian dari Debian, instal dengan:

apt-get install syslinux

Untuk protokol lain selain IPv4 (seperti IPv6) saat ini saya tidak tahu alat serupa. Memperbarui: Karena ini saya hanya menulis alat kecil yang mampu menyelesaikan IPv6 juga:

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

Diperkirakan untuk penggunaan shell yang cepat dan kotor seperti gethostiptetapi memungkinkan IPv6, juga:

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

Ini juga dapat digunakan secara interaktif, misalnya:

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

HTH

Tino
sumber
Datang ke sini untuk memberikan jawaban ini, sebagai pengganti Anda.
Tidak Sekarang
3

Nah, solusi saya saat ini:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
Albert
sumber
ini tidak hanya memberikan IP: PING www.l.google.com (72.14.234.104): 56 byte data
Federico klez Culloca
Ya, sepertinya itu sedberperilaku sedikit berbeda pada setiap sistem. :) Menyebalkan sekali. Saya mengubahnya sedikit, saya pikir itu harus bekerja di mana-mana sekarang.
Albert
3

Mengapa tidak dig +short hostname?

(DNS permintaan)

gWaldo
sumber
Itu tidak /etc/hostsmemperhitungkan.
Janne Pikkarainen
DNS seharusnya menjadi sumber pasti untuk Resolusi Nama, dan jika Anda menggunakan file host untuk menimpanya, tidak masalah. Tapi itu sebuah override, bukan definitive ...
gWaldo
Saya tahu, tetapi pertanyaan aslinya ingin / etc / hosts :)
Janne Pikkarainen
tentu saja; pemahaman bacaan saya gagal ...
gWaldo
0

Pada beberapa Unites, yang berikut ini akan berfungsi:

arp <hostname>

Sebagai contoh pada Mac OS X, saya mendapatkan ini:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
ennuikiller
sumber
Yah, ia menemukan entri tetapi hanya mencantumkan MAC-nya, bukan IP-nya. :)
Albert
Ah, arp -n hostnamemenunjukkan IP.
Albert
Hanya saja, cara ini tidak berfungsi untuk server di luar jaringan. : P
Albert
0

Menggunakan ping tidak terlalu buruk karena biasanya Anda tidak memiliki dependensi yang kuat.

Berikut adalah fungsi yang saya gunakan pada sistem Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
Bruno BEAUFILS
sumber
-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap mendapatkan dari subnet Anda (192.168.1.0 atau apa pun) alamat
  • dengan grep dapatkan hanya garis hostname yang Anda cari
  • Dengan sed hanya mendapatkan alamat ip di dalam tanda kurung
Philippe Gachoud
sumber
2
Sedikit info lebih lanjut tentang berbagai sakelar dan alasan penggunaan akan menambah jawaban Anda
Dave M
Setidaknya ada empat alasan mengapa jawaban ini tidak berhasil. Anda membuat asumsi tentang kisaran alamat IP di mana jawabannya akan ditemukan. Itu tidak efisien karena menghasilkan lebih banyak lalu lintas jaringan daripada yang dibutuhkan. Ini hanya berfungsi untuk alamat IP yang merespons probe. Diasumsikan bahwa DNS terbalik berisi pemetaan yang sama persis dengan forward DNS.
kasperd