Bagaimana saya bisa menyelesaikan nama host ke alamat IP dalam skrip Bash?

416

Apa cara paling ringkas untuk menyelesaikan nama host ke alamat IP dalam skrip Bash? Saya menggunakan Arch Linux .

Eugene Yarmash
sumber
21
Malu bahwa getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>jawabannya ada di suatu tempat di dekat bagian bawah. Ini adalah yang paling sederhana, tidak memerlukan paket tambahan dan lebih mudah untuk diuraikan dari skrip Bash juga.
0xC0000022L
1
@ 0xC0000022L: Malu yang baru adalah bahwa jawaban itu menyarankan getent hosts somehost, ketika menjalankan ini sementarasomehost akan menghasilkan alamat IPv6 , yang berbeda dari bagaimana sebagian besar alat lain ( ping, sshsetidaknya) menyelesaikan nama, dan merusak beberapa hal. Gunakan ahostsbukan hosts.
j_random_hacker
@j_random_hacker: siapa yang mencegah Anda meminta alamat khusus IPv4 ( ahostsv4) atau IPv6 ( ahostsv6)? Secara pribadi saya tidak menemukan kesalahan dengan permintaan tidak spesifik untuk mengembalikan IPv6. Kode Anda harus disiapkan. IPv6 telah ada selama lebih dari 20 tahun sekarang.
0xC0000022L
@ 0xC0000022L: Tidak ada yang "membuat saya" melakukan itu, tetapi jawabannya secara khusus menyarankan hosts, dan sejauh ini 4 orang telah meningkatkan komentar vinc17 yang mengungkapkan rasa sakit yang disebabkan oleh "tiba-tiba IPv6". Bersiap untuk IPv6 tidak selalu menjadi masalah: banyak program membutuhkan cara untuk menentukan apakah dua nama / alamat merujuk ke host yang sama. Mereka dapat menggunakan pencocokan string sederhana, atau mereka harus tahu banyak tentang jaringan untuk menemukan jawaban "benar". Yang terakhir adalah ladang ranjau, begitu banyak program dan sistem pihak ke-3 - yang saya tidak punya kendali atas - menggunakan yang pertama.
j_random_hacker

Jawaban:

533

Anda dapat menggunakan getent, yang datang dengan glibc(sehingga Anda hampir pasti memilikinya di Linux). Ini diselesaikan menggunakan gethostbyaddr / gethostbyname2, dan juga akan memeriksa /etc/hosts/ NIS / etc:

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

Atau, seperti yang dikatakan Heinzi di bawah ini, Anda dapat menggunakan argumen ( digmeminta +shortserver DNS secara langsung, tidak melihat /etc/hosts/ NSS / etc):

dig +short unix.stackexchange.com

Jika dig +shorttidak tersedia, salah satu dari yang berikut ini akan berfungsi. Semua DNS permintaan ini secara langsung dan mengabaikan cara resolusi lain:

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

Jika Anda hanya ingin mencetak satu IP, tambahkan exitperintah ke awkalur kerja.

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'
Chris Down
sumber
2
Secara default, menggunakan dig hanya berfungsi dengan ipv4, di mana host memberikan jawaban ipv4 dan ipv6. Ini mungkin tidak terduga. Anda dapat mencoba host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com.
jfg956
6
DIG tidak berfungsi, jika CNAME tidak akan mengembalikan IP.
sorin
4
Terkadang, hostwaktu habis dan tidak menghasilkan apa-apa. Untuk beberapa domain, dig +shortdapat mengembalikan alias domain di baris pertama. Jadi, untuk memastikan outputnya adalah alamat IPv4, gunakan dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao
9
Penggunaannya getent hosts <host>tidak benar, karena misalnya ia dapat memberikan alamat IPv6 sementara IPv6 tidak berfungsi. Solusi yang benar adalah menggunakan getent ahosts <host>untuk mencoba IPv6 dan IPv4 jika diperlukan.
vinc17
5
Layak disebutkan: host, gali dan nslookup tampaknya langsung berbicara ke server yang terdaftar di resolv.conf, sedangkan "getent hosts" menghormati file host lokal dan caching level pustaka (seperti nscd) jika diaktifkan.
Saustrup
141

Dengan hostdari paket dnsutils :

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

( Nama paket terkoreksi sesuai komentar. Sebagai catatan distribusi lain memiliki hostdalam paket yang berbeda: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)

manatwork
sumber
4
Apakah maksud Anda dnsutils ? Bagaimanapun, hostbekerja dengan baik, terima kasih
Eugene Yarmash
Kamu mungkin benar. Saya tidak punya Arch di sini untuk memeriksa. (Dimaksudkan untuk menambahkan komentar kemudian menyebutkan ini, tetapi jawabannya sudah terbalik jadi saya kira saya memahaminya ...)
manatwork
1
Lihat entri resolip di bawah ini jika Anda perlu menyelesaikan sesuatu yang tidak ada dalam DNS (mis. / Etc / hosts)
Gavin Brock
2
Perlu diketahui bahwa hostkadang - kadang mengembalikan output multi-line (dalam kasus pengalihan), Anda akan ingin host unix.stackexchange.com | tail -n1jika Anda hanya ingin baris dengan alamat IP.
Edward Coffey
3
Jawaban ini layak mendapat downvote yang serius. hostadalah alat DNS (mirip dengan nslookup) sehingga hanya mencari host di DNS, bukan di mis /etc/hosts. Jadi ini BUKAN jawaban untuk pertanyaan OP.
peterh
54

Saya memiliki alat di mesin saya yang tampaknya melakukan pekerjaan itu. Halaman manual menunjukkan tampaknya datang dengan mysql ... Ini adalah bagaimana Anda dapat menggunakannya:

resolveip -s unix.stackexchange.com
64.34.119.12

Nilai pengembalian alat ini berbeda dari 0 jika nama host tidak dapat diselesaikan:

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

PEMBARUAN Pada fedora, ia datang dengan server 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

Saya kira itu akan membuat ketergantungan aneh untuk skrip Anda ...

greg0ire
sumber
6
Ini tampaknya menjadi satu-satunya solusi di sini yang menggunakan build in resolver OS - sehingga berfungsi untuk / etc / hosts serta DNS.
Gavin Brock
8
getent, sebagaimana dirinci dalam jawaban lain, juga melihat / etc / hosts, dan dilengkapi dengan glibc, sehingga tidak memiliki dependensi pada sistem Linux.
Asfand Qazi
44

Perintah berikut menggunakan digmemungkinkan Anda untuk membaca hasilnya secara langsung tanpa sed / awk / etc. sihir:

$ dig +short unix.stackexchange.com
64.34.119.12

digjuga termasuk dalam dnsutilspaket.


Catatan : digmemiliki nilai balik 0, meskipun nama tidak dapat diselesaikan. Dengan demikian, Anda perlu memeriksa apakah output kosong daripada memeriksa nilai kembali:

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

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

Catatan 2 : Jika nama host memiliki beberapa alamat IP (coba debian.org, misalnya), semuanya akan dikembalikan. "Masalah" ini memengaruhi semua alat yang disebutkan dalam pertanyaan ini sejauh ini:

Heinzi
sumber
2
Perhatikan bahwa jika suatu domain memiliki entri CNAME, domainnya dapat dicetak pada baris pertama alih-alih alamat IP.
pcworld
40
getent hosts unix.stackexchange.com | cut -d' ' -f1
sborsky
sumber
4
Pertimbangkan juga ahosts, ahostsv4, ahostsv6dengan getent.
0xC0000022L
cuttidak akan untuk getent, yang digunakan \tuntuk memisahkan kolom. Ini adalah kasus di Solaris.
ceving
1
@ceving: Pada Solaris Anda mungkin harus menjalankan cuttanpa -d(default \tsebagai pembatas). Di Linux itu spasi, jadi baris di atas berfungsi.
sborsky
27

Solusi yang diberikan sejauh ini sebagian besar berfungsi dalam kasus yang lebih sederhana: nama host langsung diselesaikan ke satu alamat IPv4. Ini mungkin satu-satunya kasus di mana Anda perlu menyelesaikan nama host, tetapi jika tidak, di bawah ini adalah diskusi tentang beberapa kasus yang mungkin perlu Anda tangani.

Chris Down dan Heinzi secara singkat membahas kasus di mana nama host diputuskan untuk lebih dari satu alamat IP. Dalam hal ini (dan yang lainnya di bawah), skrip dasar dengan asumsi bahwa nama host secara langsung memutuskan ke satu alamat IP mungkin rusak. Di bawah ini, contoh dengan nama host yang diselesaikan lebih dari satu alamat 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

Tapi apa itu www.l.google.com? Di sinilah kasus alias perlu diperkenalkan. Mari kita periksa contoh di bawah ini:

$ 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

Jadi www.google.comtidak langsung menyelesaikan ke alamat IP, tetapi ke alias yang itu sendiri memutuskan untuk beberapa alamat IP. Untuk informasi lebih lanjut tentang alias, periksa di sini . Tentu saja, kasus di mana alias memiliki alamat IP tunggal dimungkinkan, seperti yang ditunjukkan di bawah ini:

$ 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

Tapi bisakah alias dirantai? Jawabannya iya:

$ 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

Saya tidak menemukan contoh di mana nama host diselesaikan ke alias yang tidak menyelesaikan ke alamat IP, tapi saya pikir kasusnya mungkin terjadi.

Lebih dari beberapa alamat IP dan alias, apakah ada beberapa kasus khusus lainnya ... bagaimana dengan IPv6? Kamu bisa mencoba:

$ 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

Di mana nama host ipv6.google.comadalah nama host khusus IPv6. Bagaimana dengan tumpukan ganda nama host:

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

Lagi tentang IPv6, jika host Anda hanya IPv4, Anda masih dapat menyelesaikan alamat IPv6 (diuji pada IPv4 hanya WinXP dan dengan ipv6.google.com, Anda dapat mencobanya di Linux). Dalam hal ini, resolusi berhasil, tetapi ping gagal dengan pesan kesalahan host yang tidak dikenal . Ini mungkin merupakan kasus di mana skrip Anda gagal.

Saya harap komentar itu bermanfaat.

jfg956
sumber
2
Sungguh pelengkap yang bagus untuk jawaban yang diterima, menunjukkan semua kasus tepi yang mungkin ingin ditangani seseorang dalam penulisan skrip. Versi saya hostbahkan tidak menyatakan "memiliki alamat" untuk kotak saya.
Mihai Danila
21

Untuk menghindari masalah dengan alias dan selalu mendapatkan satu alamat IP yang siap digunakan:

python -c 'import socket; print socket.gethostbyname("www.example.com")'
dbernt
sumber
Saya membuat fungsi bash untuk tetap di bashrc saya dari jawaban ini: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
Bryce
18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

bekerja tanpa ketergantungan pada sistem lain (dan untuk host yang ditentukan di / etc / hosts)

Andrew McGregor
sumber
2
Penggunaan ping adalah apa yang saya butuhkan karena saya membutuhkan nilai dari file hosts tetapi pola sed parsing dengan benar tetapi ini berfungsi ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s /[)[.*$//"
ManiacZX
1
Untuk menyelesaikan sesuatu di jaringan rumah saya seperti myhostname.local ini berfungsi jadi bagi saya ini adalah jawaban terbaik.
Matt Friedman
1
Bolehkah saya menyarankan ini juga:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Matt Friedman
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>bekerja untuk deklarasi di dalam /etc/hosts, juga ... dan itu yang alat go-to-untuk semua jenis sistem database (passwd, kelompok, alias, jasa).
0xC0000022L
17

Sederhana namun bermanfaat:

  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

Semua perintah akan menyelesaikan alamat IP jika host masih ada. Jika host menunjuk ke CNAME, ia juga akan mendapatkan IP dalam kasus itu.

Perintah pertama mengembalikan alamat IPv4 yang diselesaikan

Perintah kedua mengembalikan alamat IPv6 yang diselesaikan

Perintah ketiga akan mengembalikan alamat yang diinginkan pemilik apa yang mungkin alamat IPv4 atau IPv6.

Tom Freudenberg
sumber
Sejauh ini yang paling sederhana. Dan tersedia secara default. Tidak seperti hostitu memerlukan instalasibindutils
michaelbn
7

Berikut adalah sedikit variasi dari pingpendekatan yang memperhitungkan "host tidak dikenal" ke dalam perhitungan (dengan menyalurkan melalui stderr) dan menggunakan truntuk menghindari penggunaan sedregexps:

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

Jika penting untuk menangkap nilai keluar, maka yang berikut ini akan berfungsi (meskipun kurang elegan):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'
Stefan Farestam
sumber
Saya suka solusi ini, karena ini bekerja tanpa alat tambahan.
Radon8472
7

Untuk melengkapi jawaban Chris Down, dan menanggapi komentar jfgagne tentang alias (mungkin dirantai), berikut adalah solusi yang:

  • memperhitungkan beberapa IP akun
  • memperhitungkan satu atau lebih alias (CNAME)
  • tidak meminta /etc/hostsfile (dalam kasus saya, saya tidak menginginkannya); untuk menanyakannya, solusi python dbernt sempurna)
  • tidak menggunakan awk / sed

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

Selalu kembalikan alamat IP pertama, atau kosongkan tring jika tidak diselesaikan. dengan versi menggali:

    $ dig -v
    DiG 9.8.1-P1
Franck
sumber
1
Terima kasih, jawaban lain menganggap "menggali + pendek" selalu mengembalikan satu alamat ip. Mereka tidak menghitung CNAME.
jamshid
5
 php -r "echo gethostbyname('unix.stackexchange.com');"
Mohammed Zourob
sumber
ini berfungsi, tetapi mengharuskan php diinstal pada terminal Anda
Radon8472
1
dapat berguna pada wadah buruh pelabuhan php biasa di mana "tuan rumah", "menggali" dll tidak tersedia
Fabian Schmengler
5

Saya ingin menambahkan ini sebagai komentar untuk Andrew McGregor Re: ping. Namun itu tidak membiarkan saya, jadi saya perlu menambahkan ini sebagai jawaban lain. (Jika seseorang dapat memindahkannya ke dalam komentar, silakan saja.)

Ini adalah varian lain, hanya menggunakan ping dan grep:

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

grep -Euntuk ekspresi reguler yang diperluas dan grep -ohanya mengembalikan bagian yang cocok. regexp itu sendiri mencari satu atau beberapa digit ( [0-9]+) dan secara opsional sebuah titik ( \.?) empat kali ( {4})

Dweia
sumber
4

Anda bisa menggunakan host:

hostname=example.org

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

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

inilah resep Bash yang saya buat menggunakan jawaban orang lain - pertama kali mencoba /etc/hosts, lalu kembali ke 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
}
RubyTuesdayDONO
sumber
Agar lebih jelas, getent hostsbukan hanya pencarian di / etc / hosts - ini adalah panggilan penyelesaian DNS penuh untuk gethostbyaddr (3) , dan sangat kecil kemungkinannya gagal dalam kasus di mana digakan berhasil. Lihat halaman manual untuk mendapatkan .
Stuart P. Bentley
@Stuart benar - saya telah belajar banyak sejak menulis itu dan menyederhanakan perintah yang kuat. getenttetap menjadi favorit saya, meskipun saya juga sukadig +short
RubyTuesdayDONO
4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

adalah solusi yang saya temukan tanpa server DNS

Philippe Gachoud
sumber
3

Mungkin bukan yang paling ringkas, tetapi tampaknya kuat dan efisien:

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

Ini akan menampilkan IP IPv4 tunggal, serta mengembalikan 1jika terjadi kegagalan, sambil menyembunyikan keluaran stderr.

Anda bisa menggunakannya seperti ini:

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

IP Google adalah 216.58.192.46.

Jika Anda menginginkan alamat IPv6, cukup ganti -4dengan -6.

Akan
sumber
3

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

DP Baker
sumber
1
Beberapa konteks dengan cara bagaimana jawaban itu meningkat dari yang sudah ada akan menjadi besar. Juga, silakan indentasi perintah dengan 4 spasi (lih. Sintaks penurunan harga).
maxschlepzig
2

1 baris menyelesaikan daftar nama host

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

Saya melakukan ini sepanjang waktu di Mac saya yang tidak memiliki getent. pingSepertinya hack. Saya ingin /etc/hostsmempertimbangkan juga.

Jadi, saya menulis bungkus bodoh dns.lookupuntuk Anda yang memiliki Node.js terinstal untuk memberikan CLI:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89
Thomas Jensen
sumber
60% kemungkinan kerusakan sebelum mencapai tekad.
dotbit
@dotbit, bisakah Anda menguraikan? Saya telah menggunakan ini setiap minggu sejak '17 dan tidak pernah memiliki masalah.
Thomas Jensen
@Jensen tapi kamu satu-satunya, seperti biasa. Kita semua biasanya mengalami FAIL dari satu jenis atau yang lain, dan selalu.
dotbit
"seperti biasa" Apa maksudmu dengan itu? "Kita semua" Siapa itu? "lari ke FAIL" Masalah spesifik apa yang Anda lihat? Saya penasaran.
Thomas Jensen
2

penggalian terlalu lambat, nslookup jauh lebih cepat

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

Saya tidak tahu cara termudah untuk bash-script tetapi jika Anda ingin menyelesaikan nama host dan melihat apakah host sudah habis, gunakan ping!

ping -a hostname -c 1

Apakah pingtuan rumah satu kali dan menyelesaikan nama host ke alamat 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
pengguna257655
sumber
menggunakan ping itu baik, karena semua orang memilikinya, tetapi Anda perlu memfilter Bagian-IP dari output, jika Anda ingin menggunakannya dalam skrip.
Radon8472
1

Ya, sudah ada banyak jawaban, tetapi solusi menggunakan perl tidak ada:

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

Dalam skrip bash dapat digunakan seperti ini:

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

Modul yang digunakan di sini adalah modul inti, jadi harus tersedia di mana saja tanpa menginstal dengan CPAN.

Slaven Rezic
sumber
perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null jauh lebih bersih. tapi tidak seorang pun selain kami berdua yang menggunakan pörl, semua orang tentu saja menggunakan Pascal Script.
dotbit
Sebenarnya saya lebih suka melihat pesan kesalahan jika ada yang salah. Can't call method "addr" on an undefined valuebukan pesan kesalahan terbaik, tetapi dapat memberikan petunjuk tentang masalah tersebut.
Slaven Rezic
1
#!/bin/bash

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

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

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

echo        "   all do work for me - take your pick!  "
dotbit
sumber
1
Versi ruby ​​mencetak tanda kutip di sekitar alamat IP --- mungkin printsebaiknya digunakan sebagai ganti p.
Slaven Rezic
thx, @Slaven Rezic dan merasa bebas untuk memperbaiki. sekali lagi, di sini di bagian bawah skrip mungkin lebih terlihat sebenarnya ... ;-)
dotbit
-1
host -t a cisco.com

perintah ini akan menampilkan alamat ip (akan menyimpan domain ke IP)

aaa
sumber
-1

Selain solusi di atas, Anda dapat menerjemahkan beberapa nama host ke ip melalui skrip di bawah ini, satu-satunya ketergantungan adalah perintah "ping" di core 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
Kevin Li
sumber