Harici IP adresimi bir kabuk betiğinde nasıl alabilirim?


273

Harici IP adresimi bir kabuk betiğinden bulmam gerekiyor. Şu anda bu işlevi kullanıyorum:

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

Ama bağlıdır perl-libwww, perl-html-format, perl-html-treeyüklü. Harici IP adresimi başka hangi yollardan alabilirim?


8
Harici IP ile ne demek istiyorsunuz? Şimdiye kadar iki cevap HTTP kullanıyor. Yanıt, ISS'nizin proxy sunucusunun IP'si olabilir. (Hangi istediğinizi olabilir.)
billpg

@billpg: NAT yönlendiricinin
IP'sini kastettim

O zaman HTTPS kullanan bir IP adresim olan web servisine ihtiyacınız olacak. Ne yazık ki, hiçbirini bilmiyorum.
billpg

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com iyi bilinen sağlayıcıdan bu kullanmak
arulraj.net

Yanıtlar:


441

Doğrudan bir DNS sunucusundan almanızı tavsiye ederim.

Diğer tüm cevapların çoğu, HTTP üzerinden uzak bir sunucuya geçmeyi içerir. Bazıları çıktının ayrıştırılmasını gerektirdi ya da sunucunun düz metin olarak yanıt vermesini sağlamak için Kullanıcı-Ajan başlığına dayandı. Bunlar oldukça sık değişiyor (aşağı inmek, isimlerini değiştirmek, reklam koymak, çıktı biçimini değiştirmek vb.).

  1. DNS yanıt protokolü standardize edilmiştir (format uyumlu kalacaktır).
  2. Tarihsel olarak, DNS hizmetleri ( OpenDNS , Google Public DNS , ..) çok daha uzun süre hayatta kalma eğilimindedir ve bugün ne kadar yeni olursa olsun whatismyip.com HTTP hizmeti ne kadar sıcak olursa olsun daha istikrarlı, daha ölçeklenebilir ve genellikle daha bakımlıdır.
  3. Bu yöntem doğal olarak daha hızlıdır (sadece birkaç milisaniyede!).

Çözücü olarak OpenDNSdig ile kullanma :

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

Belki de takma adınızdır bashrc, hatırlaması kolaydır.

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

Düz bir ip adresi ile yanıt verir:

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

Sözdizimi

( Https://ss64.com/bash/dig.html adresinden kısaltılmıştır ) :

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)
             ...

ANYSorgu türü, AAAA veya bir kaydı olarak döndürür. IPv4 veya IPv6 bağlantısını özellikle tercih etmek için, -4veya -6seçeneklerini uygun şekilde kullanın .

Yanıtın bir IPv4 adresi olmasını istemek için, HERHANGİ ile A; IPv6 için AAAA.Note ile değiştirin , ancak bağlantı için kullanılan adresi geri getirebilir. Örneğin, IPv6 üzerinden bağlanırken, A adresini döndüremez.

Alternatif sunucular ve örnekler

OpenDNS’e ek olarak, Akamai ve Google tarafından sağlanan benzer DNS hizmetleri vardır:

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

Özel olarak bir IPv4 adresi isteyen örnek takma ad:

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

$ wanip4
80.100.192.168

Ve IPv6 için:

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

$ wanip6
2606:4700:4700::1111

Sorun giderme

Komut bir nedenden dolayı çalışmıyorsa, yukarı akış sağlayıcısı, komut satırı aracı veya başka bir şeyle ilgili bir sorun olabilir. Neden işe yaramadığını anlamak +shortiçin, DNS sorgusunun ayrıntılarını açıklama seçeneği olmadan komutu çalıştırın . Örneğin:

$ 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

18
haklısın çok hızlı ..
Rahul Patil

4
@Krinkle bu mükemmel bir cevap. myip.opendns.comGoogles Public DNS’de bunun karşılığı var mı ?
Kannan Mohan

12
Bunu ~ 19x daha hızlı buldum curl http://canhazip.com. Askubuntu.com/a/427092/2273
Adam Monsen,

3
Bağlantı noktası 80 bağlısın sürece bu temiz Aşk / hayır bağımlılıklar, diğer tüm tekliflerin çok daha iyi yaklaşım
binaryanomaly

5
Bazı durumlarda NAT sağlayan yönlendiricilerin DNS yanıtlarını da çevireceğini lütfen unutmayın ( wiki.nil.com/Network_address_translation_of_DNS_responses sayfasına bakabilirsiniz ); Bu durumda DNS'den başka bir yaklaşım öneren bazı cevaplara geri dönmelisiniz.
Razvan Stefanescu

146

NOT: Bu hakkındadır dış IP adresi (onlara bağlandıklarında internette sunucularımıza biri) - İstersen IP adresi (farklı olabilir, kendi bilgisayar bağlantıları için kullandığı bir,) bakın bu cevap .

TL; DR - 2015 yılında en hızlı yöntemler

DNS kullanarak en hızlı yöntem:

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

veya externalip kullanarak :

externalip dns

HTTP kullanarak en hızlı:

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

veya externalip kullanarak:

externalip http

Geçerli bir sertifikaya sahip HTTPS'yi en hızlı kullanmak:

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

veya externalip kullanarak:

externalip https

Telnet kullanarak:

İle nckomuta:

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

veya externalip kullanarak:

externalip telnet

İle telnetkomuta:

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

FTP kullanarak:

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

veya externalip kullanarak:

externalip ftp

Yukarıdakilerin tümü externalip betiğimi kullanarak çalıştırılabilir :

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Şimdi uzun bir hikaye ...

Dış IP'yi özellikle burada veya başka bir yerde yayınlanan HTTP aracılığıyla sağlayan birçok farklı seçenek vardır.

Bunlardan herhangi birinin diğerlerinden daha iyi olup olmadığını görmek için bir kıyaslama yaptım ve sonuçlara şaşırdım. Örneğin, en yaygın olarak tavsiye edilen ifconfig.me 'den biri benim için neredeyse her zaman en yavaş olanıydı, bazen cevap vermek birkaç saniye sürdü. Birçoğu HTTPS üzerinden çalışmıyor ya da çalışıyor ancak geçersiz sertifikalara sahip. Bazıları çok tutarsız tepki sürelerine sahiptir.

Deneyler

HTTP ve HTTPS

Bu benim kullandığım externalip-benchmark betiğimin kaynağı:

Burada belirtilen hizmetlerin kullanılmaya değer olduğunu görmek için kendiniz çalıştırabilirsiniz:

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

Varşova'dan 2015-04-03 tarihinde aldığım sonuçlar - adresler masumları korumak için değiştirildi:

En iyi http yanıt süreleri:

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'

En iyi https yanıt süreleri:

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

(Not: boş içerikli bazı hızlı yanıtlar var - bunlar geçersiz.)

En iyi ortalama ping zamanı:

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/

İşte Amsterdam'dan 2015-04-03 tarihinde aldığım sonuçlar:

En iyi http yanıt süreleri:

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'

En iyi https yanıt süreleri:

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

En iyi ortalama ping zamanı:

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/

(999999 ping,% 100 paket kaybı anlamına gelir.)

DNS

Burada bir karşılaştırma yapmak için Varşova ve Amsterdam'dan 2015-06-16'da test edilen diğer metotların kullanıldığı zamanlardır.

Kullanımı:

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

genellikle hakkında (gerçek duvar saati zaman) alır:

  • Varşova'dan 0.035
  • Amsterdam'dan 0.015

Aslında bu şekilde kullanılabilecek dört çözücü var:

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

Hepsi Varşova ve Amsterdam'da aynı tepki sürelerini veriyorlar, ancak diğer yerlerde de böyle olmayabilir.

208.67.222.222 kullanılması - domain adı yerine resolver1.opendns.com IP adresi daha hızlıdır:

  • Varşova'dan 0.023
  • Amsterdam'dan 0.009s

IP şimdiye değişirse ancak gelecekte çalışmayabilir (bu bilinen bir DNS çözümleyici olabileceğini ihtimal olsa - belki benim de IP kullanmalıdır externalip komut - lütfen yorum).

Telnet

Telnet ncveya telnetkomutu (yukarıya bakın) genellikle şunları alır:

  • Varşova'dan 0,103s
  • Amsterdam'dan 0.035

( ncVe telnetkomutları arasında gözle görülür bir fark yoktur .)

FTP

  • Varşova'dan 0,104s
  • Amsterdam'dan 0.036

Alan isimleri

Verilen hizmetlerin alan adları yerine IP adresleri kullanıldığında (ana bilgisayar tabanlı sanal sunucuları kullanabilen ve çıplak IP ile çalışmayan HTTP hariç), tüm yöntemler daha hızlı olacaktır (özellikle ilk kez çalıştırdığınızda). test edilmedi) ancak hizmetler IP adresini değiştirdiğinde çalışmayı durduracak, böylece daha hızlı ancak daha az geleceğe yönelik olabilir.

Yorumlar

Konumunuzdan ilginç sonuçlar görüyorsanız veya seçtiğimler yerine başka bazı ana makinelerin önerilmesi gerektiğini düşünüyorsanız, lütfen bir yorum gönderin. Herhangi bir önemli hizmet eksikse, lütfen GitHub’a bir sorun bildirin. Bu gönderiyi en iyi performans gösteren hizmet seçenekleriyle güncel tutmak istiyorum.


2
myip.opendns.comDNS yöntemini Krinkle'nin cevabındaki gibi karşılaştırdınız mı? Şu anda, bu yöntem için diğer sağlayıcılardan habersiz olmaları nedeniyle varsayılan olarak kazandığı görülüyor, ancak diğer yöntemlerle karşılaştırmak yine de yararlı olacaktır.
James Haigh

@JamesHaigh Öneriniz için teşekkürler. Cevaba DNS ve diğer yöntemler (telnet, ftp) ekledim. En hızlı yöntem, çözücünün IP adresini (etki alanı adı yerine) doğrudan kullanarak DNS gibi görünüyor.
rsp

Canhazip.com / canhazip.com adresini de eklemeniz / test etmeniz gerekir (HTTP ve HTTPS).
xxdesmus 22:15

Myip.addr.space ' i listenize ekleyebilirsiniz . Bunu kendim yaptım, özellikle o zaman gördüğüm diğerlerinden hiç memnun değildim.
Michael Hampton,

Bazen 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) ve curl http://canhazip.com(36.71.64.71) kullanarak farklı sonuçlar alıyorum. Hangisinin doğru olduğuna nasıl karar verebilirim?
Sutandiono 12:16

80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Hollandalı çalışanı ile değiştirilen site.


3
+1 whatismyip.com'u biliyordum, ancak whatismyip.org'u bulamadım.
Julian,

Bunu asla bilemedim! Harika bir site!
bbosak

2
@ MaciekSawicki -sBu durumda seçenek gerçekten gerekli mi? Fedora 15 / bash 4.2.10 (1) ile / onsuz denedim ve her iki şekilde de çalıştı.
ztank1013

4
Artık CLI ile çalışmıyor gibi görünüyor, ancak bir web tarayıcısından web sayfasına gitmek işe yarıyor. OpenSUSE 12.1 x64 kullanıyorum.
SaultDon

5
whatismyip.comharici IP'yi kontrol etmek için ücretsiz servisi kaldırdı . Yani, korkarım bu artık doğru değil. icanhazip.comhala çalışıyor.
daSong


18

Sen kullanabilirsiniz ifconfig.me whatismyip.org için alternatif olarak.

curl -s http://ifconfig.me

Ayrıca ifconfig.me bazı ek işlevlere sahiptir. Başka hangi bilgileri alabileceğinizi öğrenmek için web sitesini ziyaret edin.


5
Çok yavaş . Sık sık 30 saniye içinde bazen bazen bir dakika içinde bile tepki süreleri alıyorum! Bazen yarım saniye (hala çok fazla) ve 15 saniye kadar sürüyor. Bu farklı konumlardan test edilmiştir. Daha fazla bilgi ve kıyaslamalar için cevabımı
rsp,

15
wget -O - -q http://whatismyip.org/

3
<img src='ipimg.php'/>
IP'mi

İyi miktarda regex büyüsü ile çalışmasını sağladım, ama kolay olmadı. Bu hizmeti kullanmakta ısrar ederseniz, bu satırı bir komut dosyasına $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
eklediğinizden


9

Curlmyip.com'u kullanmayı tercih ediyorum.

curl curlmyip.com

Hatırlaması kısa ve kolaydır.


bashOP'nin amacında kullanım için -s, diğer cevaplarda belirtilen seçenek olmadan yapamazsınız .
Serge Stroobandt

3
@SergeStroobandt Evet yapabilirsiniz. Tüm -sanahtarı yani sessiz modda çalıştırılır gelmez. hata mesajları görüntülenmez. Bu yüzden senaryosunun hataları nasıl halletmesini istediği ile ilgili. Komutun kendisi, kullandığı kadar güvenilir bir IP adresi döndürür -s.
Garrett Fogerlie,

1
Şimdiye kadar, bu site çoklu testlerde en güvenilir siteydi.
Amos Shapira

9
curl ident.me

VEYA

curl ifconfig.me

VEYA

curl tnx.nl/ip

VEYA

curl ipecho.net/plain

VEYA

curl ip.appspot.com

VEYA

curl whatismyip.akamai.com

VEYA

curl icanhazip.com

VEYA

curl wgetip.com

VEYA

curl ip.tyk.nu

VEYA

curl curlmyip.com

VEYA

curl corz.org/ip

VEYA

curl bot.whatismyipaddress.com

Referans


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

Site çalışıyor olmasına rağmen boş çıktı. Neden bir fikrin var mı? Eğer uygunsa proxy arkasındayım ama wget icanhazip.comişe yarıyor.
l0b0

@ l0b0 Parçayı atlamayı ve proxy’den | tail -n1ne aldığınızı görmeye çalışın
Eugene Yarmash

Hiçbir şey, sadece kod 1'den çıkın netcat icanhazip.com 80. Sanki görmezden geliyor $http_proxyve arkadaş gibi görünüyor , çünkü proxy ve portu belirtmek -xbir takma işlemiyle sonuçlandı.
l0b0

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1basit bir HTTP proxy için (3128 numaralı bağlantı noktasında çalıştığını varsayarsak). Açıkçası proxy'nin IP adresini yine de alacaksınız.
üçlü,

1
HTTP 1.0'da Host:istek başlığı yok - ad tabanlı sanal barındırma HTTP 1.1'deki en büyük gelişmelerden biriydi. HTTP / 1.1 belirtme isteğini değiştirin veya Ana Bilgisayar başlığını kaldırın (eskiyi tavsiye ederim).
17'de CVn

4

Tüm bu önerileri okuduktan sonra daha da fazla okumak istiyorsanız, işte size tartışmalı bir şekilde tasarlanmış bir Bash betiği.

Şubat 2017'den itibaren iyi çalışan DNS ve HTTP sunucularının bir listesini içerir.

Eğer varsa dig, ilk önce çeşitli HTTP servislerinden daha hızlı olan ve neredeyse büyüklükteki bir DNS dener.

Aldığı ilk cevapta çıkar.

Eğer yoksa digveya tüm DNS sunucularınız başarısız olursa, bir cevap alana kadar HTTP servislerini dener.

Sunucular alfabetik olarak sıralanmıştır, ancak her zaman aynı olanı kullanmaktan kaçınmak için kullanımdan önce karıştırılır.

#!/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

Örnek kullanım (betiği aradım 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'

Dışında açıklama verbosekullanılan sunucuyu baskı önlemek için komut üstündeki değişken.

Güncelleme: bu komut dosyası artık Github'da da gerektiğinde güncelleyebilirim:
https://github.com/mivk/myip


3

Bazı potansiyel tuzaklardan kaçınmak için HTTPS kullanmak istiyorsanız:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
Belki de burada kaçınılmakta olduğunuz potansiyel tuzakların neler olduğunu açıklayabilir misiniz?
Caleb

İpcheckit.com alan adı görünüşte satılıktır ve artık IP adresini gösteren hizmeti barındırmamaktadır.
Manatwork

ah, writeonly scripts tuzaklar :)
Ярослав Рахматуллин

@Chris Down tekniği hala geçerli, sadece kullanabilmeniz için SSL özellikli bir siteye ihtiyacınız var.
Caleb

3

İşte, işletmenin uzaklaşan veya biçimini değiştirebilecek "kamu hizmeti" siteleri yerine dinamik IP yönetimiyle ilgili çözüm arayan ana bilgisayarlara bağlı olan başka bir alternatif.

  1. Sunucunuzu birçok ücretsiz dinamik dns hizmetinden birine (örneğin no-ip.com) kaydettirin. Bu size xxx.no-ip.org gibi bir DNS girişi verecektir.
  2. Hizmetin dinamik güncelleme aracını yükleyin (IP değişikliklerini servise bildirir).

IP adresini bir komut dosyasında almak için şunu yapın:

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

Dinamik IP'nin değişip değişmediğini ve bazı yapılandırma girişlerinin değiştirilmesi gerekip gerekmediğini kontrol etmek için cron işinde kullanım için idealdir.


3

Bu her zaman benim için çalışıyor, IP adresimi almak için conky kullanıyorum.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 Bu kadar sakar görünmesine rağmen, bu yaklaşım benim için de birkaç kez hayat kurtarıcı oldu. Çünkü internet WWW değildir . İnternet erişimine sahip olabilirsiniz, ancak (genellikle sunucu odalarında) GUI olmayan bir konsola mahkum olabilir ve bu durumda checkIP servis URL'lerinden birinin kalbinden hatırlamak önemlidir . Ve bu oldukça yaygın olduğu için, sadece görünüşe göre derlenmiş durumda amazonaws. Yani, bunun için google yolu yok. (hatta değil lynx).
sözdizimi

3

Bağlantıya veya servise güvenmediğim için, farklı servisler kullanarak IP'yi almaya çalışan aşağıdaki kodu kullanıyorum (daha fazla eklemek için çekinmeyin):

# 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" 

Daha fazla sağlamlık eklemek için (örneğin, servislerden biri biçimini değiştirirse), $IPaşağıdaki işlevi kullanarak geçerli bir IP olduğunu kontrol edebilirsiniz :

# 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;
}

3

ifcfg.me destekler:

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

IPv4 ve IPv6, curl ile daha da fazla şey: ifcfg.me/?


Yöntem Krinkle'nin cevabındakinslookup yöntemle nasıl ilişkilidir ? İkisi de DNS kullanıyor, değil mi? Öyleyse, burada aynı DNS kaydını almasını sağlamak için bazı seçeneklerden geçebilir miyim ? digdignslookup
James Haigh

dig +short . @ifcfg.meİsterseniz Evet kullanabilirsiniz
Eun

2

Ailem için bir bulut servisi işletiyorum ve cronher sabah saat 5'de çalıştığım bu hızlı senaryoyu yaptım çünkü ucuzum ve statik bir IP almayacağım.

Genel IP'yi alır ve kullanıcılarıma e-posta ile gönderir. E-postayı köprü biçiminde e-postayla gönderdim, böylece annem bağlantı noktalarını veya başka bir şeyi yazmak zorunda kalmayacak. Belki başka biri onu kullanabilir.

#!/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

1

Bu, geçerli ip adresini bir açılır pencerede gösterecektir:

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

1

IP adresini JSON / XML veya düz metin olarak döndüren bir servis kurdum. Onları burada bulabilirsiniz

http://ipof.in/txt

/ Json ve / xml ile aynı URL, size başka biçimler de verir

HTTPS istiyorsanız, aynı URL’leri https öneki ile kullanabilirsiniz. Avantajı, bir Wifi olsa bile, genel adresi alırsınız.

Yani basit bir takma ad myip = "curl https://ipof.in/txt " IP'nizi alacak


1

Alternatif kullanabilirsiniz STUN otomatik bir şekilde bu soruya cevap icat edilmiştir ve örneğin internet iletişiminde yaygın bir biçimde kullanılmaktadır SIP ve WebRTC'de .

Bir stunclient kullanarak (debian / ubuntu'da apt-get install stuntman-client) basitçe:

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

nerede A.B.C.Dyerel net makinenizin IP adresidir ve W.X.Y.Zweb siteleri gibi IP adresi sunucuları dışarıdan (ve bir Aradığınız) görmek olduğunu. Kullanarak sedyukarıdaki çıktıyı yalnızca bir IP adresine indirebilirsiniz:

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

Temel komut satırı araçlarından başka bir şey kullanarak alternatif bir STUN araması için AskUbuntu'daki cevabımı görün (üretim kullanımı için değil, eğlenceli bir egzersiz olarak düşünülmüş).


0

W3m Plaintext-Tarayıcı, bash için harika. Aşağıdaki gibi yanıtı kısaltmak için kullanabilir grepve kullanabilirsiniz tail:

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


0

DNS adreslerini çeviren bir NAT yönlendiricisinin arkasında bile bir DNS isteği kullanmak, bu işe yarayabilir:

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

veya bunun yerine HTTP istek yöntemini kullanabilirsiniz:

$ curl -s ipinfo.io/ip
x.y.z.t

1
Neden birini diğerine tavsiye edersiniz?
roaima

@roaima Haklısın, karar vermek her kullanıcıya bağlı.
SebMa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.