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.


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.


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

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).


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


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"

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)


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

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 '()' ; }

-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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.