Recherche de l'adresse IP publique dans un script shell

39

Je peux trouver mon adresse IP à l'aide de la commande ifconfig ou hostname -i.

Mais comment trouver mon adresse IP publique?

(J'ai une adresse IP publique statique mais je veux le savoir en utilisant la commande unix)

shantanuo
la source
essayez-vous de le faire par programmation?
Andrew Keith
oui en shell script
shantanuo
1
Utilisez-vous Linux, MacOSX, FreeBSD, etc.? La sortie de 'ifconfig' est différente pour ces différents systèmes d'exploitation et la commande 'ip' n'existe pas sur MacOSX. Recherchez-vous l'adresse IP de votre ordinateur (vous aurez besoin d'un script shell pour analyser ifconfig, ou quelque chose du genre) ou de votre routeur (les sites Web ci-dessous pourraient fonctionner)?
Stefan Lasiewski

Réponses:

49

curl ifconfig.me

curl ifconfig.me/ip (pour juste l'ip)

curl ifconfig.me/all (pour plus d'informations, prend du temps)

Pour plus de commandes, visitez: http://ifconfig.me/#cli_wrap

tsanand129
la source
1
Qu'en est-il des adresses IPv6?
Matt3o12
Ce lien est mort. Vous pouvez utiliser ceci à la place:curl http://checkip.amazonaws.com/
Farhan.K
@ Farhan.K s'il vous plaît poster ceci comme une réponse car c'est probablement la meilleure réponse. Si vous ne le faites pas, je mentionnerai votre nom
Aliostad le
@Aliostad ne hésitez pas à le poster :)
Farhan.K
@ Farhan.K argh, protégé: /
Aliostad
26

Vous pouvez demander myip.opendns.com. de OpenDNS. dig @208.67.222.220 myip.opendns.com

Zoredache
la source
8
C'est juste cool. Pour plus facile de se rappeler la version, vous pouvez mettre en dig @resolver1.opendns.com myip.opendns.com. Ou sous Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat
2
Ce qui a fonctionné le mieux pour moi: dig @208.67.222.220 myip.opendns.com +shortpour obtenir directement l'adresse IP sans avoir à passer par toute la réponse.
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


Notez que ce qui précède ne fonctionne que pour IPv4 pour le moment (aucun de ces résolveurs ne semble même avoir IPv6 pour le moment, mais si vous omettez -4le texte explicite -t a, vous risqueriez de le perdre à l’avenir (à l’exception de celui de Google txt, qui pourrait en réalité fonctionner pour IPv6 un jour, si correctement activé par Google)).

Notez que cela myip.opendns.comne peut être résolu que par resolver1.opendns.com, et non pas avec auth1.opendns.com- donc, ils semblent faire du piratage DNS et de l'homme au milieu de leur propre nom de domaine! Ainsi, vous ne pouvez pas l'utiliser pour trouver l'adresse IP d'un résolveur aléatoire, car resolver1.opendns.comne fait pas autorité pour myip.opendns.com.

Notez que cela o-o.myaddr.l.google.comressemble à l'approche la plus flexible et la plus durable; c'est même utile pour tester si votre résolveur DNS prend en charge l'extension EDNS0 expérimentale pour le sous-réseau client (que très peu de résolveurs ont le support):

% 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
la source
2
@ Matt3o12 <J'ai trouvé OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh
De nos jours, la méthode qui consiste à obtenir des enregistrements TXT auprès de Google prend en charge les protocoles IPv4 et IPv6. Vous devez donc spécifier -4ou -6si vous avez besoin d’une version IP spécifique.
Martin
12

Une réponse très simple si vous avez accès à Internet est:

curl icanhazip.com

N'oubliez pas qu'il peut être problématique de faire confiance à des sources tierces pour votre adresse IP, en particulier si ce que vous faites avec ces données a une signification particulière.

Une méthode plus fiable consiste à choisir un serveur DNS connu et digne de confiance (exécutant idéalement DNSSEC) et à interroger le nom d’hôte de la boîte avec celui-ci, à condition que votre serveur DNS contienne de telles entrées;

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

J'ai écrit un service web simple et rapide pour cela.

curl ident.me

Vous pouvez demander votre IPv4:

curl v4.ident.me

Ou IPv6:

curl v6.ident.me

Et l’API est documentée sur http://api.ident.me/

Pierre Carrier
la source
5

Si

  1. vous n'avez qu'une seule adresse IP publique et
  2. vous êtes directement connecté à Internet (pas de NAT / proxy / VPN, etc.)

alors vous pouvez simplement analyser la sortie de ifconfig pour les adresses IP des interfaces (la partie "inet addr:") pour obtenir la liste des adresses IP de toutes vos interfaces. L'adresse IP unique qui n'est pas dans la plage privée (voir http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) est votre adresse IP publique.

La même liste peut également être obtenue via

ip addr show

qui peut être plus facile à analyser.

Si vous ne disposez pas d'une connexion Internet directe (NAT, etc.), il est impossible de trouver votre adresse IP publique sans aide externe (car votre ordinateur ne le sait pas). Ensuite, vous devrez le faire comme dans les autres réponses.

sleske
la source
4

J'ai adopté une approche légèrement différente en utilisant le protocole STUN conçu pour NAT Traversal. Si vous utilisez Ubuntu, vous pouvez simplement installer le paquet "stun" en tapant:

sudo apt-get install stun

Le paquet installe un serveur STUN dont vous n’auriez probablement pas besoin, mais il est également livré avec un client de test STUN que j’ai utilisé pour résoudre ce problème. Maintenant, vous pouvez récupérer votre adresse IP publique avec une commande (pas si simple):

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

Maintenant, ce qu'il fait est: stun contacte le serveur STUN public "stunserver.org" et reçoit une réponse avec votre adresse IP publique; le reste de la commande consiste simplement à filtrer l'adresse IP de la sortie.


la source
stun.l.google.com est plus rapide: D
Zibri
3

Une façon est, vous pouvez faire une demande à la page à

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

il retourne l'adresse IP de votre système

Biranchi
la source
Il sert du texte brut avec un type de texte / html ...
bortzmeyer
n'est-ce pas l'affichage de votre adresse IP dans votre navigateur?
2
Mais avec le mauvais type.
bortzmeyer
@ bortzmeyer Euh, quel est le "bon type"? text/htmlconvient pour ce que cette pseudo-API renvoie - ce n'est certainement pas XML ou JSON. text/plainpeut-être, mais c'est tout à fait utilisable comme text/html.
ceejayoz
3
+1 pour une page qui n'a pas besoin de greps. Aussiwget -q -O - http://wgetip.com/
Xofer
3

Google affiche maintenant votre adresse IP publique: http://www.google.com/search?q=ip

Jake Wilson
la source
Cela ne fonctionne pas pour moi, que ce soit dans un navigateur ou via curl.
Ladadadada
C'est étrange. Le mien dit "Votre adresse IP publique est XX.XX.XXX.XX - En savoir plus" en haut avant le premier serp.
Jake Wilson
Travaillé sur ma connexion 3G. Apprenez plus de points ici .
Ladadadada
Pour une raison étrange, Google n'affiche que votre adresse IP en fonction de la User-Agentchaîne fournie à la page. Avec Firefox, ça marche. mais SeaMonkey avec la chaîne "Firefox" désactivée (par l'intermédiaire de "general.useragent.compatMode.firefox" défini sur false), ce n'est tout à coup pas le cas. Je ne vois absolument pas pourquoi Google autorise explicitement ce genre de choses uniquement pour Firefox et non pour n'importe quel Gecko, car de nombreux autres navigateurs de bureau basés sur Gecko sont également compatibles, y compris SeaMonkey.
cnst
curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri le
3

D'accord ... Je sais que c'est bien après coup et probablement même pas la peine de poster, mais voici ma solution de travail.

#!/bin/sh

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

Sympa et simple.

Jeu de quilles
la source
2
Ceci renvoie l'adresse IP interne qui n'a pas été demandée. Mais, pour votre information, vous pouvez aussi le faire avec la commande hostname -I(capital 'i').
Redsandro
3

Le moyen le plus simple consiste à utiliser http://ifconfig.me/ , comme suggéré.

Sur cette page, vous saurez quelle commande utiliser pour quelles informations vous souhaitez récupérer.

Pour IP:

curl ifconfig.me
ou
curl ifconfig.me/ip

Pour le nom d'hôte public:

curl ifconfig.me/host

Pour toutes les informations dans un fichier XML:

curl ifconfig.me/all.xml

etc ... il suffit de vérifier http://ifconfig.me

Kelindil
la source
2

Je le fais souvent, et à partir de nombreux appareils, j'ai donc créé mes deux services sur un serveur:

  1. Fichier php à la racine d'un serveur web:

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

    Utilisation sur un shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    travaille également avec ipv6:

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

    Avec netcat:

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

    Sur un routeur Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. piratage rapide avec un serveur telnet personnalisé: 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
    }
    

    puis par telnet:

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

    fonctionne de la même manière avec un routeur:

    router#telnet myserver.com
    79.22.192.12
    

De cette façon, vous pouvez le faire fonctionner sur votre réseau interne, si un nat ou un proxy est impliqué dans la communication et si vous souhaitez savoir de quelle adresse IP vous vous trouvez.

Il ne nécessite aucun service tiers.

petrus
la source
2

Pour éviter de faire appel à des sources externes, j’utilise normalement expect, pour établir une connexion telnet avec mon routeur et obtenir l’adresse IP de son interface publique. Voici un exemple de script attendu:

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

J'exécute ensuite le script ci-dessus comme ceci pour obtenir l'adresse IP publique:

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

Bien sûr, cela est basé sur l'hypothèse que j'ai un accès administrateur au routeur, et que c'est un routeur basé sur Linux, avec la commande ifconfig disponible.

Hammad Akhwand
la source
1

Si vous voulez trouver l’adresse IP externe sur votre routeur, vous devez demander au routeur lui-même son adresse wan ou demander à une personne extérieure de l’obtenir pour vous.

pour une manière manuelle, vous pouvez parcourir l’un des sites cités ci-dessus qui renverront l’IP de la requête entrante.

Pour un moyen automatisé, vous pouvez essayer:

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

qui vous donnera la ligne contenant l'adresse IP sur la réponse http, puis l'analyser avec sed, awk, etc.

quanta
la source
0

vous pouvez utiliser uniquement le shell pour vérifier votre adresse IP externe, également à l'aide de fournisseurs externes

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

sortie


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

la source
0

Je fais ça. Cela me donne juste l'adresse IP sans aucune implication de tiers.

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

Leigh Geary
la source
3
Il veut son adresse IP publique. Pas le local.
Jake Wilson
0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Fathi
la source
0

Voici une autre alternative qui dépend des hôtes dont les activités sont résolues par la gestion d'une adresse IP dynamique plutôt que par des sites "de service public" susceptibles de disparaître ou de changer de format.

1) Enregistrez votre serveur sur l’un des nombreux services DNS dynamiques gratuits (par exemple, no-ip.com). Cela vous donnera une entrée DNS comme xxx.no-ip.org.

2) Installez l'outil de mise à jour dynamique du service (rapporte les modifications IP au service).

Pour obtenir l'adresse IP dans un script, procédez comme suit:

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

Idéal dans le travail cron pour vérifier si une adresse IP dynamique a été modifiée et si certaines entrées de configuration doivent être modifiées.

cgmonroe
la source
0

Sous OS X, il existe deux solutions simples pour obtenir à la fois l'IP privée et publique (avec un code bonus si vous utilisez LaunchBar).

IP privée

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

Script de la barre de lancement

#!/bin/sh

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

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

IP publique

$ 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

Script de la barre de lancement

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

la source