Mikä on ytimekkäin tapa ratkaista isäntänimi IP-osoitteeksi Bash-komentosarjassa? Käytän Arch Linux .
Kommentit
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 verkkotunnuksilledig +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ä), ’ haluathost 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
taidig
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 kuinnslookup
), 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
kanssagetent
. -
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
- Tein bash-toiminnon pysyäksesi bashrc-tiedostossa tästä vastauksesta: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
-
python3 -c 'import socket; print(socket.gethostbyname("www.example.com"))'
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 :
-
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
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ätbindutils
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
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.
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.
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ä
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}
)
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
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, josdig
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ösdig +short
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
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
.
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).
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"
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
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.
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.
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.
#!/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ä … 😉
host -t a cisco.com
tämä komento näyttää IP-osoitteen (palauttaa toimialueen IP-osoitteeksi)
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
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ä.getent hosts somehost
, kun ajaa tätä ollessaansomehost
tuottaa IPv6-osoitteen , joka eroaa useimpien muiden työkalujen tavasta (ping
,ssh
ainakin) ratkaise nimet ja rikkoo joitain asioita. Käytäahosts
-kohtaahosts
-tekstin sijaan.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.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ä.