Bagaimana saya bisa mendapatkan alamat IP eksternal saya dalam skrip shell?

273

Saya perlu menemukan alamat IP eksternal saya dari skrip shell. Saat ini saya menggunakan fungsi ini:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Tapi itu tergantung pada perl-libwww, perl-html-format, perl-html-treediinstal. Apa cara lain yang bisa saya lakukan untuk mendapatkan IP eksternal saya?

Eugene Yarmash
sumber
8
Apa yang Anda maksud dengan IP eksternal? Kedua jawaban sejauh ini menggunakan HTTP. Responsnya mungkin berakhir sebagai IP dari server proxy ISP Anda. (Yang mungkin sesuai keinginan Anda.)
billpg
@ billpg: Maksud saya IP dari router NAT
Eugene Yarmash
Maka Anda akan memerlukan layanan web what-is-my-IP yang menggunakan HTTPS. Sayangnya, saya tidak tahu.
billpg
1
@billpg ipcheckit.com
Gilles
checkip.amazonaws.com gunakan ini dari penyedia terkenal
arulraj.net

Jawaban:

442

Saya akan merekomendasikan untuk mendapatkannya langsung dari server DNS.

Sebagian besar jawaban lain di bawah ini mencakup pengalihan HTTP ke server jarak jauh. Beberapa dari mereka memerlukan penguraian output, atau mengandalkan header User-Agent untuk membuat server merespons dalam teks biasa. Mereka sering berubah (turun, ganti nama, memasang iklan, mungkin mengubah format output, dll.).

  1. Protokol respons DNS distandarisasi (formatnya akan tetap kompatibel).
  2. Secara historis, layanan DNS ( OpenDNS , Google Public DNS , ..) cenderung bertahan lebih lama dan lebih stabil, lebih terukur, dan umumnya lebih dijaga daripada layanan HTTP whatismyip.com baru apa pun yang sedang hangat saat ini.
  3. Metode ini secara inheren lebih cepat (baik itu hanya beberapa milidetik!).

Menggunakan digdengan OpenDNS sebagai penyelesai:

dig @resolver1.opendns.com ANY myip.opendns.com +short

Mungkin alias itu di Anda bashrcsehingga mudah diingat

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Tanggapi dengan alamat ip biasa:

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

Sintaksis

(Disingkat dari https://ss64.com/bash/dig.html ) :

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

The ANYtipe query mengembalikan baik sebagai AAAA atau catatan A. Untuk memilih koneksi IPv4 atau IPv6 secara khusus, gunakan opsi -4atau yang -6sesuai.

Untuk meminta respons menjadi alamat IPv4, ganti ANY dengan A; untuk IPv6, ganti dengan AAAA.Catat bahwa itu hanya dapat mengembalikan alamat yang digunakan untuk koneksi. Misalnya, saat menghubungkan melalui IPv6, itu tidak dapat mengembalikan alamat A.

Server dan contoh alternatif

Selain OpenDNS, ada layanan DNS serupa yang disediakan oleh Akamai dan Google:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Contoh alias yang secara khusus meminta alamat IPv4:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Dan untuk IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Penyelesaian masalah

Jika perintah tidak berfungsi karena alasan tertentu, mungkin ada masalah dengan penyedia upstream, alat baris perintah, atau sesuatu yang lain. Untuk membantu memahami mengapa itu tidak berfungsi, jalankan perintah tanpa +shortopsi untuk mengungkapkan detail kueri DNS. Sebagai contoh:

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
Timo Tijhof
sumber
18
Anda benar itu terlalu cepat ..
Rahul Patil
4
@ Kerut itu jawaban yang bagus. Apakah ada yang setara dengan myip.opendns.comdi Googles Public DNS?
Kannan Mohan
12
Saya menemukan ini menjadi ~ 19x lebih cepat daripada curl http://canhazip.com. Lihat askubuntu.com/a/427092/2273
Adam Monsen
3
Suka pendekatan dependensi bersih / tidak ada ini jauh lebih baik daripada semua proposal lainnya, kecuali jika Anda terikat ke port 80
binaryanomaly
5
Harap perhatikan bahwa dalam beberapa kasus, router yang menyediakan NAT juga akan menerjemahkan tanggapan DNS (Anda dapat melihat wiki.nil.com/Network_address_translation_of_DNS_responses ); dalam hal ini Anda harus mundur ke beberapa jawaban yang merekomendasikan pendekatan lain selain DNS.
Razvan Stefanescu
146

CATATAN: Ini tentang alamat IP eksternal (alamat yang dilihat oleh server di Internet saat Anda terhubung) - jika Anda ingin alamat IP internal (alamat yang digunakan komputer Anda untuk koneksi, yang mungkin berbeda) lihat ini jawaban .

TL; DR - Metode tercepat di 2015

Metode tercepat menggunakan DNS:

dig +short myip.opendns.com @resolver1.opendns.com

atau menggunakan externalip :

externalip dns

HTTP yang paling cepat menggunakan:

curl -s http://whatismyip.akamai.com/

atau menggunakan externalip:

externalip http

HTTPS tercepat menggunakan dengan sertifikat yang valid:

curl -s https://4.ifcfg.me/

atau menggunakan externalip:

externalip https

Menggunakan telnet:

Dengan ncperintah:

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

atau menggunakan externalip:

externalip telnet

Dengan telnetperintah:

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

Menggunakan FTP:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

atau menggunakan externalip:

externalip ftp

Semua hal di atas dapat dijalankan menggunakan skrip eksternalip saya sebagai:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Sekarang cerita panjang ...

Ada banyak opsi dari berbagai server yang menyediakan IP eksternal terutama melalui HTTP yang diposting di sini atau di tempat lain.

Saya membuat tolok ukur untuk melihat apakah ada di antara mereka yang lebih baik daripada yang lain dan saya terkejut dengan hasilnya. Misalnya salah satu ifconfig.me yang paling banyak direkomendasikan bagi saya hampir selalu yang paling lambat bagi saya, kadang-kadang butuh beberapa detik untuk merespons. Banyak yang tidak bekerja dengan HTTPS, atau melakukan pekerjaan tetapi memiliki sertifikat yang tidak valid. Beberapa memiliki waktu respons yang sangat tidak konsisten.

Tolak ukur

HTTP dan HTTPS

Ini adalah sumber skrip benchmark eksternal yang saya gunakan:

Anda dapat menjalankannya sendiri untuk melihat layanan mana yang layak digunakan:

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

Hasil saya yang saya dapatkan pada 2015-04-03 dari Warsawa - alamat telah diubah untuk melindungi yang tidak bersalah:

Waktu respons http terbaik:

0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

Waktu respons https terbaik:

0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(Catatan: ada beberapa tanggapan cepat dengan konten kosong - itu tidak valid.)

Waktu ping rata-rata terbaik:

10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

Berikut adalah hasil yang saya dapatkan pada 2015-04-03 dari Amsterdam:

Waktu respons http terbaik:

0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'

Waktu respons https terbaik:

0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

Waktu ping rata-rata terbaik:

1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

(Ping 999999 berarti paket loss 100%.)

DNS

Untuk perbandingan, inilah saatnya metode lain diuji - coba pada 2015-06-16 dari Warsawa dan Amsterdam.

Menggunakan:

time dig +short myip.opendns.com @resolver1.opendns.com

biasanya memakan waktu (jam dinding nyata) tentang:

  • 0,035 dari Warsawa
  • 0,015 dari Amsterdam

Sebenarnya ada empat resolusi yang dapat digunakan dengan cara ini:

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

Mereka semua memberikan waktu respons yang sama di Warsawa dan Amsterdam tetapi ini mungkin tidak terjadi di lokasi lain.

Menggunakan 208.67.222.222 - IP resolver1.opendns.com alih-alih nama domainnya lebih cepat:

  • 0,023d dari Warsawa
  • 0,009 dari Amsterdam

tetapi mungkin tidak berfungsi di masa depan jika IP pernah berubah (meskipun mungkin tidak mungkin untuk resolver DNS yang terkenal - mungkin saya harus menggunakan IP dalam skrip eksternalip saya - mohon komentar).

Telnet

Telnet with ncatau telnetcommand (lihat di atas) biasanya membutuhkan:

  • 0,103 dari Warsawa
  • 0,035 dari Amsterdam

(Tidak ada perbedaan mencolok antara ncdan telnetperintah.)

FTP

  • 0,104d dari Warsawa
  • 0,036 dari Amsterdam

Nama domain

Semua metode akan lebih cepat (terutama ketika dijalankan untuk pertama kalinya) ketika alamat IP akan digunakan alih-alih nama domain dari layanan yang diberikan (kecuali dengan HTTP yang dapat menggunakan server virtual berbasis host dan tidak bekerja dengan IP telanjang - tidak diuji) tetapi akan berhenti bekerja ketika layanan mengubah alamat IP sehingga mungkin lebih cepat tetapi kurang bukti di masa depan.

Komentar

Jika Anda melihat beberapa hasil menarik dari lokasi Anda, atau jika Anda berpikir bahwa beberapa host lain harus direkomendasikan daripada yang saya pilih, silakan kirim komentar. Jika ada layanan penting yang hilang, silakan komentar atau posting masalah di GitHub. Saya ingin agar posting ini diperbarui dengan pilihan layanan berkinerja terbaik saat ini.

rsp
sumber
2
Apakah Anda membandingkan myip.opendns.commetode DNS seperti pada jawaban Krinkle ? Saat ini tampaknya pemenang-oleh-default karena tidak mengetahui penyedia lain untuk metode ini, tetapi masih akan berguna untuk membandingkan dengan metode lain.
James Haigh
@ JamesHigh Terima kasih atas sarannya. Saya menambahkan DNS dan metode lain (telnet, ftp) ke jawabannya. Metode tercepat tampaknya adalah DNS menggunakan langsung alamat IP (bukan nama domain) dari resolver.
rsp
Anda juga harus menambahkan / menguji canhazip.com / canhazip.com (HTTP dan HTTPS).
xxdesmus
Anda dapat menambahkan myip.addr.space ke daftar Anda. Saya membangun ini sendiri karena saya tidak terlalu puas dengan yang lain yang saya lihat saat itu.
Michael Hampton
Kadang-kadang saya mendapatkan hasil yang berbeda menggunakan dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34), dan curl http://canhazip.com(36.71.64.71). Bagaimana saya bisa memutuskan mana yang benar?
Sutandiono
80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Situs diganti dengan belanda yang berfungsi.

Maciek Sawicki
sumber
3
+1 Saya tahu tentang whatismyip.com, tapi bukan whatismyip.org, itu luar biasa.
Julian
Tidak pernah tahu tentang itu! Situs hebat!
bbosak
2
@MaciekSawicki Apakah -sopsi ini benar-benar diperlukan dalam kasus ini? Saya mencoba dengan / tanpa itu di fedora 15 saya - bash 4.2.10 (1) dan berhasil dengan dua cara.
ztank1013
4
Tampaknya tidak berfungsi lagi melalui CLI, tetapi membuka laman web dari peramban web berfungsi. Saya menggunakan openSUSE 12.1 x64.
SaultDon
5
whatismyip.comtelah menghapus layanan gratis untuk memeriksa IP eksternal. Jadi, saya khawatir ini tidak benar lagi. icanhazip.commasih bekerja.
DaSong
54

Sejak whatsmyip.org dan ifconfig.me telah disebutkan:

curl -s icanhazip.com
Joseph
sumber
4
Satu lagi: ip.appspot.com atau ip.appspot.com
Lekensteyn
1
Keduanya mendukung IPv6.
Josh Lee
1
@ JoshLee, perhatikan bahwa icanhazip juga mendukung ipv6. Juga, catatan untuk OP, semua curlsolusi ini (meskipun valid) masih bergantung pada perpustakaan eksternal ( libcurl).
HalosGhost
Satu lagi: ifcfg.me
Eun
18

Anda dapat menggunakan ifconfig.me sebagai alternatif untuk whatismyip.org.

curl -s http://ifconfig.me

Ifconfig.me juga memiliki beberapa fungsional tambahan. Untuk mengetahui informasi apa lagi yang dapat Anda terima, kunjungi situs web.

Mr. Deathless
sumber
5
Ini sangat lambat . Saya sering mendapatkan waktu respons lebih dari 30 detik, kadang-kadang bahkan lebih dari satu menit! Kadang-kadang setengah detik (yang masih banyak), dan kemudian sekitar 15 detik. Ini diuji dari lokasi yang berbeda. Lihat jawaban saya untuk info lebih lanjut dan tolok ukur.
rsp
15
wget -O - -q http://whatismyip.org/
ztank1013
sumber
3
Saya tidak bisa mendapatkan IP saya seperti ini, hanya memberikannya sebagai:<img src='ipimg.php'/>
Yuugian
Mengerjakannya dengan banyak sihir regex yang layak, tapi itu tidak mudah. Jika Anda bersikeras menggunakan layanan ini, pastikan untuk membungkus baris itu ke dalam skrip:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
syntaxerror
13

Amazon AWS

curl https://checkip.amazonaws.com

Output sampel:

123.123.123.123

Saya suka itu karena:

  • ia hanya mengembalikan IP plaintext, tidak ada yang lain
  • itu dari penyedia terkenal yang tidak akan offline dalam waktu dekat
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
9

Saya lebih suka menggunakan curlmyip.com Sesederhana:

curl curlmyip.com

Singkat dan mudah diingat.

Garrett Fogerlie
sumber
Untuk digunakan dalam bash— maksud OP—, Anda tidak dapat melakukannya tanpa -sopsi yang disebutkan dalam jawaban lain.
Serge Stroobandt
3
@SergeStroobandt Ya Anda bisa. Semua yang dilakukan -sswitch adalah menjalankannya dalam mode diam, yaitu. pesan kesalahan tidak akan ditampilkan. Jadi tergantung bagaimana dia ingin skripnya menangani kesalahan. Perintah itu sendiri akan mengembalikan alamat IP yang andal seperti menggunakan -s.
Garrett Fogerlie
1
Sejauh ini, situs ini adalah yang paling dapat diandalkan dalam beberapa tes.
Amos Shapira
9
curl ident.me

ATAU

curl ifconfig.me

ATAU

curl tnx.nl/ip

ATAU

curl ipecho.net/plain

ATAU

curl ip.appspot.com

ATAU

curl whatismyip.akamai.com

ATAU

curl icanhazip.com

ATAU

curl wgetip.com

ATAU

curl ip.tyk.nu

ATAU

curl curlmyip.com

ATAU

curl corz.org/ip

ATAU

curl bot.whatismyipaddress.com

Referensi

Mandar Shinde
sumber
6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Eugene Yarmash
sumber
Output kosong di sini, meskipun situsnya berfungsi. Ada yang tahu kenapa? Saya di belakang proxy, jika itu relevan, tetapi wget icanhazip.comberfungsi.
l0b0
@ l0b0 Cobalah untuk menghilangkan | tail -n1bagian dan melihat apa yang Anda dapatkan dari proxy
Eugene Yarmash
Tidak ada, hanya keluar kode 1. Ditto for netcat icanhazip.com 80. Sepertinya itu mengabaikan $http_proxydan teman-teman, karena menentukan proksi dan porta dengan -xhanya mengakibatkan proses menggantung.
l0b0
@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1untuk proxy HTTP dasar (dengan asumsi itu berjalan pada port 3128). Anda jelas akan mendapatkan alamat IP dari proxy kembali.
tripleee
1
HTTP 1.0 tidak memiliki Host:header permintaan - hosting virtual berbasis nama adalah salah satu peningkatan utama dalam HTTP 1.1. Ubah permintaan untuk menentukan HTTP / 1.1, atau hapus tajuk Host (saya sarankan yang pertama).
CVn
4

Jika setelah membaca semua saran ini, Anda ingin membaca lebih banyak lagi, berikut ini adalah skrip Bash yang terlalu banyak direkayasa.

Ini berisi daftar server DNS dan HTTP yang tampaknya berfungsi dengan baik pada Februari 2017.

Jika sudah dig, pertama-tama akan mencoba DNS yang hampir merupakan urutan besarnya lebih cepat dari berbagai layanan HTTP.

Keluar pada balasan pertama yang didapatnya.

Jika Anda tidak memiliki digatau jika semua server DNS gagal, maka ia akan mencoba layanan HTTP sampai mendapat balasan.

Server terdaftar secara alfabet, tetapi diacak sebelum digunakan untuk menghindari selalu menggunakan yang sama.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

Penggunaan sampel (saya menyebut skrip myip):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

Komentari verbosevariabel di bagian atas skrip untuk menghindari pencetakan server yang digunakan.

Perbarui: skrip ini sekarang juga ada di Github tempat saya dapat memperbaruinya saat diperlukan:
https://github.com/mivk/myip

mivk
sumber
3

Jika Anda ingin menggunakan HTTPS untuk menghindari beberapa jebakan potensial:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Chris Down
sumber
2
Mungkin Anda bisa menguraikan potensi jebakan apa yang Anda hindari di sini?
Caleb
Domain ipcheckit.com rupanya untuk dijual dan tidak meng-host layanan menampilkan alamat IP lagi.
manatwork
ah, jebakan skrip tulisan saja :)
Ярослав Рахматуллин
@Chris Down teknik ini masih berlaku, Anda hanya perlu situs yang mampu SSL lainnya untuk menggunakannya.
Caleb
3

Berikut adalah alternatif lain yang bergantung pada host yang bisnisnya memutuskan untuk mengelola IP dinamis daripada situs "layanan publik" yang mungkin hilang atau mengubah format.

  1. Daftarkan server Anda di salah satu dari banyak layanan dns dinamis gratis (mis. No-ip.com) Ini akan memberi Anda entri DNS seperti xxx.no-ip.org.
  2. Instal alat pembaruan dinamis layanan (melaporkan perubahan IP ke layanan).

Untuk mendapatkan alamat IP dalam skrip, cukup lakukan:

external_ip=`dig +short xxx.no-ip.org`

Sangat bagus untuk digunakan dalam pekerjaan cron untuk memeriksa apakah IP dinamis telah berubah dan beberapa entri konfigurasi perlu diubah.

cgmonroe
sumber
3

Ini selalu bekerja untuk saya, saya menggunakannya di conky saya untuk mendapatkan alamat IP saya.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
Dai_Trying
sumber
+1 Meskipun terlihat sangat canggung, pendekatan ini telah menyelamatkan saya beberapa kali. Karena internet bukan WWW . Anda dapat memiliki akses internet, tetapi Anda mungkin (biasanya di ruang server) akan ditakdirkan untuk konsol non-GUI, dan dalam hal ini penting untuk diingat dengan mengingat-ingat salah satu URL layanan checkIP. Dan karena yang satu ini cukup umum, sepertinya hanya dikompilasi, karena Anda akan lebih cenderung mengingat DynDNS daripada yang sebelumnya amazonaws. Artinya, jika Anda TIDAK punya cara untuk google untuk itu. (bahkan tidak lynx).
syntaxerror
3

Karena saya tidak mengandalkan koneksi atau layanan, saya menggunakan kode berikut, yang mencoba untuk mendapatkan IP menggunakan layanan yang berbeda (jangan ragu untuk menambahkan lebih banyak):

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

Untuk menambahkan lebih banyak ketahanan (misalnya jika salah satu layanan mengubah formatnya), Anda dapat memeriksa apakah $IPitu IP yang valid menggunakan fungsi berikut :

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}
Franck Dernoncourt
sumber
3

ifcfg.me mendukung:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 dan IPv6, bahkan lebih banyak barang dengan curl: ifcfg.me/?

Eun
sumber
Bagaimana nslookuphubungannya dengan digmetode dalam jawaban Krinkle ? Mereka berdua menggunakan DNS, kan? Jadi bisakah saya memberikan beberapa opsi untuk digmembuatnya mengambil catatan DNS yang sama dengan yang nslookupdilakukan di sini?
James Haigh
Ya Anda bisa menggunakan dig +short . @ifcfg.mejika Anda mau
Eun
2

Saya menjalankan layanan cloud untuk keluarga saya dan saya membuat skrip cepat ini saya jalankan cronsetiap pagi jam 5 karena saya murah dan tidak akan membeli IP statis.

Itu mengambil IP publik, dan mengirimkannya ke pengguna saya. Membuatnya email dalam format hyperlink sehingga Ibuku tidak perlu mengetik port atau apa pun. Mungkin orang lain bisa menggunakannya.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com
Akan
sumber
1

Ini akan menampilkan alamat ip saat ini di jendela sembulan:

zenity --info --text "$(curl -s icanhazip.com)"
basic6
sumber
1

Saya telah menyiapkan layanan yang mengembalikan alamat IP sebagai JSON / XML atau teks biasa. Anda dapat menemukannya di sini

http://ipof.in/txt

URL yang sama dengan / json dan / xml akan memberi Anda format lain juga

Jika Anda menginginkan HTTPS, Anda dapat menggunakan URL yang sama dengan awalan https. Keuntungannya adalah bahwa bahkan jika Anda menggunakan Wifi, Anda akan mendapatkan alamat publik.

Jadi alias myip = "curl https://ipof.in/txt " yang sederhana akan mendapatkan IP Anda

vivekv
sumber
1

Atau Anda dapat menggunakan STUN yang diciptakan untuk menjawab pertanyaan ini dengan cara otomatis dan digunakan secara luas dalam komunikasi internet misalnya oleh SIP dan WebRTC .

Menggunakan stunclient (pada debian / ubuntu do apt-get install stuntman-client) cukup lakukan:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

di mana A.B.C.Dalamat IP mesin Anda di internet lokal dan W.X.Y.Zserver alamat IP seperti situs web melihat dari luar (dan yang Anda cari). Menggunakan sedAnda dapat mengurangi output di atas hanya alamat IP:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Untuk pencarian STUN alternatif menggunakan apa-apa selain alat baris perintah dasar lihat jawaban saya di AskUbuntu (dimaksudkan sebagai latihan yang menyenangkan, bukan untuk penggunaan produksi).

Victor Klos
sumber
0

Plaintext-Browser w3m sangat bagus untuk bash. Anda dapat menggunakan grepdan tailmempersingkat balasan sebagai berikut:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1
McPeppr
sumber
0

Gunakan curl untuk menekan layanan ip shtuff.it

curl -s https://shtuff.it/myip/short
Chris Montanaro
sumber
301 Dipindahkan secara Permanen
McPeppr
tautannya sudah mati sekarang
Eugene Bujak
0

Menggunakan permintaan DNS bahkan di belakang perute NAT yang menerjemahkan alamat DNS, ini dapat bekerja:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

atau, Anda dapat menggunakan metode permintaan HTTP:

$ curl -s ipinfo.io/ip
x.y.z.t
SebMa
sumber
1
Mengapa Anda merekomendasikan satu di atas yang lain?
roaima
@roaima Anda benar, terserah masing-masing pengguna untuk memutuskan.
SebMa