Önce / etc / hosts dosyasını kullanarak ana bilgisayar adlarını çözmek için Linux komut satırı yardımcı programı


36

Çözümleme ana bilgisayar adları (birkaç komut satırı yardımcı programları vardır host, dig, nslookup) ancak hepsi kullanmak ad sunucularının genel görünüm uygulamaları ise, münhasıran, /etc/hostsilk (Gethostbyname kullanarak inanıyorum).

Sıradan bir uygulama gibi davranan ana bilgisayar adlarını çözmek için bir komut satırı yardımcı programı var mı /etc/hosts?

(Muhtemelen 3 satır c olacağının farkındayım, ancak biraz taşınabilir bir kabuk betiğinin içinde buna ihtiyacım var.)


Durumunuzu biraz daha açıklayabilir misiniz? Yardımcı awk '/hostname/ { print $1 }' /etc/hostsolur mu?
kuantumların

@quanta Aslında şu anki çözüm, / etc / hosts dosyasında grep / sed magic'dir. Bunu bir geri dönüşle daha genel yapmak istedim.
Zulan

Yanıtlar:


56

Bu kolayca elde edilir getent:

getent hosts 127.0.0.1

getentyapılandırılmış herhangi bir veri türü için arama yapar nsswitch.conf.


Bu, Alpine liman konteynerlerimde digveya benzeri hiçbir mekanizması olmayan kullandığım araç nslookup.
Bruno Bronosky

26

İşe yarar bir araç getent. Böylece kullanabilirsin getent hosts www.google.comya da getent hosts localhost. Name Service Switch konfigürasyonunuzda belirtilen şekilde veritabanlarından girişleri alır /etc/nsswitch.conf.


1
Evet, ancak bu DNS'e geri dönmeyecek.
slowpoison

Hayır, nsswitch.conf sırasına göre çözer.
cjc

@slowpoison, nsswitch config dosyasına bir göz atın. Sistemim files dnsana bilgisayarlar için, yani / etc / hosts dosyasına ve ardından DNS çözümleyicisine başvurdu. Yapılandırmanız farklı olabilir.
Zoredache

@cjc, öyle. Doğru denediğimi sanmıyorum.
slowpoison

@Zoredache, çok etkilendim getent. Bu komuta girdiğiniz için teşekkür ederiz.
saat

8

Bir gethostbyname () (kullanımdan kaldırılmış) sarmalayıcıyı aşağıdaki gibi kullanabilirsiniz:

python -c 'import socket;print socket.gethostbyname("www.google.com")'

Veya aşağıdaki gibi bir getaddrinfo () sargısı:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

Getaddrinfo'nun tüm örnekleri bir liste olarak döndüreceğini unutmayın. Komutun son kısmı sadece ilk grubu seçer. Bu, IPv6 adreslerini de döndürür.


1
Bu işe yarayacak, ama bir süredir kullanılmıyor. Bkz linux.die.net/man/3/gethostbyname .
Kyle Smith

Teşekkürler, bilmiyordum. ;)
Mircea Vutcovici

Olumlu bir oy ver. Başka hiçbir yarı portatif bir astar önerilmemiştir.
user239558

Bunun bir başkası için değerli olması durumunda, birkaç komut satırı seçeneğine sahip bir Python 3 sürümü hazırladım
Chris Adams,

6

resolveip bunu yapacağım.

İşin garibi, RHEL ve Ubuntu'daki mysql-server paketlerinin bir parçası.


6

Getnameinfo adında bir komut dosyası yazmak için [burada en sevdiğiniz dili] kullanabilirsiniz . İkili dosyalar (ping gibi) böyle yapmalı, bu yüzden aynı tedaviyi almanızı sağlıyorsunuz.


6

getent ahostsÖrneğin, kullanın :

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

Tüm IPv4 ve IPv6 adreslerini glibc çözümleyicisi aracılığıyla alırsınız (bu nedenle /etc/hostsilk önce genellikle yapılandırıldığı gibi kullanılır /etc/nsswitch.conf).

Kullanmayın getent hosts, çünkü size IPv6 veya IPv4 adreslerini verir (her ikisi de değil) ve seçilen protokol çalışmayanlardan biri olmayabilir. Aslında IPv6 adresleri genellikle tercih edilir, ancak bazı yerlerde IPv6 verileri yönlendiriciler tarafından filtrelenir (desteklenmez).


3

"gethostbyname" komut satırı sürümü :

#!/usr/bin/perl
use Socket;

$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));

$packed_ip = gethostbyname($host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$host not found\n";
    exit 1
}

2

Gerçekten sahte olabilir ve kullanabilirsiniz arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

ama bu gerçekten çirkin olurdu, bu yüzden bunu yapmamalısın.


2

getent hostskırılmış, bozulmuş. IPv6 adreslerini tercih eder, gai.confipv4'ü tercih edecek şekilde yapılandırılmalıdır, ancak ....

Perl gethostbyname, önceliği/etc/nsswitch.conf

hosts: files dns

Yani bu işler getent hostsbenim için çalışmalı.

Ayrıca:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

çalışmalı.


5
Kırık değil, sadece (/etc/gai.conf okur) getaddrinfo kullanmaz. Getaddrinfo kullanmak için çalıştırın getent ahosts.
craig65535

1

Bunu dene:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`host hostname | awk '/hostname has address/ { print $4 }'`
fi

-1

Aşağıdaki komut, doğrudan DNS sunucusu araması üzerinden DNS / etc / hosts aracılığıyla arama gerçekleştirir.

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

Bu komut bir etki alanına (bu durumda, google.com) 2 saniyelik bir bekleme zaman aşımıyla bir kez ping yapmaya çalışacak, "PING google.com (216.58.199.36) 56 (84 "bayt veri", sonra ilk parantez kümesini algılamak ve içinde aradığımız IP adresi olan verileri çıkarmak için Akış Düzenleyicisi'ni (sed) kullanın.

Not: URL'de parantez (aka dairesel parantez) varsa, regex ifadesi işe yaramaz, ancak bu nadir bir durum olur.

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.