Jak mogę przekształcić nazwę hosta na adres IP w skrypcie Bash?

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

Komentarze

  • Szkoda, że getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> odpowiedź jest gdzieś na dole. Jest ' najprostszy, nie wymaga dodatkowych pakietów i jest łatwiejszy do przeanalizowania ze skryptu Bash.
  • @ 0xC0000022L: Szkoda, że ta odpowiedź sugeruje getent hosts somehost, gdy uruchamia to podczas somehost utworzy adres IPv6 , który różni się od większości innych narzędzi (ping, ssh przynajmniej) rozwiązuje nazwy i psuje niektóre rzeczy. Użyj ahosts zamiast hosts.
  • @j_random_hacker: który powstrzymuje Cię przed żądaniem konkretnego adresu IPv4 (ahostsv4) lub IPv6 (ahostsv6)? Osobiście nie widzę nic złego w niespecyficznym żądaniu zwrotu IPv6. Twój kod powinien być przygotowany. Protokół IPv6 istnieje od ponad 20 lat.
  • @ 0xC0000022L: Nikt ” nie zatrzymuje mnie ” z ale odpowiedź sugeruje konkretnie hosts, a do tej pory 4 osoby zagłosowały za vinc17 ' komentarz wyrażający ból spowodowany przez ” nagle IPv6 „. Przygotowanie do IPv6 nie zawsze jest problemem: wiele programów potrzebuje sposobu na określenie, czy dwie nazwy / adresy odnoszą się do tego samego hosta. Mogą albo użyć prostego dopasowania ciągów, 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 tego pierwszego.

Odpowiedz

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

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

Albo, jak powiedział Heinzi poniżej, możesz użyć dig z argumentem +short (wysyła zapytanie bezpośrednio do serwerów DNS, nie sprawdza /etc/hosts / NSS / etc):

dig +short unix.stackexchange.com 

Jeśli dig +short jest niedostępny, dowolny z następujących powinno działać. Wszystkie te zapytania bezpośrednio wysyłają do DNS 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 exit do awk” przepł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 }" 

Komentarze

  • Domyślnie użycie dig działa tylko z ipv4, gdzie host daje odpowiedzi zarówno ipv4, jak i ipv6. Może to być nieoczekiwane. Możesz 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.
  • DIG nie działa, jeśli jest CNAME, nie zwraca adresu IP.
  • Czasami może przekroczyć limit czasu i nic nie zwraca. W przypadku niektórych domen dig +short może zwrócić alias domeny w pierwszym wierszu. Aby więc upewnić się, że dane wyjściowe to IPv4 adres, użyj dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
  • Używanie getent hosts <host> jest niepoprawne, jak w przypadku instan ce może dać adres IPv6, podczas gdy IPv6 ' nie działa. Poprawnym rozwiązaniem jest użycie getent ahosts <host> do wypróbowania w razie potrzeby zarówno IPv6, jak i IPv4.
  • Warto wspomnieć: host, dig i nslookup wydają się komunikować bezpośrednio z wymienionymi serwerami w resolv.conf, natomiast ” getent hosts ” przestrzegają zarówno lokalnego pliku hostów, jak i buforowania na poziomie biblioteki (np. nscd), jeśli jest włączone .

Odpowiedz

Z host z dnsutils :

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

( Poprawione nazwa pakietu zgodnie z komentarzami. Uwaga: inne dystrybucje mają host w różnych pakietach: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

Komentarze

  • Jeśli chcesz rozwiązać problem, którego nie ma w DNS (np. / Etc / hosts), zapoznaj się z poniższym wpisem resolutionip.
  • Pamiętaj, że host czasami zwraca wieloliniowe wyjście (w przypadku przekierowań), ' chcesz host unix.stackexchange.com | tail -n1, jeśli chcesz tylko linię z adresem IP.
  • Istnieje wiele wersji ” hosta ” z różnymi formatami wyjściowymi. Na przykład. wygląda na to, że większość systemów ma wersję BIND9, ale mój serwer Ubuntu 10.04 LTS ma jakoś zupełnie inną wersję ..
  • jeśli nie ' nie masz host lub dig możesz użyć polecenia ping, które jest zawsze dostępne: ping unix.stackexchange.com -c 1 -q 2>&1 | grep -Po "(\d{1,3}\.){3}\d{1,3}" to nie wymaga dodatkowe pakiety instalują się na większości odpowiedników systemów Unix / Linux.
  • Ta odpowiedź zasługuje na poważną negatywną opinię. host to narzędzie DNS (podobne do nslookup), więc wyszukuje hosty tylko w DNS, a nie np. /etc/hosts. Więc to NIE jest odpowiedzią na pytanie OP '.

Odpowiedź

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

resolveip -s unix.stackexchange.com 64.34.119.12 

Wartość zwracana przez to narzędzie jest różna 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 

UPDATE 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 

Wydaje mi się, że stworzyłoby to dziwną zależność dla twojego skryptu …

Komentarze

  • Wydaje się, że jest to jedyne rozwiązanie w tym miejscu, które korzysta z wbudowanego systemu operacyjnego ' – tak działa / etc / hosts, a także DNS.
  • getent, jak szczegółowo opisano w drugiej odpowiedzi, również przegląda / etc / hosts i zawiera glibc, więc nie ma żadnych zależności w systemie Linux.
  • Nie użyłbym resip, ponieważ tworzysz zależność od innego pakietu. getent jest instalowany domyślnie. host, nslookup i dig znajdują się w opcjonalnych pakietach. Zdecydowanie użyj getent w skrypcie.
  • Podoba mi się ta odpowiedź, ale nie ' t return ipv6

Odpowiedz

Następujące polecenie używające dig umożliwia bezpośrednie odczytanie wyniku bez sed / awk / etc. magia:

$ dig +short unix.stackexchange.com 64.34.119.12 

dig jest również zawarte w dnsutils pakiet.


Uwaga : dig zwraca wartość 0, nawet jeśli nazwy nie można rozpoznać. Dlatego „d musisz sprawdzić, czy wynik jest pusty, zamiast sprawdzać zwracaną wartość:

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 (spróbuj na przykład debian.org), wszystkie będą zwrócony. Ten „problem” dotyczy wszystkich narzędzi wymienionych w tym pytaniu do tej pory:

Komentarze

  • Należy pamiętać, że jeśli domena ma wpis CNAME jego domena może być wydrukowana w pierwszym wierszu zamiast adresu IP.

Odpowiedź

getent hosts unix.stackexchange.com | cut -d" " -f1 

Komentarze

  • Weź również pod uwagę ahosts, ahostsv4, ahostsv6 z getent.
  • cut nie będzie getent ' s, które używają \t do oddzielenia kolumn. Tak jest w przypadku systemu Solaris.
  • @ceving: On Sola może być konieczne uruchomienie cut bez -d (domyślnie \t jako separator). W systemie Linux spacje są ', więc powyższa linia działa.

Odpowiedź

Rozwiązania podane do tej pory 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 przypadków, które możesz potrzebować.

Chris Down i Heinzi krótko omówili przypadek, w którym rozwiązuje się nazwa hosta do więcej niż jednego adresu IP. W tym przypadku (i innych poniżej) podstawowe skrypty przy założeniu, że nazwa hosta jest tłumaczona bezpośrednio na pojedynczy adres IP, może się zepsuć. Poniżej przykład z nazwą hosta odpowiadającą więcej niż jednemu adresowi 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 ? Tutaj należy wprowadzić przypadek alias . Spójrzmy na 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 

Więc www.google.com nie rozwiązuje bezpośrednio adresu IP, ale alias, który sam jest tłumaczony na wiele adresów IP. Aby uzyskać więcej informacji o aliasach, sprawdź tutaj . Oczywiście przypadek, w którym alias ma pojedynczy adres IP, jest możliwy , 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 aliasy można łączyć?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 tłumaczony na adres IP, ale myślę, że może się zdarzyć.

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 nazwa hosta ipv6.google.com to nazwa hosta wyłącznie dla 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 jeśli chodzi o IPv6, jeśli twój host ma tylko IPv4, nadal możesz rozwiązać adresy IPv6 (testowane na WinXP tylko dla IPv4 a na ipv6.google.com możesz wypróbować go w systemie Linux). W tym przypadku rozpoznanie powiedzie się, ale polecenie ping kończy się niepowodzeniem z komunikatem o nieznanym błędzie hosta . Może to być przypadek, w którym twój skrypt nie powiedzie się.

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

Komentarze

  • Co za wspaniały uzupełnienie zaakceptowanej odpowiedzi, pokazując wszystkie skrajne przypadki, z którymi warto się zmierzyć w skryptach. Moja wersja host nie wskazuje nawet, że ” ma adres ” dla moich skrzynek.

Odpowiedź

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

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

Komentarze

Odpowiedź

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)

Komentarze

  • Użycie polecenia ping jest tym, czego potrzebowałem, ponieważ potrzebuję wartości z pliku hosts, ale poprawnie przeanalizowałem wzorzec seda, ale ten ping zadziałał – q -c 1 -t 1 your_host_here | grep PING | sed -e ” s / ^ [^ (] * [(] // ” | sed -e ” s / [)]. * $ // ”
  • Aby rozwiązać problem w mojej sieci domowej, na przykład myhostname.local, działa to tak ja to najlepsza odpowiedź.
  • Mogę również zasugerować to: ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
  • getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> działa również w przypadku deklaracji w /etc/hosts … i ' s go-to-tool dla wszystkich rodzajów systemowych baz danych (hasła, grupy, aliasy, usługi).

Odpowiedź

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 rozwiązują adres IP, jeśli host nadal istnieje. Jeśli host wskazuje na CNAME, otrzyma również adres IP w tym

Pierwsze polecenie zwraca rozwiązany adres IPv4.

Drugie polecenie zwraca olved adres IPv6.

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

Komentarze

  • Zdecydowanie najprostszy. I jest domyślnie dostępny. Nie tak jak host, które wymagają instalacji bindutils

odpowiedzi

Oto niewielka odmiana podejścia ping, które bierze pod uwagę „nieznany host” (przez przepuszczanie przez stderr) i używa tr, aby uniknąć stosowania sed wyrażeń regularnych:

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

W przypadku ważne jest, aby uchwycić wartość wyjścia, wtedy zadziała (choć mniej elegancka):

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

Komentarze

  • Uwielbiam to rozwiązanie, ponieważ działa bez żadnych dodatkowych narzędzi.

Odpowiedź

Aby uzupełnić odpowiedź Chrisa Downa i zająć się komentarzami jfgagne na temat (prawdopodobnie połączonych w łańcuch) aliasów, oto rozwiązanie, które:

  • bierze pod uwagę wiele adresów IP
  • bierze pod uwagę jeden lub więcej aliasów (CNAME)
  • nie sprawdza pliku /etc/hosts ( w moim przypadku tego nie chciałem); aby zapytać, rozwiązanie Pythona dbernta jest idealne)
  • nie używa awk / sed

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

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

 $ dig -v DiG 9.8.1-P1 

Komentarze

  • Dzięki, inne odpowiedzi zakładają, że ” dig + short ” zawsze zwraca pojedynczy adres IP. Nie ' nie uwzględniały rekordów CNAME.

Odpowiedź

 php -r "echo gethostbyname("unix.stackexchange.com");" 

Komentarze

  • to działa, ale wymaga zainstalowania php na twoim terminalu
  • może być przydatne w typowym kontenerze docker php, gdzie ” host „, ” dig ” itd. są niedostępne

Odpowiedź

Chciałbym dodać to jako komentarz do Andrew McGregora Re: ping. Jednak na to mi nie pozwoli, więc muszę to dodać jako kolejną odpowiedź. (Jeśli ktoś może przenieść to do komentarza, nie krępuj się).

To jest inny wariant, używający tylko poleceń ping i grep :

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

grep -E dla rozszerzonego wyrażenia regularnego i grep -o do zwraca tylko pasującą część. samo wyrażenie regularne szuka jednej lub wielu cyfr ([0-9]+) i opcjonalnie kropki (\.?) cztery razy ( {4})

Odpowiedź

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 

Odpowiedz

tutaj „przepis na Bash Gotowałem, korzystając z odpowiedzi innych ludzi – najpierw próbuję /etc/hosts, a potem wracam 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 }  

Komentarze

  • Żeby było jasne, getent hosts isn ' to tylko wyszukiwanie w / etc / hosts – to ' to pełne wywołanie rozwiązywania DNS do gethostbyaddr (3) i ' s bardzo nie powiedzie się w przypadku, gdy dig powiedzie się. Zobacz stronę podręcznika dla getent .
  • @Stuart ma rację – i ' już się nauczyłem bardzo dużo od czasu napisania tego i nadmiernie uprościłem potężne polecenie. getent pozostaje moim ulubionym, chociaż lubię też dig +short

Odpowiedź

nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n "s/.*[(]\([0-9\.]*\)[)].*/\1/p" 

to rozwiązanie, które znalazłem bez serwera DNS

Odpowiedź

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 wyświetlenie pojedynczego adresu IPv4 IP, a także zwracają 1 w przypadku niepowodzenia, maskując wyjście stderr.

Możesz tego użyć w ten 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 zamiast tego chcesz otrzymać adres IPv6, po prostu zamień -4 na -6.

Odpowiedź

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

Komentarze

  • Pewien kontekst, w jaki sposób ta odpowiedź poprawiłaby się w stosunku do już istniejących być wspaniałym. Ponadto, wcięcie poleceń należy wykonać 4 spacjami (por. Składnia znaczników).

Odpowiedź

dig to też wolno, nslookup jest znacznie szybsze

nslookup google.com | grep -Po "Address:\s*[0-9.]+" | tail -1 | sed -e "s/Address:\s*//g" 

Odpowiedz

1 wiersz rozwiązuje listę nazwy hosta

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk "/^Address: / { print $1 }"); echo $a >> ~/Desktop/ip; done 

Odpowiedź

Robię to cały czas na moim Mac, który nie ma getent. ping wygląda na włamanie. Chciałbym również wziąć pod uwagę /etc/hosts.

Napisałem więc głupie opakowanie dla dns.lookup dla masz zainstalowany Node.js zapewniający CLI:

$ npm install -g lookup-hostname $ lookup google.com 62.243.192.89 

Komentarze

  • 60% szansy złamania, zanim zbliżysz się do rozwiązania.
  • @dotbit czy mógłbyś rozwinąć? ' korzystam z tego co tydzień od ' 17 i nigdy nie miałem żadnych problemów.
  • @Jensen, ale Ty ' są jak zawsze jedyni. Reszta z nas zwykle napotyka FAIL tego lub innego rodzaju i zawsze.
  • ” jak zawsze ” Co przez to rozumiesz? ” Reszta z nas ” Kto ' to ? ” napotkasz FAIL ” Jaki konkretny problem widzisz? Jestem ' zaciekawiony.

Odpowiedź

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

ping -a hostname -c 1 

ping host jeden raz i przetłumaczy nazwę hosta na 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 

Komentarze

  • używanie polecenia ping jest dobre, ponieważ każdy go ma, ale musisz odfiltruj część IP z wyjść, jeśli chcesz jej użyć w skrypcie.

Odpowiedź

Tak, jest już wiele odpowiedzi, ale brakuje rozwiązania używającego Perla:

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

W skrypcie basha 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 

Moduły użyte tutaj są modułami podstawowymi, więc powinny być dostępne wszędzie bez instalacji z CPAN.

Komentarze

#!/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! " 

Komentarze

  • Wersja ruby drukuje cudzysłowy wokół adresu IP – prawdopodobnie należy użyć print zamiast p.
  • thx, @Slaven Rezic i zapraszam do głosowania za. z drugiej strony, tutaj na dole skrypt może być właściwie bardziej widoczny … 😉

Odpowiedz

host -t a cisco.com 

to polecenie pokaże adres IP (zmieni domenę na IP)

Odpowiedź

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 podstawowym systemie Unix:

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 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *