Wat is de meest beknopte manier om een hostnaam om te zetten in een IP-adres in een Bash-script? Ik gebruik Arch Linux .
Reacties
Antwoord
Je kunt getent
gebruiken, die wordt geleverd met glibc
(dus je hebt het vrijwel zeker onder Linux) . Dit lost op met gethostbyaddr / gethostbyname2, en dus wordt ook gecontroleerd op /etc/hosts
/ NIS / etc:
getent hosts unix.stackexchange.com | awk "{ print $1 }"
Of, zoals Heinzi hieronder zei, kun je dig
gebruiken met het +short
-argument (vraagt DNS-servers rechtstreeks, kijkt niet naar /etc/hosts
/ NSS / etc):
dig +short unix.stackexchange.com
Als dig +short
niet beschikbaar is, kan iedereen van het volgende zou moeten werken. Al deze vragen rechtstreeks naar DNS en negeren andere manieren van oplossing:
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 }"
Als u slechts één IP-adres wilt afdrukken, voegt u het exit
commando voor awk
” s workflow.
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 }"
Reacties
- Standaard werkt het gebruik van dig alleen met ipv4, waar host zowel ipv4 als ipv6 antwoorden geeft. Dit kan onverwacht zijn. Je kunt
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 werkt niet, als het een CNAME is, wordt het IP-adres niet geretourneerd.
- Soms
host
kan een time-out hebben en geeft niets terug. Voor sommige domeinen kandig +short
een domeinalias in de eerste regel retourneren. Om er dus voor te zorgen dat de uitvoer een IPv4 is adres, gebruikdig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1
. - Het gebruik van
getent hosts <host>
is onjuist, zoals voor instan ce het kan een IPv6-adres geven terwijl IPv6 niet ‘ werkt. De juiste oplossing is omgetent ahosts <host>
te gebruiken om zowel IPv6 als IPv4 te proberen, indien nodig. - Vermeldenswaard: host, dig en nslookup lijken rechtstreeks met de vermelde servers te praten in resolv.conf, terwijl ” getent hosts ” zowel het lokale hosts-bestand respecteren als caching op bibliotheekniveau (zoals nscd) indien ingeschakeld .
Antwoord
Met host
van de dnsutils pakket:
$ host unix.stackexchange.com unix.stackexchange.com has address 64.34.119.12
( Gecorrigeerd pakketnaam volgens de opmerkingen. Zoals een opmerking hebben andere distributies host
in verschillende pakketten: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)
Reacties
- Zie het resolvip-item hieronder als u iets moet oplossen dat niet in DNS staat (bijv. / Etc / hosts).
- Houd er rekening mee dat
host
retourneert soms meerregelige uitvoer (in het geval van omleidingen), ‘ wilhost unix.stackexchange.com | tail -n1
als u alleen de regel met het IP-adres wilt. - Er zijn meerdere versies van ” host ” met verschillende uitvoerformaten. Bijv. de meeste systemen lijken de BIND9-versie te hebben, maar mijn Ubuntu 10.04 LTS-server heeft op de een of andere manier een compleet andere versie.
- als je ‘ niet
host
ofdig
geïnstalleerd, kunt u in plaats daarvan ping gebruiken die altijd beschikbaar is:ping unix.stackexchange.com -c 1 -q 2>&1 | grep -Po "(\d{1,3}\.){3}\d{1,3}"
dit heeft geen nodig extra pakketten worden geïnstalleerd op de meeste Unix / Linux-matchines. - Dit antwoord verdient een serieuze downvote.
host
is een DNS-tool (vergelijkbaar metnslookup
), dus het zoekt alleen hosts op in DNS, niet in bijv./etc/hosts
. Het is dus NIET een antwoord op de vraag van OP ‘ s.
Antwoord
Ik heb een tool op mijn machine die de klus lijkt te klaren. De man-pagina laat zien dat het lijkt te komen met mysql … Hier is hoe je het zou kunnen gebruiken:
resolveip -s unix.stackexchange.com 64.34.119.12
De geretourneerde waarde van deze tool is anders dan 0 als de hostnaam niet kan worden omgezet:
resolveip -s unix.stackexchange.coma resolveip: Unable to find hostid for "unix.stackexchange.coma": host not found exit 2
UPDATE Op fedora wordt het geleverd met mysql-server:
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
Ik denk dat het een vreemde afhankelijkheid voor je script zou creëren …
Opmerkingen
- Dit lijkt de enige oplossing hier te zijn die de OS ‘ s ingebouwde resolver gebruikt – dus werkt voor / etc / hosts en DNS.
-
getent
, zoals beschreven in het andere antwoord, kijkt ook naar / etc / hosts, en wordt geleverd met glibc, dus heeft geen afhankelijkheden op een Linux-systeem. - Ik zou resolvip niet gebruiken omdat je een afhankelijkheid van een ander pakket creëert. getent wordt standaard geïnstalleerd. host, nslookup en dig zijn allemaal in optionele pakketten. Gebruik getent zeker in een script.
- ik vind dit antwoord leuk, maar het ‘ retourneert geen ipv6
Answer
Het volgende commando met dig
stelt je in staat om het resultaat direct te lezen zonder enige sed / awk / etc. magie:
$ dig +short unix.stackexchange.com 64.34.119.12
dig
is ook opgenomen in de dnsutils
pakket.
Opmerking : dig
heeft een retourwaarde van 0
, zelfs als de naam niet kon worden omgezet. Je moet dus “controleren of de uitvoer leeg is in plaats van de geretourneerde waarde te controleren:
hostname=unix.stackexchange.com ip=`dig +short $hostname` if [ -n "$ip" ]; then echo IP: $ip else echo Could not resolve hostname. fi
Opmerking 2 : als een hostnaam meerdere IP-adressen heeft (probeer bijvoorbeeld debian.org
), dan worden ze allemaal geretourneerd. Dit “probleem” heeft invloed op alle tools die tot dusver in deze vraag zijn genoemd:
Opmerkingen
- Merk op dat als een domein een CNAME-vermelding heeft zijn domein kan in de eerste regel worden afgedrukt in plaats van een IP-adres.
Answer
getent hosts unix.stackexchange.com | cut -d" " -f1
Reacties
- Overweeg ook
ahosts
,ahostsv4
,ahostsv6
metgetent
. -
cut
zal niet voor getent ‘ s, die\t
gebruiken om kolommen te scheiden. Dit is het geval op Solaris. - @ceving: Op Sola ris moet je misschien
cut
uitvoeren zonder-d
(standaard\t
als scheidingsteken). Op Linux zijn ‘ spaties, dus de regel hierboven werkt.
Antwoord
De oplossingen die tot nu toe zijn gegeven, werken meestal in het eenvoudigere geval: de hostnaam wordt direct omgezet in een enkel IPv4-adres. Dit is misschien het enige geval waarin u hostnamen moet oplossen, maar zo niet, dan vindt u hieronder een bespreking van enkele gevallen die u mogelijk moet behandelen.
Chris Down en Heinzi bespraken kort het geval waarin de hostnaam wordt opgelost. naar meer dan één IP-adres. In dit geval (en andere hieronder) kan basisscripting onder de veronderstelling dat een hostnaam direct wordt omgezet naar een enkel IP-adres, defect raken. Hieronder een voorbeeld met een hostnaam die wordt omgezet in meer dan één IP-adres:
$ 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
Maar wat is www.l.google.com
? Dit is waar de alias case moet worden geïntroduceerd. Laten we eens kijken naar het onderstaande voorbeeld:
$ 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
Dus www.google.com
wordt niet direct omgezet naar IP-adressen, maar naar een alias die zichzelf herleidt naar meerdere IP-adressen. Voor meer informatie over aliassen, kijk hier . Het is natuurlijk mogelijk dat een alias één IP-adres heeft , zoals hieronder getoond:
$ 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
Maar kunnen aliassen worden geketend?Het antwoord is ja:
$ 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
Ik heb geen voorbeeld gevonden waarin een hostnaam wordt omgezet in een alias die niet wordt omgezet in een IP-adres, maar ik denk dat de geval kan voorkomen.
Meer dan meerdere IP-adressen en aliassen, zijn er enkele andere speciale gevallen … hoe zit het met IPv6? Je zou kunnen proberen:
$ 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
Waar de hostnaam ipv6.google.com
een IPv6-hostnaam is. Hoe zit het met dual-stack hostnamen:
$ 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::
Nogmaals over IPv6, als uw host alleen IPv4 is, kunt u nog steeds IPv6-adressen omzetten (getest op een IPv4 alleen WinXP en met ipv6.google.com zou je het kunnen proberen op Linux). In dit geval lukt de oplossing, maar een ping mislukt met een onbekende hostfoutmelding . Dit kan een geval zijn waarin uw scripting mislukt.
Ik hoop dat die opmerkingen nuttig waren.
Opmerkingen
- Wat een geweldige aanvulling op het geaccepteerde antwoord, waarbij alle randgevallen worden getoond die men zou willen behandelen in scripting. Mijn versie
host
vermeldt niet eens ” heeft adres ” voor mijn boxen.
Answer
Om het probleem met aliassen te vermijden en altijd een enkel IP-adres klaar voor gebruik te hebben:
python -c "import socket; print socket.gethostbyname("www.example.com")"
Reacties
- Ik heb een bash-functie gemaakt om in mijn bashrc te blijven van dit antwoord: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
-
python3 -c 'import socket; print(socket.gethostbyname("www.example.com"))'
Answer
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"
werkt zonder afhankelijkheden van andere systemen (en voor hosts gespecificeerd in / etc / hosts)
Opmerkingen
- Het gebruik van ping is wat ik nodig had, aangezien ik de waarde van het hosts-bestand nodig heb, maar het sed-patroon correct ontleedt, maar dit werkte ping – q -c 1 -t 1 uw_host_hier | grep PING | sed -e ” s / ^ [^ (] * [(] // ” | sed -e ” s / [)]. * $ // ”
- Om iets op mijn thuisnetwerk zoals mijnhostnaam.local op te lossen, werkt dit zo voor mij is dit het beste antwoord.
- Mag ik dit ook voorstellen:
ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
-
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>
werkt ook voor declaraties in/etc/hosts
… en het is ‘ s de go-to-tool voor alle soorten systeemdatabases (passwd, group, aliassen, services).
Answer
Eenvoudig maar nuttig :
-
getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
-
getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d " " -f 1
-
getent hosts google.de | head -n 1 | cut -d " " -f 1
Alle opdrachten zullen een IP-adres omzetten als de host nog steeds bestaat. Als de host naar een CNAME verwijst, krijgt hij ook het IP-adres in dat case.
Het eerste commando retourneert het opgeloste IPv4-adres.
Het tweede commando retourneert het res olved IPv6-adres.
Het derde commando retourneert het voorkeursadres van de eigenaar, dat een IPv4- of een IPv6-adres kan zijn.
Opmerkingen
- Verreweg de eenvoudigste. En het is standaard beschikbaar. Niet zoals
host
waarvoor installatie van hetbindutils
Antwoord
Hier is een kleine variatie op de ping
-benadering die rekening houdt met “onbekende host” (door door stderr te leiden) en tr
om het gebruik van sed
regexps te vermijden:
ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}"
Voor het geval dat het is belangrijk om de exit-waarde vast te leggen, dan werkt het volgende (hoewel minder elegant):
ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}"
Reacties
- Ik ben dol op deze oplossing, omdat deze werkt zonder extra tools.
Answer
Om het antwoord van Chris Down te voltooien en jfgagne-opmerkingen over (mogelijk gekoppelde) aliassen te adresseren, is hier een oplossing die:
- rekening houdt met meerdere IP-adressen
- rekening houdt met een of meer aliassen (CNAME)
- vraagt niet naar
/etc/hosts
-bestand ( in mijn geval wilde ik het niet); om het te doorzoeken, is de python-oplossing van dbernt perfect)
-
gebruikt geen awk / sed
dig +short www.alias.com | grep -v "\.$" | head -n 1
Retourneert altijd het eerste IP-adres, of lege tring indien niet opgelost. met versie van dig:
$ dig -v DiG 9.8.1-P1
Reacties
- Bedankt, andere antwoorden gaan ervan uit dat ” dig + short ” altijd retourneert een enkel IP-adres. Ze waren ‘ t goed voor CNAMEs.
Antwoord
php -r "echo gethostbyname("unix.stackexchange.com");"
Reacties
- dit werkt, maar het vereist dat php op je terminal is geïnstalleerd
- kan handig zijn op een typische php docker-container waar ” host “, ” dig ” etc. zijn niet beschikbaar
Antwoord
Ik had dit graag als commentaar willen toevoegen aan Andrew McGregor Re: ping. Het zou me echter niet toestaan, dus ik moet dit als een ander antwoord toevoegen. (Als iemand het in een opmerking kan verplaatsen, voel je dan vrij.)
Dit is een andere variant, alleen met ping en grep :
ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"
grep -E
voor uitgebreide reguliere expressie en grep -o
naar retourneert alleen het overeenkomende deel. de regexp zelf zoekt vier keer naar een of meer cijfers ([0-9]+
) en optioneel een punt (\.?
) ( {4}
)
Antwoord
Je zou :
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
Antwoord
hier “een Bash-recept Ik heb de antwoorden van andere mensen gebruikt – probeer eerst /etc/hosts
, en val dan terug op 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 }
Reacties
- Voor alle duidelijkheid:
getent hosts
isn ‘ t alleen een zoekopdracht in / etc / hosts – het ‘ is een volledige DNS-oplossende oproep naar gethostbyaddr (3) , en het ‘ s zeer zal waarschijnlijk niet falen in een geval waarin dig
zal slagen. Zie de man-pagina voor getent .
- @Stuart heeft gelijk – i ‘ heb geleerd veel sinds ik dat heb geschreven en een krachtig commando te simpel gemaakt.
getent
blijft mijn favoriet, hoewel ik ook graag dig +short
Antwoord
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n "s/.*[(]\([0-9\.]*\)[)].*/\1/p"
was de oplossing die ik vond zonder DNS-server
Antwoord
Misschien niet de meest beknopte, maar het lijkt robuust en efficiënt te zijn:
# $(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 }
Dit zal een enkele IPv4 uitvoeren IP en retourneer 1
in het geval van een storing, terwijl de uitvoer van stderr wordt gemaskeerd.
U kunt het als volgt gebruiken:
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
Het IP-adres van Google is 216.58.192.46.
Als u in plaats daarvan een IPv6-adres wilt, vervang dan -4
door -6
.
Antwoord
dig +noall +answer +nocomments example.com | awk "{printf "%-36s\t%s\n", $1, $5 }"
Reacties
- Enige context op welke manier dat antwoord verbetert ten opzichte van de reeds bestaande wees geweldig. Laat commandos ook 4 spaties inspringen (zie de markdown-syntaxis).
Antwoord
dig is ook traag, nslookup is veel sneller
nslookup google.com | grep -Po "Address:\s*[0-9.]+" | tail -1 | sed -e "s/Address:\s*//g"
Antwoord
1 regel lost een lijst op van hostnaam
for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk "/^Address: / { print $1 }"); echo $a >> ~/Desktop/ip; done
Antwoord
Ik doe dit de hele tijd op mijn Mac die geen getent
heeft. ping
lijkt een hack. Ik zou ook rekening willen houden met /etc/hosts
.
Dus ik schreef een stomme wrapper voor dns.lookup
voor jullie die Node.js hebben geïnstalleerd om een CLI te bieden:
$ npm install -g lookup-hostname $ lookup google.com 62.243.192.89
Reacties
- 60% kans breuk voordat je in de buurt van een oplossing komt.
- @dotbit kun je uitweiden? Ik ‘ heb dit wekelijks gebruikt sinds ‘ 17 en heb nooit problemen gehad.
- @Jensen maar jij ‘ re de enige ooit, zoals altijd. De rest van ons komt meestal FAIL van de een of andere soort tegen, en altijd.
- ” zoals altijd ” Wat bedoel je daarmee? ” De rest van ons ” Wie ‘ is dat ? ” is FAIL tegengekomen ” Welk specifiek probleem zie je? Ik ‘ ben nieuwsgierig.
Antwoord
Ik niet ” Ik weet de gemakkelijkste manier voor een bash-script, maar als je een hostnaam wilt oplossen en wilt zien of de host actief is, gebruik dan ping
!
ping -a hostname -c 1
Zal ping
een keer de host zijn en de hostnaam omzetten in het IP-adres.
$ 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
Reacties
- ping gebruiken is goed, want iedereen heeft het, maar je moet wel filter het IP-deel uit de uitgangen, als je het in een script wilt gebruiken.
Antwoord
Ja, er zijn al veel antwoorden, maar een oplossing met perl ontbreekt:
perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com
In een bash-script zou het als volgt kunnen worden gebruikt:
#!/bin/bash ipaddr=$(perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com) echo $ipaddr
Modules die hier worden gebruikt, zijn kernmodules, dus zouden overal beschikbaar moeten zijn zonder installatie met CPAN.
Reacties
-
perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null
is veel schoner. maar niemand behalve wij twee gebruiken p ö rl, alle anderen gebruiken natuurlijk Pascal Script.
- Eigenlijk zie ik liever de foutmeldingen als er iets is gaat fout.
Can't call method "addr" on an undefined value
isn ‘ t precies de beste foutmelding, maar kan een hint geven over het probleem.
Antwoord
#!/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! "
Reacties
- De ruby-versie drukt aanhalingstekens af rond het IP-adres — waarschijnlijk moet
print
worden gebruikt in plaats van p
.
- bedankt, @Slaven Rezic en voel je vrij om te stemmen. nogmaals, hier onderaan is het script misschien beter zichtbaar … 😉
Answer
host -t a cisco.com
deze opdracht zal het ip-adres tonen (zal domein naar IP veranderen)
Answer
Naast bovenstaande oplossing, kunt u meerdere hostnamen naar ip vertalen via het onderstaande script, de enige afhankelijkheid is de “ping” -opdracht in de kern 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
Hier is een kleine variatie op de ping
-benadering die rekening houdt met “onbekende host” (door door stderr te leiden) en tr
om het gebruik van sed
regexps te vermijden:
ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}"
Voor het geval dat het is belangrijk om de exit-waarde vast te leggen, dan werkt het volgende (hoewel minder elegant):
ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d "():" | awk "/^PING/{print $3}"
Reacties
- Ik ben dol op deze oplossing, omdat deze werkt zonder extra tools.
Om het antwoord van Chris Down te voltooien en jfgagne-opmerkingen over (mogelijk gekoppelde) aliassen te adresseren, is hier een oplossing die:
- rekening houdt met meerdere IP-adressen
- rekening houdt met een of meer aliassen (CNAME)
- vraagt niet naar
/etc/hosts
-bestand ( in mijn geval wilde ik het niet); om het te doorzoeken, is de python-oplossing van dbernt perfect) -
gebruikt geen awk / sed
dig +short www.alias.com | grep -v "\.$" | head -n 1
Retourneert altijd het eerste IP-adres, of lege tring indien niet opgelost. met versie van dig:
$ dig -v DiG 9.8.1-P1
Reacties
- Bedankt, andere antwoorden gaan ervan uit dat ” dig + short ” altijd retourneert een enkel IP-adres. Ze waren ‘ t goed voor CNAMEs.
php -r "echo gethostbyname("unix.stackexchange.com");"
Reacties
- dit werkt, maar het vereist dat php op je terminal is geïnstalleerd
- kan handig zijn op een typische php docker-container waar ” host “, ” dig ” etc. zijn niet beschikbaar
Ik had dit graag als commentaar willen toevoegen aan Andrew McGregor Re: ping. Het zou me echter niet toestaan, dus ik moet dit als een ander antwoord toevoegen. (Als iemand het in een opmerking kan verplaatsen, voel je dan vrij.)
Dit is een andere variant, alleen met ping en grep :
ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"
grep -E
voor uitgebreide reguliere expressie en grep -o
naar retourneert alleen het overeenkomende deel. de regexp zelf zoekt vier keer naar een of meer cijfers ([0-9]+
) en optioneel een punt (\.?
) ( {4}
)
Je zou :
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
hier “een Bash-recept Ik heb de antwoorden van andere mensen gebruikt – probeer eerst /etc/hosts
, en val dan terug op 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 }
Reacties
- Voor alle duidelijkheid:
getent hosts
isn ‘ t alleen een zoekopdracht in / etc / hosts – het ‘ is een volledige DNS-oplossende oproep naar gethostbyaddr (3) , en het ‘ s zeer zal waarschijnlijk niet falen in een geval waarindig
zal slagen. Zie de man-pagina voor getent . - @Stuart heeft gelijk – i ‘ heb geleerd veel sinds ik dat heb geschreven en een krachtig commando te simpel gemaakt.
getent
blijft mijn favoriet, hoewel ik ook graagdig +short
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n "s/.*[(]\([0-9\.]*\)[)].*/\1/p"
was de oplossing die ik vond zonder DNS-server
Misschien niet de meest beknopte, maar het lijkt robuust en efficiënt te zijn:
# $(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 }
Dit zal een enkele IPv4 uitvoeren IP en retourneer 1
in het geval van een storing, terwijl de uitvoer van stderr wordt gemaskeerd.
U kunt het als volgt gebruiken:
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
Het IP-adres van Google is 216.58.192.46.
Als u in plaats daarvan een IPv6-adres wilt, vervang dan -4
door -6
.
dig +noall +answer +nocomments example.com | awk "{printf "%-36s\t%s\n", $1, $5 }"
Reacties
- Enige context op welke manier dat antwoord verbetert ten opzichte van de reeds bestaande wees geweldig. Laat commandos ook 4 spaties inspringen (zie de markdown-syntaxis).
dig is ook traag, nslookup is veel sneller
nslookup google.com | grep -Po "Address:\s*[0-9.]+" | tail -1 | sed -e "s/Address:\s*//g"
1 regel lost een lijst op van hostnaam
for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk "/^Address: / { print $1 }"); echo $a >> ~/Desktop/ip; done
Ik doe dit de hele tijd op mijn Mac die geen getent
heeft. ping
lijkt een hack. Ik zou ook rekening willen houden met /etc/hosts
.
Dus ik schreef een stomme wrapper voor dns.lookup
voor jullie die Node.js hebben geïnstalleerd om een CLI te bieden:
$ npm install -g lookup-hostname $ lookup google.com 62.243.192.89
Reacties
- 60% kans breuk voordat je in de buurt van een oplossing komt.
- @dotbit kun je uitweiden? Ik ‘ heb dit wekelijks gebruikt sinds ‘ 17 en heb nooit problemen gehad.
- @Jensen maar jij ‘ re de enige ooit, zoals altijd. De rest van ons komt meestal FAIL van de een of andere soort tegen, en altijd.
- ” zoals altijd ” Wat bedoel je daarmee? ” De rest van ons ” Wie ‘ is dat ? ” is FAIL tegengekomen ” Welk specifiek probleem zie je? Ik ‘ ben nieuwsgierig.
Ik niet ” Ik weet de gemakkelijkste manier voor een bash-script, maar als je een hostnaam wilt oplossen en wilt zien of de host actief is, gebruik dan ping
!
ping -a hostname -c 1
Zal ping
een keer de host zijn en de hostnaam omzetten in het IP-adres.
$ 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
Reacties
- ping gebruiken is goed, want iedereen heeft het, maar je moet wel filter het IP-deel uit de uitgangen, als je het in een script wilt gebruiken.
Ja, er zijn al veel antwoorden, maar een oplossing met perl ontbreekt:
perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com
In een bash-script zou het als volgt kunnen worden gebruikt:
#!/bin/bash ipaddr=$(perl -MSocket -MNet::hostent -E "say inet_ntoa((gethost shift)->addr)" unix.stackexchange.com) echo $ipaddr
Modules die hier worden gebruikt, zijn kernmodules, dus zouden overal beschikbaar moeten zijn zonder installatie met CPAN.
Reacties
-
perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null
is veel schoner. maar niemand behalve wij twee gebruiken p ö rl, alle anderen gebruiken natuurlijk Pascal Script. - Eigenlijk zie ik liever de foutmeldingen als er iets is gaat fout.
Can't call method "addr" on an undefined value
isn ‘ t precies de beste foutmelding, maar kan een hint geven over het probleem.
#!/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! "
Reacties
- De ruby-versie drukt aanhalingstekens af rond het IP-adres — waarschijnlijk moet
print
worden gebruikt in plaats vanp
. - bedankt, @Slaven Rezic en voel je vrij om te stemmen. nogmaals, hier onderaan is het script misschien beter zichtbaar … 😉
host -t a cisco.com
deze opdracht zal het ip-adres tonen (zal domein naar IP veranderen)
Naast bovenstaande oplossing, kunt u meerdere hostnamen naar ip vertalen via het onderstaande script, de enige afhankelijkheid is de “ping” -opdracht in de kern 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
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>
antwoord is ergens daar beneden bij de bodem. Het ‘ is het eenvoudigste, vereist geen extra pakketten en is gemakkelijker te ontleden vanuit een Bash-script.getent hosts somehost
suggereert wanneer dit uitvoert terwijl opsomehost
produceert een IPv6-adres , dat verschilt van de manier waarop de meeste andere tools (ping
,ssh
tenminste) namen op, en breekt sommige dingen. Gebruik deahosts
in plaats vanhosts
.ahostsv4
) of IPv6 (ahostsv6
) adressen? Persoonlijk vind ik niets mis met het niet-specifieke verzoek om IPv6 te retourneren. Uw code moet worden voorbereid. IPv6 is al meer dan 20 jaar beschikbaar.hosts
, en tot nu toe hebben 4 mensen de opmerking van vinc17 ‘ geüpgraded waarin de pijn wordt uitgedrukt die wordt veroorzaakt door ” plotseling IPv6 “. Voorbereid zijn op IPv6 is niet altijd het probleem: veel programmas hebben een manier nodig om te bepalen of twee namen / adressen naar dezelfde host verwijzen. Ze kunnen ofwel eenvoudige string-matching gebruiken, of ze moeten veel weten over het netwerk om het ” true ” antwoord te vinden. Het laatste is een mijnenveld, zoveel programmas en systemen van derden – waar ik geen controle over heb – gebruiken het eerste.