Menemukan alamat IP Publik di skrip shell

39

Saya dapat menemukan alamat IP saya menggunakan perintah ifconfig atau hostname -i.

Tetapi bagaimana cara menemukan IP Publik saya?

(Saya memiliki IP publik statis tapi saya ingin mengetahuinya menggunakan perintah unix)

shantanuo
sumber
Apakah Anda mencoba melakukan ini secara terprogram?
Andrew Keith
ya dalam skrip shell
shantanuo
1
Apakah Anda menggunakan Linux, MacOSX, FreeBSD, dll? Output dari 'ifconfig' berbeda untuk OS yang berbeda ini, dan perintah 'ip' tidak ada pada MacOSX. Apakah Anda mencari IP komputer Anda (Anda akan memerlukan skrip shell untuk menguraikan ifconfig, atau sesuatu), atau router Anda (Situs web di bawah ini mungkin berfungsi)?
Stefan Lasiewski

Jawaban:

49

curl ifconfig.me

curl ifconfig.me/ip (hanya untuk ip)

curl ifconfig.me/all (untuk info lebih lanjut, perlu waktu)

Untuk perintah lebih lanjut, kunjungi: http://ifconfig.me/#cli_wrap

tsanand129
sumber
1
Bagaimana dengan alamat IPv6?
Matt3o12
Tautan itu sudah mati. Anda dapat menggunakan ini sebagai gantinya:curl http://checkip.amazonaws.com/
Farhan.K
@ Farhan.K tolong posting ini sebagai jawaban karena itu mungkin jawaban terbaik. Jika tidak, saya akan dan menyebutkan nama Anda yang menyarankannya
Aliostad
@Aliostad merasa bebas untuk mempostingnya :)
Farhan.K
@ Farhan.K argh, dilindungi: /
Aliostad
26

Anda bisa meminta myip.opendns.com. dari OpenDNS. dig @208.67.222.220 myip.opendns.com

Sakit kepala
sumber
8
Itu keren. Untuk versi yang lebih mudah diingat, Anda dapat memasukkan dig @resolver1.opendns.com myip.opendns.com. Atau pada Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat
2
Apa yang paling berhasil bagi saya: dig @208.67.222.220 myip.opendns.com +shortuntuk mendapatkan ip secara langsung tanpa harus melalui seluruh jawaban.
Christopher Chiche
18

dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


Perhatikan bahwa di atas hanya berfungsi untuk IPv4 saat ini (tidak ada satupun dari resolver ini yang tampaknya memiliki IPv6 saat ini, tetapi jika Anda menghilangkan -4dan eksplisit -t a, maka Anda berisiko menerobosnya di masa depan (dengan pengecualian Google txt, yang mungkin sebenarnya berfungsi untuk IPv6). IPv6 suatu hari, jika diaktifkan dengan benar oleh Google)).

Catatan yang myip.opendns.comhanya dapat diselesaikan melalui resolver1.opendns.com, dan tidak dengan auth1.opendns.com- jadi, mereka tampaknya melakukan beberapa pembajakan DNS dan man-in-the-middle dari nama domain mereka sendiri! Dengan demikian, Anda tidak dapat menggunakannya untuk menemukan IP dari resolver acak, karena resolver1.opendns.comtidak otoritatif untuk myip.opendns.com.

Catatan yang o-o.myaddr.l.google.comterlihat seperti pendekatan yang paling fleksibel dan tahan masa depan; itu bahkan bagus untuk menguji apakah resolver DNS Anda mendukung ekstensi EDNS0 eksperimental untuk subnet klien (yang sangat sedikit resolver yang memiliki dukungan untuk):

% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114
cnst
sumber
2
@ Matt3o12 <saya menemukan OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh
Saat ini metode mendapatkan catatan TXT dari Google mendukung IPv4 dan IPv6 sehingga Anda harus menentukan -4atau -6jika Anda memerlukan versi IP tertentu.
Martin
12

Anwser yang sangat sederhana jika Anda memiliki akses internet adalah:

curl icanhazip.com

Ingatlah, mempercayai sumber pihak ketiga untuk IP Anda mungkin bermasalah terutama jika apa yang Anda lakukan dengan data itu memiliki makna khusus.

Cara yang lebih dapat dipercaya adalah dengan memilih server DNS yang dikenal dan dapat dipercaya (idealnya menjalankan DNSSEC) dan menanyakan nama host kotak itu, asalkan server DNS Anda berisi entri tersebut;

dig @trustworthysource.com +short `hostname`
Matthew Ife
sumber
8

Saya menulis layanan web yang sederhana dan cepat untuk ini.

curl ident.me

Anda dapat meminta IPv4 Anda:

curl v4.ident.me

Atau IPv6:

curl v6.ident.me

Dan API didokumentasikan di http://api.ident.me/

Pierre Carrier
sumber
5

Jika

  1. Anda hanya memiliki satu alamat IP publik dan
  2. Anda terhubung langsung ke internet (tidak ada NAT / proxy / VPN dll)

maka Anda bisa mem-parsing output dari ifconfig untuk alamat IP antarmuka (bagian "inet addr:") untuk mendapatkan daftar alamat IP semua antarmuka Anda. Satu alamat IP yang tidak dalam jangkauan pribadi (lihat http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) adalah alamat IP publik Anda.

Daftar yang sama juga dapat diperoleh melalui

ip addr show

yang mungkin lebih mudah diurai.

Jika Anda tidak memiliki koneksi internet langsung (NAT dll.), Tidak ada cara untuk menemukan alamat IP publik Anda tanpa bantuan eksternal (karena komputer Anda tidak mengetahuinya). Maka Anda harus melakukannya seperti pada jawaban lainnya.

sleske
sumber
4

Saya mengambil pendekatan yang sedikit berbeda dengan menggunakan protokol STUN yang dirancang untuk NAT Traversal. Jika Anda menggunakan Ubuntu, Anda cukup menginstal paket "setrum" dengan mengetik:

sudo apt-get install stun

Paket menginstal server STUN yang mungkin tidak Anda perlukan, tetapi juga dilengkapi dengan klien uji STUN yang saya gunakan untuk menyelesaikan masalah ini. Sekarang Anda dapat mengambil IP publik Anda dengan satu (tidak begitu sederhana) perintah:

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

Sekarang, apa yang dilakukannya adalah: stun menghubungi server STUN publik "stunserver.org" dan mendapatkan jawaban kembali dengan IP publik Anda, sisanya dari perintah ini hanya untuk menyaring IP dari output.


sumber
stun.l.google.com lebih cepat: D
Zibri
3

Salah satu caranya adalah, Anda dapat membuat permintaan ke halaman di

http://www.biranchi.com/ip.php

ia mengembalikan alamat IP sistem Anda

Biranchi
sumber
Ini menyajikan teks biasa dengan jenis teks / html ...
bortzmeyer
bukankah itu menampilkan IP Anda di browser Anda?
2
Namun dengan tipe yang salah.
bortzmeyer
@ Bortzmeyer Eh, apa "tipe yang tepat"? text/htmlbaik untuk apa yang dikembalikan API semu - itu pasti bukan XML atau JSON. text/plainmungkin, tetapi sepenuhnya dapat digunakan sebagai text/html.
ceejayoz
3
+1 untuk laman yang tidak perlu digenggam. Jugawget -q -O - http://wgetip.com/
xofer
3

Google sekarang menampilkan alamat IP publik Anda: http://www.google.com/search?q=ip

Jake Wilson
sumber
Itu tidak berfungsi untuk saya, baik di browser atau melalui curl.
Ladadadada
Itu aneh. Milik saya mengatakan "Alamat IP publik Anda adalah XX.XX.XXX.XX - Pelajari lebih lanjut" di bagian atas sebelum ular pertama.
Jake Wilson
Bekerja pada koneksi 3G saya. Pelajari lebih banyak poin di sini .
Ladadadada
Google karena alasan yang aneh hanya menunjukkan alamat IP Anda berdasarkan User-Agentstring yang disediakan untuk halaman tersebut. Dengan Firefox, ini berfungsi; tetapi SeaMonkey dengan string "Firefox" dinonaktifkan (melalui "general.useragent.compatMode.firefox" disetel ke false), tiba-tiba tidak. Sama sekali tidak tahu mengapa Google secara eksplisit mengaktifkan hal-hal seperti ini hanya untuk Firefox dan bukan sembarang Tokek, karena ada banyak peramban desktop lain yang berbasis pada Tokek yang sama-sama kompatibel, termasuk SeaMonkey.
cnst
curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri
3

Oke ... Saya tahu bahwa ini adalah WAY setelah fakta dan mungkin bahkan tidak layak untuk diposkan, tetapi inilah solusi kerja saya.

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

Bagus dan sederhana.

Skittles
sumber
2
Ini mengembalikan alamat IP internal yang tidak diminta. Tetapi, untuk informasi Anda, Anda juga dapat melakukan ini dengan perintah hostname -I(huruf 'i').
Redsandro
3

Cara paling sederhana adalah dengan menggunakan http://ifconfig.me/ , seperti yang disarankan.

Pada halaman ini, Anda akan tahu perintah apa yang digunakan untuk informasi apa yang ingin Anda ambil.

Untuk IP:

ikal ifconfig.me
atau
ikal ifconfig.me/ip

Untuk Nama Inang publik:

ikal ifconfig.me/host

Untuk semua informasi dalam file XML:

ikal ifconfig.me/all.xml

dll ... cukup periksa http://ifconfig.me

Kelindil
sumber
2

Saya sering melakukan ini, dan dari banyak perangkat, jadi saya membuat dua layanan saya sendiri di server:

  1. file php di root server web:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    Penggunaan pada shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    juga bekerja dengan ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    Dengan netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    Pada router Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. peretasan cepat dengan server telnet khusus: xinetd spawning / usr / bin / env:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    dan kemudian telnet ke sana:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    bekerja sama dengan router:

    router#telnet myserver.com
    79.22.192.12
    

Dengan cara ini Anda dapat membuatnya berfungsi di jaringan internal Anda, jika beberapa nat atau proksi terlibat dalam komunikasi dan Anda ingin tahu dari IP apa Anda muncul.

Itu tidak memerlukan layanan pihak ketiga.

petrus
sumber
2

Untuk menghindari mengandalkan sumber-sumber eksternal, saya menggunakan harapkan, untuk melakukan telnet ke router saya dan mendapatkan alamat ip dari antarmuka publiknya. Berikut ini contoh skrip harapan:

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

Saya kemudian menjalankan skrip di atas seperti ini untuk mendapatkan ip publik:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

Tentu saja, ini didasarkan pada asumsi bahwa saya memiliki akses admin ke router, dan itu adalah router berbasis linux, dengan perintah ifconfig tersedia.

Hammad Akhwand
sumber
1

Jika yang Anda inginkan adalah menemukan alamat ip eksternal pada router Anda, Anda bisa bertanya pada router itu sendiri untuk alamatnya, atau meminta seseorang di luar untuk mendapatkannya untuk Anda ..

untuk cara manual, Anda dapat menelusuri situs-situs yang diberikan di atas yang akan mengembalikan ip permintaan incomming.

Untuk cara otomatis, Anda dapat mencoba:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

yang akan memberi Anda baris yang berisi alamat ip pada respons http, lalu uraikan dengan sed, awk, dll.

kuanta
sumber
0

Anda dapat menggunakan hanya shell untuk memeriksa ip eksternal Anda, juga menggunakan penyedia eksternal

#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

keluaran


sumber
0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *'
-m1 

sumber
0

Saya melakukan ini. Itu hanya memberi saya IP tanpa keterlibatan pihak ketiga ..

ip addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"

Leigh Geary
sumber
3
Dia ingin alamat IP publiknya. Bukan lokal.
Jake Wilson
0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Fathi
sumber
0

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
0

Pada OS X berikut adalah dua solusi sederhana untuk mendapatkan IP privat dan publik (dengan kode bonus jika Anda menggunakan LaunchBar).

IP pribadi

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

Skrip LaunchBar

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

IP publik

$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

Skrip LaunchBar

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

sumber