Ermitteln der öffentlichen IP-Adresse in einem Shell-Skript

39

Ich kann meine IP-Adresse mit dem Befehl ifconfig oder hostname -i ermitteln.

Aber wie finde ich meine öffentliche IP?

(Ich habe eine statische öffentliche IP-Adresse, möchte diese jedoch mithilfe des Unix-Befehls herausfinden.)

shantanuo
quelle
Versuchen Sie dies programmatisch?
Andrew Keith
Ja, in Shell-Skript
Shantanuo
1
Verwenden Sie Linux, MacOSX, FreeBSD usw.? Die Ausgabe von 'ifconfig' unterscheidet sich für diese verschiedenen Betriebssysteme, und der Befehl 'ip' ist unter MacOSX nicht vorhanden. Suchen Sie nach der IP Ihres Computers (Sie benötigen ein Shell-Skript, um ifconfig oder etwas anderes zu analysieren) oder nach Ihrem Router (Die folgenden Websites funktionieren möglicherweise)?
Stefan Lasiewski

Antworten:

49

curl ifconfig.me

curl ifconfig.me/ip (nur für die ip)

curl ifconfig.me/all (für mehr Infos braucht man Zeit)

Weitere Befehle finden Sie unter: http://ifconfig.me/#cli_wrap

tsanand129
quelle
1
Was ist mit IPv6-Adressen?
Matt3o12
Dieser Link ist tot. Sie können dies stattdessen verwenden:curl http://checkip.amazonaws.com/
Farhan.K
@ Farhan.k bitte poste dies als antwort da es wohl die beste antwort ist. Wenn Sie dies nicht tun, werde ich Ihren Namen erwähnen und ihn
vorschlagen
@Aliostad zögern Sie nicht, es zu posten :)
Farhan.K
@ Farhan.K Argh, geschützt: /
Aliostad
26

Sie können anfordern myip.opendns.com. von OpenDNS. dig @208.67.222.220 myip.opendns.com

Zoredache
quelle
8
Das ist einfach cool. Für eine leicht zu merkende Version können Sie eingeben dig @resolver1.opendns.com myip.opendns.com. Oder unter Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat
2
Was bei mir am besten geklappt hat: dig @208.67.222.220 myip.opendns.com +shortum direkt die ip zu bekommen ohne die ganze antwort durchgehen zu müssen.
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


Beachten Sie, dass das oben Genannte derzeit nur für IPv4 funktioniert (keiner dieser Resolver scheint derzeit über IPv6 zu verfügen). Wenn Sie jedoch -4das Explizite weglassen, besteht die -t aGefahr, dass es in Zukunft ausfällt (mit Ausnahme von Google txt, das möglicherweise tatsächlich funktioniert) IPv6 eines Tages, wenn es von Google ordnungsgemäß aktiviert wurde)).

Beachten Sie, dass dies myip.opendns.comnur durch resolver1.opendns.comund nicht durch auth1.opendns.combehoben werden kann. Sie scheinen also DNS-Hijacking durchzuführen und mitten in ihrem eigenen Domain-Namen zu sein! Sie können es daher nicht verwenden, um die IP eines zufälligen Auflösers zu finden, da dies resolver1.opendns.comfür nicht maßgeblich ist myip.opendns.com.

Beachten Sie, dass dies o-o.myaddr.l.google.comder flexibelste und zukunftssicherste Ansatz ist. Sie können sogar testen, ob Ihr DNS-Resolver die experimentelle EDNS0-Erweiterung für das Client-Subnetz unterstützt (für die nur sehr wenige Resolver die Unterstützung haben):

% 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
quelle
2
I @ Matt3o12 <gefunden OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
Bufh
Heutzutage unterstützt die Methode zum Abrufen von TXT-Einträgen von Google sowohl IPv4 als auch IPv6. Geben Sie daher an, -4oder -6ob Sie eine bestimmte IP-Version benötigen.
Martin
12

Eine sehr einfache Antwort, wenn Sie einen Internetzugang haben, ist:

curl icanhazip.com

Bedenken Sie, dass das Vertrauen in Drittanbieterquellen für Ihre IP-Adresse problematisch sein kann, insbesondere wenn das, was Sie mit diesen Daten tun, eine besondere Bedeutung hat.

Ein vertrauenswürdigerer Weg ist, einen bekannten, vertrauenswürdigen DNS-Server (im Idealfall DNSSEC) auszuwählen und den Hostnamen der Box damit abzufragen, sofern Ihr DNS-Server solche Einträge enthält.

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

Ich habe dafür einen einfachen und schnellen Webservice geschrieben.

curl ident.me

Sie können nach Ihrem IPv4 fragen:

curl v4.ident.me

Oder IPv6:

curl v6.ident.me

Die API ist unter http://api.ident.me/ dokumentiert.

Pierre Carrier
quelle
5

Wenn

  1. Sie haben nur eine öffentliche IP-Adresse und
  2. Sie sind direkt mit dem Internet verbunden (kein NAT / Proxy / VPN usw.)

Dann können Sie einfach die Ausgabe von ifconfig nach den IP-Adressen der Schnittstellen (dem Teil "inet addr:") analysieren, um die Liste der IP-Adressen aller Ihrer Schnittstellen abzurufen. Die eine IP-Adresse, die nicht im privaten Bereich liegt (siehe http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ), ist Ihre öffentliche IP-Adresse.

Die gleiche Liste erhalten Sie auch über

ip addr show

Das kann einfacher zu analysieren sein.

Wenn Sie keine direkte Internetverbindung (NAT usw.) haben, können Sie Ihre öffentliche IP-Adresse nicht ohne externe Hilfe finden (da Ihr Computer sie nicht kennt). Dann musst du es wie in den anderen Antworten machen.

sleske
quelle
4

Ich habe einen etwas anderen Ansatz gewählt, indem ich das für NAT Traversal entwickelte STUN-Protokoll verwendet habe. Wenn Sie Ubuntu verwenden, können Sie das Paket "stun" einfach installieren, indem Sie Folgendes eingeben:

sudo apt-get install stun

Das Paket installiert einen STUN-Server, den Sie wahrscheinlich nicht benötigen, enthält jedoch auch einen STUN-Test-Client, mit dem ich dieses Problem gelöst habe. Jetzt können Sie Ihre öffentliche IP mit einem (nicht ganz einfachen) Befehl abrufen:

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

Nun geht es darum, dass stun den öffentlichen STUN-Server "stunserver.org" kontaktiert und eine Antwort mit Ihrer öffentlichen IP-Adresse erhält. Der Rest des Befehls besteht nur darin, die IP-Adresse aus der Ausgabe herauszufiltern.


quelle
stun.l.google.com ist schneller: D
Zibri
3

Eine Möglichkeit ist, dass Sie eine Anfrage an die Seite unter stellen können

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

Es gibt die IP-Adresse Ihres Systems zurück

Biranchi
quelle
Es dient Klartext mit einer Art von Text / HTML ...
Bortzmeyer
zeigt es nicht deine IP in deinem Browser an?
2
Aber mit dem falschen Typ.
Bortzmeyer
@bortzmeyer Äh, was ist der "richtige Typ"? text/htmlist in Ordnung für das, was diese Pseudo-API zurückgibt - es ist sicherlich nicht XML oder JSON. text/plainvielleicht, aber es ist völlig verwendbar als text/html.
Ceejayoz
3
+1 für eine Seite, die kein Greifen benötigt. Alsowget -q -O - http://wgetip.com/
Xofer
3

Google zeigt jetzt Ihre öffentliche IP-Adresse an: http://www.google.com/search?q=ip

Jake Wilson
quelle
Das funktioniert bei mir weder in einem Browser noch per Curl.
Ladadadada
Das ist merkwürdig. Meins sagt "Ihre öffentliche IP-Adresse ist XX.XX.XXX.XX - Weitere Informationen" oben vor dem ersten serp.
Jake Wilson
Funktionierte auf meinem 3G-Anschluss. Weitere Punkte erfahren Sie hier .
Ladadadada
Google zeigt aus irgendeinem Grund nur Ihre IP-Adresse an, basierend darauf, welche User-AgentZeichenfolge auf der Seite angezeigt wird. Mit Firefox funktioniert es; Aber SeaMonkey mit deaktiviertem "Firefox" -String (über "general.useragent.compatMode.firefox" auf "false" gesetzt) ​​funktioniert dies plötzlich nicht mehr. Haben Sie überhaupt keine Ahnung, warum Google so etwas explizit nur für Firefox anstelle von Gecko aktiviert, da es viele andere Desktop-Browser auf Gecko-Basis gibt, die ebenfalls kompatibel sind, einschließlich SeaMonkey.
cnst
curl -qs " google.com/search?q=blowme"|tr " () "\ n" | grep Client | cut -d ":" -f 2 | tr -d ""
Zibri
3

Okay ... ich weiß, dass dies WEG ist und wahrscheinlich nicht einmal einen Beitrag wert ist, aber hier ist meine funktionierende Lösung.

#!/bin/sh

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

Schön und einfach.

Kegeln
quelle
2
Dies gibt die interne IP-Adresse zurück, die nicht abgefragt wurde. Zu Ihrer Information können Sie dies jedoch auch mit dem Befehl hostname -I(Großbuchstabe 'i') tun .
Redsandro
3

Am einfachsten ist es , wie vorgeschlagen http://ifconfig.me/ zu verwenden .

Auf dieser Seite erfahren Sie, welcher Befehl für welche Informationen verwendet werden soll, die Sie abrufen möchten.

Für IP:

locken ifconfig.me
oder
locken ifconfig.me/ip

Für öffentlichen Hostnamen:

locken Sie ifconfig.me/host

Für alle Informationen in einer XML-Datei:

locken Sie ifconfig.me/all.xml

etc ... checkt einfach http://ifconfig.me aus

Kelindil
quelle
2

Ich mache das oft und von vielen Geräten aus, also habe ich meine eigenen zwei Dienste auf einem Server erstellt:

  1. PHP-Datei im Stammverzeichnis eines Webservers:

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

    Verwendung auf einer Shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    funktioniert auch mit ipv6:

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

    Mit Netcat:

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

    Auf einem Cisco-Router:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. Schneller Hack mit einem benutzerdefinierten Telnet-Server: 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
    }
    

    und dann telnet darauf:

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

    funktioniert genauso mit einem router:

    router#telnet myserver.com
    79.22.192.12
    

Auf diese Weise können Sie es in Ihrem internen Netzwerk zum Laufen bringen, wenn ein Nat oder ein Proxy an der Kommunikation beteiligt ist und Sie wissen möchten, von welcher IP aus Sie angezeigt werden.

Es ist kein Service von Drittanbietern erforderlich.

petrus
quelle
2

Um nicht auf externe Quellen angewiesen zu sein, verwende ich expect, um in meinen Router zu telneten und die IP-Adresse seiner öffentlichen Schnittstelle abzurufen. Hier ist ein Beispiel für ein Expect-Skript:

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

Ich führe dann das obige Skript wie folgt aus, um die öffentliche IP zu erhalten:

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

Dies basiert natürlich auf der Annahme, dass ich Administratorzugriff auf den Router habe und dass es sich um einen Linux-basierten Router handelt, für den der Befehl ifconfig verfügbar ist.

Hammad Akhwand
quelle
1

Wenn Sie die externe IP-Adresse Ihres Routers ermitteln möchten, fragen Sie entweder den Router selbst nach seiner WAN-Adresse oder fragen Sie jemanden außerhalb des Routers, ob er sie für Sie abrufen soll.

Manuell können Sie eine der oben angegebenen Sites durchsuchen, die die IP-Adresse der eingehenden Anfrage zurückgeben.

Auf automatisierte Weise können Sie versuchen:

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

Dadurch erhalten Sie die Zeile, die die IP - Adresse in der http - Antwort enthält, und können sie dann mit sed, awk usw

Quanten
quelle
0

Sie können nur die Shell verwenden, um Ihre externe IP-Adresse zu überprüfen, auch mit externen Anbietern

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

Ausgabe


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

quelle
0

Ich mache das Es gibt mir nur die IP ohne Beteiligung von Dritten.

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

Leigh Geary
quelle
3
Er möchte seine öffentliche IP-Adresse. Nicht die lokale.
Jake Wilson
0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Fathi
quelle
0

Hier ist eine weitere Alternative, die von Hosts abhängt, deren Geschäft sich mit der Verwaltung dynamischer IP-Adressen befasst, und nicht mit "öffentlich zugänglichen" Sites, die möglicherweise nicht mehr funktionieren oder das Format ändern.

1) Registrieren Sie Ihren Server bei einem der vielen kostenlosen dynamischen DNS-Dienste (z. B. no-ip.com). Dadurch erhalten Sie einen DNS-Eintrag wie xxx.no-ip.org.

2) Installieren Sie das dynamische Aktualisierungstool des Dienstes (meldet IP-Änderungen an den Dienst).

Gehen Sie wie folgt vor, um die IP-Adresse in einem Skript abzurufen:

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

Hervorragend für die Verwendung in Cron-Jobs geeignet, um zu überprüfen, ob sich die dynamische IP geändert hat und einige Konfigurationseinträge geändert werden müssen.

cgmonroe
quelle
0

Unter OS X gibt es zwei einfache Lösungen, um sowohl die private als auch die öffentliche IP-Adresse abzurufen (mit Bonuscode, wenn Sie LaunchBar verwenden).

Private IP

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

LaunchBar Script

#!/bin/sh

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

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

Öffentliche IP

$ 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

LaunchBar Script

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

quelle