Jak mogę rozwiązać nazwę hosta na adres IP w skrypcie Bash?

416

Jaki jest najbardziej zwięzły sposób rozwiązania nazwy hosta na adres IP w skrypcie Bash? Używam Arch Linux .

Eugene Yarmash
źródło
21
Szkoda, że getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>odpowiedź jest gdzieś u dołu. Jest najprostszy, nie wymaga żadnych dodatkowych pakietów i jest łatwiejszy do analizy ze skryptu Bash.
0xC0000022L,
1
@ 0xC0000022L: Nowy wstyd jest, że odpowiedź sugeruje getent hosts somehost, gdy uruchomienie tego czasu nasomehost będzie produkować adres IPv6 , który różni się od tego, jak większość innych narzędzi ( ping, sshprzynajmniej) rozpoznawania nazw i łamie pewne rzeczy. Użyj ahostszamiast hosts.
j_random_hacker
@j_random_hacker: kto powstrzymuje Cię przed żądaniem adresów IPv4 ( ahostsv4) lub IPv6 ( ahostsv6)? Osobiście nie znajduję nic złego w nieokreślonym żądaniu zwracającym IPv6. Twój kod powinien być przygotowany. IPv6 istnieje już od ponad 20 lat.
0xC0000022L
@ 0xC0000022L: Nikt mnie „nie powstrzymuje” od zrobienia tego, ale odpowiedź wyraźnie to sugeruje hosts, a jak dotąd 4 osoby pozytywnie oceniły komentarz vinc17 wyrażający ból spowodowany przez „nagle IPv6”. Przygotowanie do IPv6 nie zawsze jest problemem: wiele programów potrzebuje sposobu, aby ustalić, czy dwie nazwy / adresy odnoszą się do tego samego hosta. Mogą albo użyć prostego dopasowania łańcucha, albo muszą dużo wiedzieć o sieci, aby znaleźć „prawdziwą” odpowiedź. To ostatnie jest polem minowym, więc wiele programów i systemów innych firm - nad którymi nie mam kontroli - używa tych pierwszych.
j_random_hacker

Odpowiedzi:

533

Możesz użyć getent, który pochodzi z glibc(więc prawie na pewno masz go w systemie Linux). To rozwiązuje się za pomocą gethostbyaddr / gethostbyname2, a więc również sprawdzi /etc/hosts/ NIS / etc:

getent hosts unix.stackexchange.com | awk '{ print $1 }'

Albo, jak powiedział Heinzi poniżej, można korzystać digz +shortargumentu (serwerów DNS zapytań bezpośrednio, nie patrzy w /etc/hosts/ etc / NSS):

dig +short unix.stackexchange.com

Jeśli dig +shortjest niedostępny, jeden z poniższych powinien działać. Wszystkie te zapytania DNS bezpośrednio i ignorują inne sposoby rozwiązania:

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

Jeśli chcesz wydrukować tylko jeden adres IP, dodaj exitpolecenie do awkprzepływu pracy.

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'
Chris Down
źródło
2
Domyślnie użycie dig działa tylko z ipv4, gdzie host daje odpowiedzi zarówno na ipv4, jak i ipv6. To może być nieoczekiwane. Można spróbować host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com.
jfg956,
6
DIG nie działa, jeśli jest CNAME, nie zwróci adresu IP.
sorin
4
Czasami hostmoże zostać przekroczony limit czasu i nic nie zwraca. W przypadku niektórych domen dig +shortmoże zwracać alias domeny w pierwszym wierszu. Tak więc, aby upewnić się, że wyjście to adres IPv4, użyj dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao
9
Używanie getent hosts <host>jest nieprawidłowe, ponieważ może na przykład dać adres IPv6, podczas gdy IPv6 nie działa. Prawidłowym rozwiązaniem jest getent ahosts <host>wypróbowanie zarówno IPv6, jak i IPv4 w razie potrzeby.
vinc17
5
Warto wspomnieć: wydaje się, że host, dig i nslookup bezpośrednio komunikują się z serwerami wymienionymi w resolv.conf, podczas gdy „getent hosts” szanują zarówno plik lokalnego hosta, jak i buforowanie na poziomie biblioteki (takie jak nscd), jeśli jest włączone.
Saustrup,
141

Wraz hostz dnsutils opakowaniu:

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

( Poprawiona nazwa pakietu zgodnie z komentarzami. Uwaga: inne dystrybucje mają hostróżne pakiety: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

człowiek w pracy
źródło
4
Miałeś na myśli dnsutils ? W każdym razie hostdziałało dobrze, dzięki
Eugene Yarmash
Pewnie masz rację. Nie mam tutaj Łuku do sprawdzenia. (Zamierzałem dołączyć komentarz później o tym, ale odpowiedź była już pozytywnie oceniona, więc przypuszczałem, że ją
przybiłem
1
Zobacz pozycję resolip poniżej, jeśli chcesz rozwiązać problem, którego nie ma w systemie DNS (np. / Etc / hosts)
Gavin Brock
2
Pamiętaj, że hostczasami zwraca wyjście wieloliniowe (w przypadku przekierowań), będziesz chciał, host unix.stackexchange.com | tail -n1jeśli chcesz tylko linię z adresem IP.
Edward Coffey,
3
Ta odpowiedź zasługuje na poważne uznanie. hostjest narzędziem DNS (podobnym do nslookup), więc wyszukuje tylko hosty w DNS, a nie np /etc/hosts. Więc to NIE jest odpowiedź na pytanie OP.
peterh
54

Mam na komputerze narzędzie, które wydaje się wykonywać tę pracę. Strona podręcznika pokazuje, że wydaje się, że pochodzi z mysql ... Oto jak możesz go użyć:

resolveip -s unix.stackexchange.com
64.34.119.12

Zwracana wartość tego narzędzia różni się od 0, jeśli nie można rozwiązać nazwy hosta:

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

AKTUALIZACJA W Fedorze jest dostarczany z serwerem mysql:

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

Myślę, że stworzyłoby to dziwną zależność dla twojego skryptu ...

greg0ire
źródło
6
Wydaje się, że jest to jedyne rozwiązanie, które korzysta z wbudowanego w resolvera systemu operacyjnego - działa więc zarówno w przypadku / etc / hosts, jak i DNS.
Gavin Brock
8
getent, jak szczegółowo opisano w drugiej odpowiedzi, również przegląda / etc / hosts i jest wyposażony w glibc, więc nie ma zależności od systemu Linux.
Asfand Qazi
44

Poniższa komenda digpozwala na odczyt wyniku bezpośrednio bez sed / awk / etc. magia:

$ dig +short unix.stackexchange.com
64.34.119.12

digjest również zawarty w dnsutilspakiecie.


Uwaga : digma wartość zwracaną 0, nawet jeśli nazwy nie można rozwiązać. Dlatego musisz sprawdzić, czy dane wyjściowe są puste, zamiast sprawdzać wartość zwracaną:

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
else
    echo Could not resolve hostname.
fi

Uwaga 2 : Jeśli nazwa hosta ma wiele adresów IP ( debian.orgna przykład spróbuj ), wszystkie zostaną zwrócone. Ten „problem” dotyczy wszystkich narzędzi wymienionych do tej pory w tym pytaniu:

Heinzi
źródło
2
Pamiętaj, że jeśli domena ma wpis CNAME, jej domena może zostać wydrukowana w pierwszym wierszu zamiast adresu IP.
pcworld 27.04.2018
40
getent hosts unix.stackexchange.com | cut -d' ' -f1
sborsky
źródło
4
Również rozważyć ahosts, ahostsv4, ahostsv6z getent.
0xC0000022L,
cutnie będzie dla getent, które używają \tdo oddzielania kolumn. Tak jest w przypadku Solaris.
ceving
1
@ceving: W systemie Solaris może być konieczne uruchomienie cutbez -d(domyślnie \tjako separator). W Linuksie są to spacje, więc powyższa linia działa.
sborsky,
27

Dotychczasowe rozwiązania działają głównie w prostszym przypadku: nazwa hosta jest tłumaczona bezpośrednio na pojedynczy adres IPv4. Może to być jedyny przypadek, w którym musisz rozwiązać nazwy hostów, ale jeśli nie, poniżej znajduje się dyskusja na temat niektórych spraw, które mogą być konieczne.

Chris Down i Heinzi krótko omówili przypadek, w którym nazwa hosta rozwiązuje się na więcej niż jednym adresie IP. W tym przypadku (i innych poniżej) podstawowe skrypty przy założeniu, że nazwa hosta bezpośrednio rozpoznaje pojedynczy adres IP, mogą ulec uszkodzeniu. Poniżej przykład z nazwą hosta tłumaczącą się na więcej niż jeden adres IP:

$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104

Ale co to jest www.l.google.com? W tym miejscu należy wprowadzić przypadek aliasu . Sprawdźmy poniższy przykład:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104

Nie www.google.comdotyczy to bezpośrednio adresów IP, ale alias, który sam przekształca się w wiele adresów IP. Aby uzyskać więcej informacji na temat aliasów, sprawdź tutaj . Oczywiście możliwy jest przypadek, w którym alias ma jeden adres IP, jak pokazano poniżej:

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190

Ale czy można powiązać aliasy? Odpowiedź brzmi tak:

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105

Nie znalazłem żadnego przykładu, w którym nazwa hosta jest tłumaczona na alias, który nie jest rozpoznawany na adres IP, ale myślę, że może tak być.

Więcej niż wiele adresów IP i aliasów, czy są jakieś inne specjalne przypadki ... a co z IPv6? Możesz spróbować:

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

Gdzie ipv6.google.comnazwa hosta to nazwa hosta tylko IPv6. Co z nazwami hostów z dwoma stosami:

$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

Znowu o IPv6, jeśli twój host jest tylko IPv4, nadal możesz rozwiązać adresy IPv6 (testowane na WinXP tylko dla IPv4 i na ipv6.google.com, możesz wypróbować to na Linuksie). W takim przypadku rozdzielczość się powiedzie, ale ping nie powiedzie się z komunikatem o błędzie nieznanego hosta . Może to być przypadek, w którym skrypt nie działa.

Mam nadzieję, że te uwagi były przydatne.

jfg956
źródło
2
Cóż za wspaniałe uzupełnienie przyjętej odpowiedzi, pokazujące wszystkie najważniejsze przypadki, z którymi można sobie poradzić w skryptach. Moja wersja hostnawet nie podaje „ma adres” moich skrzynek.
Mihai Danila
21

Aby uniknąć problemu z aliasami i zawsze uzyskać jeden adres IP gotowy do użycia:

python -c 'import socket; print socket.gethostbyname("www.example.com")'
dbernt
źródło
Zrobiłem funkcję bash, aby trzymać się mojego bashrc z tej odpowiedzi: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
Bryce Guinta
18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

działa bez zależności od innych systemów (i dla hostów określonych w / etc / hosts)

Andrew McGregor
źródło
2
Potrzebne jest użycie polecenia ping, ponieważ potrzebuję wartości z pliku hosts, ale wzorzec sed analizuje poprawnie, ale to działało ping -q -c 1 -t 1 twoja_hosta_tutaj | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s /[)].*$//"
ManiacZX 18.01.2013
1
Aby rozwiązać coś w mojej sieci domowej, na przykład myhostname.local, działa to, więc dla mnie jest to najlepsza odpowiedź.
Matt Friedman
1
Czy mogę zasugerować to również:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Matt Friedman
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>pracuje dla deklaracji wewnątrz /etc/hosts, zbyt ... i to go-to-narzędzie dla wszystkich rodzajów baz danych systemowych (passwd, grupy, aliasów, usług).
0xC0000022L
17

Proste, ale przydatne:

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

Wszystkie polecenia rozpoznają adres IP, jeśli host nadal istnieje. Jeśli host wskazuje na CNAME, w tym przypadku również uzyska adres IP.

Pierwsze polecenie zwraca rozstrzygnięty adres IPv4

Drugie polecenie zwraca rozstrzygnięty adres IPv6

Trzecie polecenie zwróci adres właściciela, który może być adresem IPv4 lub IPv6.

Tom Freudenberg
źródło
Zdecydowanie najprostszy. I jest domyślnie dostępny. Nie tak, hostże wymaga instalacjibindutils
michaelbn
7

Oto niewielka odmiana pingpodejścia uwzględniającego „nieznanego hosta” (poprzez przepuszczanie przez stderr) i zastosowania w trcelu uniknięcia użycia sedwyrażeń regularnych:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

W przypadku, gdy ważne jest przechwycenie wartości wyjściowej, następujące działania będą działać (choć mniej elegancko):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'
Stefan Farestam
źródło
Uwielbiam to rozwiązanie, ponieważ działa bez żadnych dodatkowych narzędzi.
Radon8472,
7

Aby wypełnić odpowiedź Chrisa Downa i odnieść się do komentarzy jfgagne na temat (prawdopodobnie powiązanych) aliasów, oto rozwiązanie, które:

  • uwzględnia wiele adresów IP
  • uwzględnia jeden lub więcej aliasów (CNAME)
  • nie wyszukuje /etc/hostspliku (w moim przypadku go nie chciałem); zapytać, rozwiązanie dbernta w Pythonie jest idealne)
  • nie używa awk / sed

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

Zawsze zwraca pierwszy adres IP lub pusty tring, jeśli nie zostanie rozwiązany. z wersją dig:

    $ dig -v
    DiG 9.8.1-P1
Franck
źródło
1
Dzięki, inne odpowiedzi zakładają, że „dig + short” zawsze zwraca pojedynczy adres IP. Nie rozliczali CNAME.
jamshid
5
 php -r "echo gethostbyname('unix.stackexchange.com');"
Mohammed Zourob
źródło
to działa, ale wymaga zainstalowania php na twoim terminalu
Radon8472,
1
może być przydatny na typowym kontenerze dokującym php, gdzie „host”, „dig” itp. nie są dostępne
Fabian Schmengler,
5

Chciałbym dodać to jako komentarz do Andrew McGregor Re: ping. Jednak nie pozwoliłoby mi to, więc muszę dodać to jako kolejną odpowiedź. (Jeśli ktoś może zamienić go w komentarz, zachęcamy do.)

To kolejny wariant, wykorzystujący tylko ping i grep:

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -Edla rozszerzonego wyrażenia regularnego i grep -oaby zwrócić tylko pasującą część. wyrażenie regularne szuka jednej lub wielu cyfr ( [0-9]+) i opcjonalnie kropki ( \.?) cztery razy ( {4})

Dweia
źródło
4

Możesz użyć host:

hostname=example.org

# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;
fi
Matteo
źródło
4

oto przepis na Bash, który ugotowałem na podstawie odpowiedzi innych ludzi - najpierw próbuje /etc/hosts, a potem wraca do nslookup:

resolveip(){
    local host="$1"
    if [ -z "$host" ]
    then
        return 1
    else
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
        then
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
            then
                echo "unable to resolve '$host'" >&2 
                return 1
            else
                echo "$ip"
                return 0
            fi
        else
            echo "$ip"
            return 0
        fi
    fi
}
RubyT TuesdayDONO
źródło
Żeby było jasne, getent hostsnie jest to tylko wyszukiwanie w / etc / hosts - to pełne rozpoznawanie DNS wywołania gethostbyaddr (3) i jest bardzo mało prawdopodobne, że zakończy się niepowodzeniem w przypadku, gdy digsię powiedzie. Zobacz stronę man dla getent .
Stuart P. Bentley,
@Stuart ma rację - wiele się nauczyłem, odkąd to napisałem i uprościłem potężne polecenie. getentpozostaje moim ulubionym, chociaż lubię teżdig +short
RubyT TuesdayDONO
4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

było rozwiązaniem, które znalazłem bez serwera DNS

Philippe Gachoud
źródło
3

Może nie jest to najbardziej zwięzłe, ale wydaje się być solidne i wydajne:

# $(get_host_dns_short "google.com")
#
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
{
    (
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1
}

Spowoduje to wygenerowanie pojedynczego adresu IP IPv4, a także zwróci 1w przypadku awarii, jednocześnie maskując wyjście stderr.

Możesz użyć tego w następujący sposób:

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
else
    echo "Failed to resolve Google's IP."
fi

Adres IP Google to 216.58.192.46.

Jeśli chcesz adres IPv6 zamiast, po prostu zastąpić -4z -6.

Będzie
źródło
3

dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'

DP Baker
źródło
1
Byłby świetny kontekst, w jaki sposób poprawi się ta odpowiedź w stosunku do już istniejących. Proszę również wciąć polecenia o 4 spacje (por. Składnia markdown).
maxschlepzig
2

1 linia rozwiązuje listę nazw hostów

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done
Andy Wong
źródło
2

Cały czas robię to na komputerze Mac, którego nie ma getent. pingwygląda na włamanie. Chciałbym również wziąć /etc/hostspod uwagę.

Napisałem więc głupie opakowanie dla dns.lookupciebie, który ma zainstalowany Node.js, aby zapewnić CLI:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89
Thomas Jensen
źródło
60% szansy na złamanie, zanim zbliżysz się do rozwiązania.
dotbit
@dotbit czy mógłbyś opracować? Używam tego tygodnika od '17 i nigdy nie miałem żadnych problemów.
Thomas Jensen
@Jensen, ale jesteś jedynym, jak zawsze. Reszta z nas zwykle napotyka taki czy inny BŁĄD i zawsze.
dotbit
„jak zawsze” Co przez to rozumiesz? „Reszta z nas” Kto to jest? „wpaść w błąd” Jakie konkretny problem widzisz? Jestem ciekawy.
Thomas Jensen
2

kopanie jest zbyt wolne, nslookup jest znacznie szybszy

nslookup google.com | grep -Po 'Address:\s*[0-9.]+' | tail -1 | sed -e 's/Address:\s*//g'
Andrey Izman
źródło
2

Nie znam najprostszego sposobu na wykonanie skryptu bash, ale jeśli chcesz rozwiązać nazwę hosta i sprawdzić, czy host działa, użyj ping!

ping -a hostname -c 1

Czy pinghost raz i przekształci nazwę hosta w adres IP.

$ ping -a www.google.com -c 1
PING www.google.com (216.58.211.132) 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms
użytkownik257655
źródło
używanie ping jest dobre, ponieważ wszyscy go mają, ale musisz odfiltrować część IP z wyjść, jeśli chcesz użyć jej w skrypcie.
Radon8472,
1

Tak, jest już wiele odpowiedzi, ale brakuje rozwiązania wykorzystującego perl:

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

W skrypcie bash można go użyć w następujący sposób:

#!/bin/bash
ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

Zastosowane tutaj moduły są modułami podstawowymi, dlatego powinny być dostępne wszędzie bez instalowania z CPAN.

Slaven Rezic
źródło
perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null jest znacznie czystszy. ale nikt z nas nie używa pörl, wszyscy inni oczywiście używają skryptu Pascal.
dotbit
Właściwie wolę widzieć komunikaty o błędach, jeśli coś pójdzie nie tak. Can't call method "addr" on an undefined valuenie jest najlepszym komunikatem o błędzie, ale może dać wskazówkę na temat problemu.
Slaven Rezic
1
#!/bin/bash

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "
dotbit
źródło
1
Wersja Ruby drukuje cytaty wokół adresu IP --- prawdopodobnie printzamiast tego należy użyć p.
Slaven Rezic
dzięki, @Slaven Rezic i zachęcamy do głosowania. z drugiej strony, tutaj na dole skrypt może być bardziej widoczny ... ;-)
dotbit
-1
host -t a cisco.com

to polecenie wyświetli adres IP (spowoduje zmianę adresu domeny na IP)

aaa
źródło
-1

Oprócz powyższego rozwiązania możesz przetłumaczyć wiele nazw hostów na ip za pomocą poniższego skryptu, jedyną zależnością jest polecenie „ping” w rdzeniu Uniksa:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log

ABC.DEF.GHI.XY1

ABC.DEF.GHI.XY2

ABC.DEF.GHI.XY3

ABC.DEF.GHI.XY4

ABC.DEF.GHI.XY5

ABC.DEF.GHI.XY6

ABC.DEF.GHI.XY7

ABC.DEF.GHI.XY8
Kevin Li
źródło