Kuinka voin ratkaista isäntänimen IP-osoitteeksi Bash-komentosarjassa?

Mikä on ytimekkäin tapa ratkaista isäntänimi IP-osoitteeksi Bash-komentosarjassa? Käytän Arch Linux .

Kommentit

  • Häpeä, että getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> vastaa on jonnekin siellä lähellä pohjaa. Se on ’ yksinkertaisin, ei vaadi ylimääräisiä paketteja, ja sitä on helpompi jäsentää myös Bash-skripteistä.
  • @ 0xC0000022L: Uusi häpeä on, että vastauksessa ehdotetaan getent hosts somehost, kun ajaa tätä ollessaan somehost tuottaa IPv6-osoitteen , joka eroaa useimpien muiden työkalujen tavasta (ping, ssh ainakin) ratkaise nimet ja rikkoo joitain asioita. Käytä ahosts -kohtaa hosts -tekstin sijaan.
  • @j_random_hacker: kuka estää sinua pyytämästä nimenomaisesti IPv4 (ahostsv4) tai IPv6 (ahostsv6) osoitteet? Henkilökohtaisesti en löydä mitään vikaa siinä, että epäspesifinen pyyntö palauttaa IPv6: n. Koodisi tulisi olla valmis. IPv6 on ollut siellä jo yli 20 vuotta.
  • @ 0xC0000022L: Kukaan ” ei pidä minua ” niin, mutta vastaus ehdottaa nimenomaisesti hosts, ja toistaiseksi 4 ihmistä on äänestänyt vinc17 ’ -kommenttia, joka ilmaisee ” yhtäkkiä IPv6 ”. Valmistautuminen IPv6: een ei ole aina ongelma: monet ohjelmat tarvitsevat tavan selvittää, viittaavatko kaksi nimeä / osoitetta samaan isäntään. He voivat joko käyttää yksinkertaista merkkijonovastaavuutta tai heidän on tiedettävä paljon verkosta löytääkseen ” true ” -vastauksen. Jälkimmäinen on miinakenttä, niin monet kolmansien osapuolien ohjelmat ja järjestelmät – joita en voi valvoa – käyttävät ensimmäisiä.

Vastaa

Voit käyttää getent, jonka mukana tulee glibc (joten sinulla on melkein varmasti se Linuxissa) . Tämä ratkaisee gethostbyaddr / gethostbyname2: n, ja tarkistaa myös /etc/hosts / NIS / etc:

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

Tai kuten Heinzi sanoi alla, voit käyttää dig argumentin +short kanssa (kyselee DNS-palvelimia suoraan, ei katso /etc/hosts / NSS / etc):

dig +short unix.stackexchange.com 

Jos dig +short ei ole käytettävissä, kukaan seuraavien pitäisi toimia. Kaikki nämä kyselevät DNS: ää suoraan ja jättävät huomiotta muut ratkaisutavat:

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 }" 

Jos haluat tulostaa vain yhden IP-osoitteen, lisää exit -komento awk” työnkulkuun.

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 }" 

Kommentit

  • Oletuksena digin käyttö toimii vain ipv4: n kanssa, jossa isäntä antaa sekä ipv4- että ipv6-vastaukset. Tämä voi olla odottamatonta. Voit kokeilla 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 ei toimi, jos CNAME on, se ei palauta IP-osoitetta.
  • Joskus host voidaan aikakatkaista eikä palauttaa mitään. Joillekin verkkotunnuksille dig +short voi palauttaa verkkotunnuksen aliaksen ensimmäiselle riville. Varmista siis, että lähtö on IPv4 osoite, käytä dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
  • getent hosts <host> on väärä, kuten instan ce se voi antaa IPv6-osoitteen, kun taas IPv6 ei toimi ’. Oikea ratkaisu on käyttää getent ahosts <host> -testausta tarvittaessa IPv6: n ja IPv4: n kokeilemiseen.
  • Mainitsemisen arvoinen: isäntä, dig ja nslookup näyttävät puhuvan suoraan lueteltujen palvelimien kanssa resolv.conf-tiedostossa kun taas ” getent hosts ” kunnioittavat sekä paikallista isäntätiedostoa että kirjastotason välimuistia (kuten nscd), jos se on käytössä .

Vastaa

Kanssa host dnsutils -paketti:

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

( Korjattu paketin nimi kommenttien mukaan. Muistiinpanona muille jakeluille on host eri paketeissa: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

Kommentit

  • Katso alla oleva resolip-merkintä, jos sinun on ratkaistava jokin muu kuin DNS: ssä (esim. / Etc / hosts)
  • Huomaa, että host palauttaa joskus monirivisen lähdön (uudelleenohjausten yhteydessä), ’ haluat host unix.stackexchange.com | tail -n1 jos haluat vain IP-osoiterivin.
  • ” -palvelimesta ” on useita versioita, joilla on eri ulostulomuodot. Esimerkiksi. useimmilla järjestelmillä näyttää olevan BIND9-versio, mutta Ubuntu 10.04 LTS -palvelimellani on jotenkin täysin erilainen versio.
  • jos sinulla ’ ei ole host tai dig asennettu, voit käyttää sen sijaan aina käytettävissä olevaa pingiä: ping unix.stackexchange.com -c 1 -q 2>&1 | grep -Po "(\d{1,3}\.){3}\d{1,3}" tämä ei tarvitse mitään ylimääräisiä paketteja asennetaan useimpiin Unix / Linux-sovittimiin.
  • Tämä vastaus ansaitsee vakavan aliarvostuksen. host on DNS-työkalu (samanlainen kuin nslookup), joten se etsii vain DNS-palvelimia, ei esim. /etc/hosts. Joten se ei ole vastaus OP ’ -kysymykseen.

Vastaa

Minulla on koneessani työkalu, joka näyttää suorittavan työn. Man -sivulta näyttää siltä, että sen mukana tulee mysql … Näin voit käyttää sitä:

resolveip -s unix.stackexchange.com 64.34.119.12 

Tämän työkalun palautusarvo on erilainen kuin 0 jos isäntänimeä ei voida ratkaista:

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

PÄIVITÄ Fedorassa sen mukana tulee 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 

Luulen, että se aiheuttaisi oudon riippuvuuden komentosarjaasi …

Kommentit

  • Tämä näyttää olevan ainoa ratkaisu täällä, joka käyttää käyttöjärjestelmän ’ rakennusta resolverissä – joten se toimii / etc / hosts sekä DNS.
  • getent, kuten toisessa vastauksessa on kuvattu, tarkastelee myös tiedostoa / etc / hosts ja mukana tulee glibc, joten ei ole riippuvuuksia Linux-järjestelmästä.
  • En käytä resolipia, koska luot riippuvuuden toisesta paketista. getent on asennettu oletuksena. isäntä, nslookup ja dig ovat kaikki valinnaisissa paketeissa. Käytä ehdottomasti getent-komentosarjaa.
  • Pidän tästä vastauksesta, mutta se ’ ei palauta ipv6: ta

Vastaa

Seuraava komento dig -toimintoa käyttämällä voit lukea tuloksen suoraan ilman sed / awk / jne. taika:

$ dig +short unix.stackexchange.com 64.34.119.12 

dig sisältyy myös ryhmään dnsutils paketti.


Huomautus : dig palautusarvo on 0, vaikka nimeä ei voida ratkaista. Siksi sinun on tarkistettava, onko lähtö tyhjä, palautusarvon tarkistamisen sijaan:

hostname=unix.stackexchange.com ip=`dig +short $hostname` if [ -n "$ip" ]; then echo IP: $ip else echo Could not resolve hostname. fi 

Huomautus 2 : Jos isäntänimellä on useita IP-osoitteita (kokeile esimerkiksi debian.org), ne kaikki Tämä ”ongelma” vaikuttaa kaikkiin tähän kysymykseen toistaiseksi mainituihin työkaluihin:

kommentit

  • Huomaa, että jos toimialueella on CNAME-merkintä sen verkkotunnus voidaan tulostaa ensimmäiselle riville IP-osoitteen sijaan.

Vastaa

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

Kommentit

  • Harkitse myös ahosts, ahostsv4, ahostsv6 kanssa getent.
  • cut ei getent ’ s, jotka käyttävät \t -sarakkeiden erottamista. Näin on Solariksessa.
  • @ceving: Solalla ris saatat joutua suorittamaan cut ilman -d (oletuksena \t erottimena). Linuxissa ’ välilyöntejä, joten yllä oleva rivi toimii.

Vastaa

Tähän mennessä annetut ratkaisut toimivat enimmäkseen yksinkertaisemmassa tapauksessa: isäntänimi ratkaisee suoraan yhdeksi IPv4-osoitteeksi. Tämä voi olla ainoa tapaus, jossa sinun on ratkaistava isäntänimet, mutta jos ei, alla on keskustelu joistakin tapauksista, joita saatat joutua käsittelemään.

Chris Down ja Heinzi keskustelivat lyhyesti tapauksesta, jossa isäntänimi ratkaistaan. useampaan kuin yhteen IP-osoitteeseen. Tällöin (ja muissa alla olevissa) peruskomentosarja olettaen, että isäntänimi ratkaisee suoraan yhden IP-osoitteen, voi rikkoutua. Alla esimerkki isäntänimestä, joka ratkaisee useamman kuin yhden IP-osoitteen:

$ 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 

Mutta mikä on www.l.google.com ? Täällä alias -tapa on esiteltävä. Tarkistetaan seuraavat esimerkit:

$ 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 

Joten www.google.com ei ratkaise suoraan IP-osoitteita, vaan alias, joka itse ratkaisee useita IP-osoitteita. Lisätietoja aliaksista on täällä . Tietysti tapaus, jossa aliaksella on yksi IP-osoite, on mahdollista , kuten alla on esitetty:

$ 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 

Mutta voiko aliaksia ketjuttaa?Vastaus on kyllä:

$ 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 

En löytänyt esimerkkiä, jossa isäntänimi ratkaistaan aliakseksi, joka ei ratkaise IP-osoitetta, mutta mielestäni

Enemmän kuin useita IP-osoitteita ja aliaksia, onko olemassa muita erikoistapauksia … entä IPv6? Voit kokeilla:

$ 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 

Missä isäntänimi ipv6.google.com on vain IPv6-isäntänimi. Entä kaksoisnipin isäntänimet:

$ 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:: 

Jälleen IPv6: sta, jos isäntäsi on vain IPv4, voit silti ratkaista IPv6-osoitteet (testattu vain IPv4 WinXP: llä ja osoitteessa ipv6.google.com voit kokeilla sitä Linuxissa). Tässä tapauksessa ratkaisu onnistuu, mutta ping-komento epäonnistuu tuntemattoman isäntävirhesanoman yhteydessä. Tämä voi olla tapaus, jossa komentosarjat epäonnistuvat.

Toivon, että nämä huomautukset olivat hyödyllisiä.

Kommentit

  • Mikä hieno täydentää hyväksyttyä vastausta ja näyttää kaikki reunatapaukset, joita voidaan haluta käsitellä komentosarjoissa. Versiossani host ei edes ilmoiteta, että ” on osoite ” laatikoilleni.

Vastaa

Alias-ongelmien välttämiseksi ja aina yhden IP-osoitteen saamiseksi käyttövalmiiksi:

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

Kommentit

Vastaus

ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//" 

toimii ilman riippuvuutta muista järjestelmistä (ja / etc / hosts -palvelimessa määritetyistä isännistä)

Kommentit

  • Tarvitsin pingin käytön, koska tarvitsen isäntätiedoston arvon, mutta sed-mallin jäsentäminen oikein, mutta tämä toimi pingillä – q -c 1 -t 1 sinun_isäntä_tätä | grep PING | sed -e ” s / ^ [^ (] * [(] // ” | sed -e ” s / [)]. * $ // ”
  • Kotiverkossani olevan ongelman, kuten myhostname.local, ratkaisemiseksi tämä toimii niin tämä on paras vastaus.
  • Saanko ehdottaa tätä myös: ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
  • getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> toimii myös ilmoituksiin /etc/hosts sisällä … ja se ’ s go-to-tool kaikenlaisille järjestelmätietokannoille (passwd, ryhmä, aliakset, palvelut).

Vastaa

Yksinkertainen mutta hyödyllinen :

  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

Kaikki komennot ratkaisevat IP-osoitteen, jos isäntä on edelleen olemassa. Jos isäntä osoittaa CNAME: lle, se saa myös siinä olevan IP: n. tapaus.

Ensimmäinen komento palauttaa ratkaistun IPv4-osoitteen.

Toinen komento palauttaa res olved IPv6-osoite.

Kolmas komento palauttaa omistajan ensisijaisen osoitteen, joka voi olla joko IPv4- tai IPv6-osoite.

Kommentit

  • Ylivoimaisesti yksinkertaisin. Ja se on käytettävissä oletuksena. Ei kuten host, jotka edellyttävät bindutils

vastauksen

Tässä on pieni muunnelma ping -lähestymistavasta, joka ottaa huomioon ”tuntemattoman isännän” (johtamalla stderrin läpi) ja käyttää tr sed regexpsin käytön välttämiseksi:

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

Siinä tapauksessa on tärkeää kaapata poistumisarvo, seuraavat toimivat (vaikkakin vähemmän tyylikkäitä):

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

kommentit

  • Rakastan tätä ratkaisua, koska se toimii ilman ylimääräisiä työkaluja.

Vastaa

Täytä Chris Downin vastaus ja pyydä jfgagne-kommentteja (mahdollisesti ketjutetuista) aliaksista. Tässä on ratkaisu, joka:

  • ottaa huomioon useita IP-osoitteita
  • ottaa huomioon yksi tai useampi alias (CNAME)
  • ei kysele /etc/hosts -tiedostoa ( minun tapauksessani en halunnut sitä); kyselemään sitä, dbernt: n python-ratkaisu on täydellinen)
  • ei käytä awk / sed

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

Palauttaa aina ensimmäisen IP-osoitteen tai tyhjän tringin, jos sitä ei ole ratkaistu. dig-versiolla:

 $ dig -v DiG 9.8.1-P1 

kommentit

  • Kiitos, muissa vastauksissa oletetaan, että ” dig + short ” palaa aina yksi IP-osoite. Ne eivät ’ t kirjaa CNAME-tunnuksia.

vastaus

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

kommentit

  • tämä toimii, mutta se edellyttää, että php on asennettu päätelaitteeseesi.
  • voi olla hyödyllinen tyypillisessä php-telakointiasemassa, jossa ” isäntä ”, ” dig ” jne. eivät ole käytettävissä

Vastaus

Olisin halunnut lisätä tämän kommenttina Andrew McGregor Re: pingiin. Se ei kuitenkaan anna minun olla, joten minun on lisättävä tämä uutena vastauksena. (Jos joku voi siirtää sen kommenttiin, voit vapaasti tehdä sen.)

Tämä on toinen muunnos, joka käyttää vain pingiä ja grepiä :

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

grep -E laajennetulle säännölliselle lausekkeelle ja grep -o palauta vain vastaava osa. regexp itse etsii yhtä tai useampaa numeroa ([0-9]+) ja vaihtoehtoisesti pistettä (\.?) neljä kertaa ( {4})

Vastaa

Voit käyttää 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 

Vastaa

täällä ”Bash-resepti Valmistin muita kansan vastauksia – ensin yrittää /etc/hosts, sitten palaa takaisin nslookupiin:

 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 }  

Kommentit

  • Selvyyden vuoksi getent hosts ei ole ’ ei ole vain haku / etc / hosts – se ’ on täysi DNS-ratkaisu kutsu numeroon gethostbyaddr (3) , ja se ’ s ei todennäköisesti onnistu, jos dig onnistuu. Katso getent-man-sivu .
  • @Stuart on oikeassa – olen oppinut ’ olen oppinut paljon sen kirjoittamisen jälkeen ja yksinkertaisti voimakasta komentoa. getent on edelleen suosikkini, vaikka pidän myös dig +short

vastauksesta

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

oli ratkaisu, jonka löysin ilman DNS-palvelinta

Vastaa

Ehkä ei kaikkein ytimekäs, mutta se näyttää olevan vankka ja tehokas:

# $(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 } 

Tämä tuottaa yhden IPv4: n IP sekä palauta 1 vikatilanteessa samalla, kun peität stderr-lähdön.

Voit käyttää sitä näin:

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 

Googlen IP-osoite on 216.58.192.46.

Jos haluat sen sijaan IPv6-osoitteen, korvaa -4 vain -6.

Vastaa

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

Kommentit

  • Jossakin yhteydessä, miten tämä vastaus paranee jo olemassa oleviin vastauksiin verrattuna ole hieno. Sisennä myös komennot 4 välilyönnillä (vrt. Merkintäsyntaksi).

Vastaa

dig on liian hidas, nslookup on paljon nopeampi

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

Vastaa

1 rivi ratkaisee luettelon isäntänimen nimi

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

vastaus

Teen tämän koko ajan Mac, jossa ei ole getent. ping näyttää hakkeroinnilta. Haluan ottaa huomioon myös /etc/hosts.

Joten kirjoitin tyhmän kääreen sivulle dns.lookup sinä, jolla Node.js on asennettu CLI: n tarjoamiseksi:

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

kommentit

  • 60% mahdollisuus ennen kuin pääset lähelle ratkaisua.
  • @dotbit voisitteko kertoa tarkemmin? Olen ’ käyttänyt tätä viikoittain ’ 17 lähtien, eikä minulla ole koskaan ollut mitään ongelmia.
  • @Jensen, mutta sinä ’ on ainoa koskaan, kuten aina. Loput meistä törmäävät yleensä jonkinlaiseen epäonnistumiseen ja aina.
  • ” kuten aina ” Mitä tarkoitat tällä? ” Muut meistä ” Kuka ’ s ? ” törmää FAIL ” Mitä tiettyä ongelmaa näet? Olen ’ utelias.

Vastaa

en ” t tiedä helpoin tapa bash-komentosarjalle, mutta jos haluat ratkaista isäntänimen ja nähdä, onko isäntä käytössä, käytä ping!

ping -a hostname -c 1 

ping isännöi yhden kerran ja ratkaisee isäntänimen IP-osoitteeksi.

$ 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 

Kommentit

  • pingin käyttäminen on hyvä, koska kaikilla on se, mutta sinun täytyy suodata IP-osa lähdöistä, jos haluat käyttää sitä komentosarjassa.

Vastaa

Kyllä, vastauksia on jo monia, mutta perl-ratkaisu puuttuu:

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

Bash-komentosarjassa sitä voidaan käyttää seuraavasti:

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

Tässä käytetyt moduulit ovat ydinmoduuleja, joten niiden pitäisi olla saatavilla kaikkialla ilman asennusta CPAN: n kanssa.

Kommentit

  • perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null on paljon puhtaampaa. mutta kukaan muu kuin me kaksi ei käytä p ö rl, kaikki muut käyttävät tietysti Pascal-komentosarjaa.
  • Itse asiassa mieluummin näen virheilmoitukset jos mitään menee väärin. Can't call method "addr" on an undefined value ei ole ’ ei tarkalleen paras virheilmoitus, mutta voi antaa vihjeen ongelmasta.

vastaus

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

kommentit

  • Rubiiniversio tulostaa lainausmerkit IP-osoitteen ympärille — todennäköisesti print tulisi käyttää p: n sijaan.
  • thx, @Slaven Rezic ja äänestä vapaasti. sitten taas, tässä alaosassa komentosarja voi olla paremmin näkyvissä … 😉

Vastaa

host -t a cisco.com 

tämä komento näyttää IP-osoitteen (palauttaa toimialueen IP-osoitteeksi)

Vastaa

Yllä olevan ratkaisun lisäksi voit kääntää useita isäntänimiä ip: ksi alla olevan komentosarjan kautta, ainoa riippuvuus on ”ping” -komento Unix-ytimessä:

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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *