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-tree
diinstal. Apa cara lain yang bisa saya lakukan untuk mendapatkan IP eksternal saya?
linux
shell-script
ip
Eugene Yarmash
sumber
sumber
Jawaban:
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.).
Menggunakan
dig
dengan OpenDNS sebagai penyelesai:Mungkin alias itu di Anda
bashrc
sehingga mudah diingatTanggapi dengan alamat ip biasa:
Sintaksis
(Disingkat dari https://ss64.com/bash/dig.html ) :
The
ANY
tipe query mengembalikan baik sebagai AAAA atau catatan A. Untuk memilih koneksi IPv4 atau IPv6 secara khusus, gunakan opsi-4
atau yang-6
sesuai.Untuk meminta respons menjadi alamat IPv4, ganti ANY dengan
A
; untuk IPv6, ganti denganAAAA
.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:
Contoh alias yang secara khusus meminta alamat IPv4:
Dan untuk IPv6:
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
+short
opsi untuk mengungkapkan detail kueri DNS. Sebagai contoh:sumber
myip.opendns.com
di Googles Public DNS?curl http://canhazip.com
. Lihat askubuntu.com/a/427092/2273CATATAN: 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:
atau menggunakan externalip :
HTTP yang paling cepat menggunakan:
atau menggunakan externalip:
HTTPS tercepat menggunakan dengan sertifikat yang valid:
atau menggunakan externalip:
Menggunakan telnet:
Dengan
nc
perintah:atau menggunakan externalip:
Dengan
telnet
perintah:Menggunakan FTP:
atau menggunakan externalip:
Semua hal di atas dapat dijalankan menggunakan skrip eksternalip saya sebagai:
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:
Hasil saya yang saya dapatkan pada 2015-04-03 dari Warsawa - alamat telah diubah untuk melindungi yang tidak bersalah:
Waktu respons http terbaik:
Waktu respons https terbaik:
(Catatan: ada beberapa tanggapan cepat dengan konten kosong - itu tidak valid.)
Waktu ping rata-rata terbaik:
Berikut adalah hasil yang saya dapatkan pada 2015-04-03 dari Amsterdam:
Waktu respons http terbaik:
Waktu respons https terbaik:
Waktu ping rata-rata terbaik:
(Ping 999999 berarti paket loss 100%.)
DNS
Untuk perbandingan, inilah saatnya metode lain diuji - coba pada 2015-06-16 dari Warsawa dan Amsterdam.
Menggunakan:
biasanya memakan waktu (jam dinding nyata) tentang:
Sebenarnya ada empat resolusi yang dapat digunakan dengan cara ini:
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:
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
nc
atautelnet
command (lihat di atas) biasanya membutuhkan:(Tidak ada perbedaan mencolok antara
nc
dantelnet
perintah.)FTP
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.
sumber
myip.opendns.com
metode 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.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), dancurl http://canhazip.com
(36.71.64.71). Bagaimana saya bisa memutuskan mana yang benar?Situs diganti dengan belanda yang berfungsi.
sumber
-s
opsi 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.whatismyip.com
telah menghapus layanan gratis untuk memeriksa IP eksternal. Jadi, saya khawatir ini tidak benar lagi.icanhazip.com
masih bekerja.Sejak whatsmyip.org dan ifconfig.me telah disebutkan:
sumber
curl
solusi ini (meskipun valid) masih bergantung pada perpustakaan eksternal (libcurl
).Anda dapat menggunakan ifconfig.me sebagai alternatif untuk whatismyip.org.
Ifconfig.me juga memiliki beberapa fungsional tambahan. Untuk mengetahui informasi apa lagi yang dapat Anda terima, kunjungi situs web.
sumber
sumber
<img src='ipimg.php'/>
$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
Amazon AWS
Output sampel:
Saya suka itu karena:
sumber
Saya lebih suka menggunakan curlmyip.com Sesederhana:
curl curlmyip.com
Singkat dan mudah diingat.
sumber
bash
— maksud OP—, Anda tidak dapat melakukannya tanpa-s
opsi yang disebutkan dalam jawaban lain.-s
switch 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
.ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
ATAU
Referensi
sumber
sumber
wget icanhazip.com
berfungsi.| tail -n1
bagian dan melihat apa yang Anda dapatkan dari proxynetcat icanhazip.com 80
. Sepertinya itu mengabaikan$http_proxy
dan teman-teman, karena menentukan proksi dan porta dengan-x
hanya mengakibatkan proses menggantung.netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1
untuk proxy HTTP dasar (dengan asumsi itu berjalan pada port 3128). Anda jelas akan mendapatkan alamat IP dari proxy kembali.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).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
dig
atau 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.
Penggunaan sampel (saya menyebut skrip
myip
):Komentari
verbose
variabel 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
sumber
Jika Anda ingin menggunakan HTTPS untuk menghindari beberapa jebakan potensial:
sumber
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.
Untuk mendapatkan alamat IP dalam skrip, cukup lakukan:
Sangat bagus untuk digunakan dalam pekerjaan cron untuk memeriksa apakah IP dinamis telah berubah dan beberapa entri konfigurasi perlu diubah.
sumber
Ini selalu bekerja untuk saya, saya menggunakannya di conky saya untuk mendapatkan alamat IP saya.
sumber
amazonaws
. Artinya, jika Anda TIDAK punya cara untuk google untuk itu. (bahkan tidaklynx
).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):
Untuk menambahkan lebih banyak ketahanan (misalnya jika salah satu layanan mengubah formatnya), Anda dapat memeriksa apakah
$IP
itu IP yang valid menggunakan fungsi berikut :sumber
ifcfg.me mendukung:
IPv4 dan IPv6, bahkan lebih banyak barang dengan curl: ifcfg.me/?
sumber
nslookup
hubungannya dengandig
metode dalam jawaban Krinkle ? Mereka berdua menggunakan DNS, kan? Jadi bisakah saya memberikan beberapa opsi untukdig
membuatnya mengambil catatan DNS yang sama dengan yangnslookup
dilakukan di sini?dig +short . @ifcfg.me
jika Anda mauSaya menjalankan layanan cloud untuk keluarga saya dan saya membuat skrip cepat ini saya jalankan
cron
setiap 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.
sumber
Ini akan menampilkan alamat ip saat ini di jendela sembulan:
sumber
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
sumber
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:di mana
A.B.C.D
alamat IP mesin Anda di internet lokal danW.X.Y.Z
server alamat IP seperti situs web melihat dari luar (dan yang Anda cari). Menggunakansed
Anda dapat mengurangi output di atas hanya alamat IP: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).
sumber
Plaintext-Browser w3m sangat bagus untuk bash. Anda dapat menggunakan
grep
dantail
mempersingkat balasan sebagai berikut:sumber
Gunakan curl untuk menekan layanan ip shtuff.it
sumber
Menggunakan permintaan DNS bahkan di belakang perute NAT yang menerjemahkan alamat DNS, ini dapat bekerja:
atau, Anda dapat menggunakan metode permintaan HTTP:
sumber