Unix kabuğu kullanarak ana bilgisayar adından IP adresi almanın kolay yolu


12

Bir ana bilgisayar adından IP adresini almanın en kolay yolu nedir?

pingBirini denemeyi ve çıktıdan ayrıştırmayı düşünüyordum. Ancak, bu çok hoş görünmüyor ve muhtemelen tüm sistemlerde aynı şekilde çalışmayacak.

Biraz araştırdım ve çözüm buldum nslookup, ancak bu ana bilgisayar adları için işe yaramıyor /etc/hosts.


Hala neden Unix kabuklarının programlama dili olarak düşünülmediğini merak ediyorum ...
Albert

Kabuk geleneksel olarak programlama değil, komut dosyası olarak görülür;)
Tino

Yanıtlar:


5

Bunu standart sistem çağrılarıyla yapabilirsiniz. Perl'de bir örnek:

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

çıktı üretir:

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

(Komut satırında, aynı komut dosyası olarak yazılabilir: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)')

Bunu diğer dillerde de benzer şekilde yapabilirsiniz - sistem çağrıları man -s3 gethostbynamevb. İçin man sayfasına bakın .


Harika, işe yarıyor. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert

Bu cevabın bazı program kodu olması çok garip ... :) Neredeyse bir Stackoverflow cevabı gibi görünüyor. Gerçekten Serverfault'a ait değil. Ama yine de cevabı kabul edeceğim.
Albert

@Albert: Adil olmak gerekirse: 1. soru orijinal olarak SO üzerine gönderildi ve SF'ye taşındı ve 2. aradığınız veri türünün bir şeyle ayrıştırılması gerekiyor ; bazı insanlar Perl'i daha iyi bir kabuk betiği olarak görüyor: D
Ether

Diğer sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

host <hostname>

Ör:

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

Düzenle

Linux'ta (ve en azından bazı OS X varyantlarında), resolveipMySQL sunucu paketinin bir parçası olan kullanabilirsiniz :

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

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

Ayrıca çalışmaz. (Toplantı sahipleri için /etc/hosts.) Deneyin host localhost.
Albert

serv ~ $ host localhost \n localhost has address 127.0.0.1

Hm, iyi, burada değil. Bunun neden işe yaradığını merak ediyorum. Ya da neden benim için değil.
Albert

2
Düzenlememe bakın - deneyebilirsiniz resolveip.

Hm, resolveipDebian'ımda varsayılan olarak yüklü değil.
Albert

9

Bu eski yazının birçok yaratıcı çözümü var gibi görünüyor.

Ayrıca /etc/hostserişildiğinden emin olmam gerekirse,

getent hosts somehost.com

Bu, en azından `/etc/nsswitch.conf 'dosyaları kullanmak üzere yapılandırılmışsa (genellikle olduğu gibi) çalışır.


Güzel ve IPv6 için de çalışıyor.
Tino

Ve syslinux kurulumuna gerek yok!
Claudiu

Bazı IP'ler için hiçbir şey ahostsdöndürmezken, çok satırlı bilgi döndürmesi ilginçtir .
akostadinov

7

IPv4 için, / etc / hosts dahil çözümleyiciyi kullanarak kutudan çıkan standart bir program vardır:

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

Debian'ın bir parçasıdır, aşağıdakileri yükleyin:

apt-get install syslinux

IPv4 dışındaki diğer protokoller için (IPv6 gibi) şu anda benzer bir araç bilmiyorum. Güncelleme: Bu nedenle sadece IPv6'yı da çözebilen küçük bir araç yazdım:

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

Hızlı ve kirli bir kabuk kullanımı için düşünülür, gethostipancak IPv6'ya da izin verilir:

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

Ayrıca etkileşimli olarak da kullanılabilir, örneğin:

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

HTH


Bu yanıtı vermek için buraya geldim, yerine oy verdin.
Şimdi Değil

4

Neden olmasın dig +short hostname?

(sorgu DNS)


Dikkate almaz /etc/hosts.
Janne Pikkarainen

DNS, Ad Çözümlemesi için kesin bir kaynak olmalıdır ve geçersiz kılmak için ana bilgisayar dosyasını kullanırsanız, sorun yoktur. Ama bu bir geçersiz kılma, kesin değil ...
gWaldo

Biliyorum, ama asıl soru aranıyor / etc / hosts :)
Janne Pikkarainen

yeterince emin; benim okuduğunu anlama başarısız ...
gWaldo

3

Şu anki çözümüm:

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

bu sadece IP vermez: PING www.l.google.com (72.14.234.104): 56 veri baytı
Federico klez Culloca

Evet, sedher sistemde biraz farklı davranıyor gibi görünüyor . :) Ne kadar can sıkıcı. Biraz değiştirdim, sanırım şimdi her yerde çalışması gerekiyor.
Albert

0

Bazı Unices'te aşağıdakiler çalışır:

arp <hostname>

Örneğin Mac OS X'te şunu alıyorum:

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

Girdiyi bulur, ancak IP'sini değil sadece MAC'ını listeler. :)
Albert

Ah, arp -n hostnameIP'yi gösterir.
Albert

Yalnızca, bu yol ağ dışındaki sunucular için çalışmaz. : P
Albert

0

pingGenel olarak güçlü bağımlılıklarınız olmadığı için kullanmak o kadar da kötü değildir.

İşte Linux sistemlerinde kullandığım fonksiyon:

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 adresinizden (192.168.1.0 veya her neyse) adresinizden alır
  • grep ile sadece aradığınız ana bilgisayar adının satırını alın
  • Sed ile parantez içindeki sadece ip adresini alın

2
Çeşitli anahtarlar ve neden kullanılana biraz daha fazla bilgi cevabınızı ekleyecek
Dave M

Bu cevabın işe yaramamasının en az dört farklı nedeni vardır. Yanıtın bulunacağı IP adresleri aralığı hakkında varsayımlar yaparsınız. Gerektiğinden çok daha fazla ağ trafiği üretmesi nedeniyle verimsizdir. Yalnızca problara yanıt veren IP adresleri için çalışır. Ters DNS'nin, ileri DNS ile tam olarak aynı eşleşmeleri içerdiğini varsayar.
kasperd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.