it-swarm.com.de

Methoden zum Ermitteln der öffentlichen IP-Adresse in Bash

Als Teil eines Installationsskripts möchte ich eine "gebildete Vermutung" über die public IP-Adresse der Maschine erstellen. Es sollte so robust wie möglich sein und auf einer Vielzahl von Hosts und Plattformen arbeiten. Hier ist ein Beispiel: 

https://Gist.github.com/4669037

Dieses Skript verwendet 3 Methoden und verwendet standardmäßig den Wert von /etc/hostname. Ich habe das bisher nur auf Ubuntu getestet. Wird dies wahrscheinlich bei anderen Distributionen funktionieren? Und gibt es zusätzliche Methoden, die ich hinzufügen könnte?

23
Jeroen
curl ipinfo.io/ip

Oder

wget -qO- ipinfo.io/ip

Oder

lynx -source ipinfo.io/ip

öffentliche IP-Adresse erhalten

43
Steven Penny

curl ifconfig.me wäre die beste Wahl, falls Sie keine curl haben:

wget -qO- ifconfig.me/ip

9
Kent

Wie viel öffentliches öffentliches IP suchen Sie? Was ist, wenn sich die Maschine hinter NAT befindet?

  • curl/wget/netcat (nc) <URL> enthält die Adresse des Anforderers: sollte die meiste Zeit funktionieren, aber möglicherweise ist die Site vom Computer nicht erreichbar (sei es eine Firewall oder eine temporäre/permanente Nichtverfügbarkeit). Sie erhalten so viele öffentliche IP-Adressen wie möglich.

  • ifconfig: muss als root ausgeführt werden, andernfalls müssen Sie auch /sbin/ifconfig oder /usr/sbin/ifconfig versuchen. Was ist, wenn die Maschine mehr Netzwerkkarten hat? Woher wissen Sie, welche IP die richtige ist? Was ist, wenn nur IPv6 im LAN des Computers verwendet wird? In jedem Fall erhalten Sie die geringste öffentliche IP-Adresse (und möglicherweise eine falsche IP-Adresse), wenn auf dem Computer mehrere Schnittstellen konfiguriert sind (was heutzutage bei allgegenwärtiger Virtualisierung mit Network Tap-Geräten und/oder häufig der Fall ist).

  • /etc/hostname: muss nicht vorhanden sein, auf vielen Systemen ist es /etc/HOSTNAME und enthält keine IP-Adresse, sondern sollte den Hostnamen (normalerweise den vollqualifizierten Domänennamen) enthalten.

Der Punkt ist, dass es viele Möglichkeiten gibt, auf die es scheitern kann, und Sie sollten wahrscheinlich erwägen, entweder a) genauer anzugeben, auf welche Systeme Sie abzielen, oder b) ob Sie die IP wirklich kennen müssen - eine Lösung, die scheint Arbeit in einfachen Fällen, die es wert sind, verwendet zu werden, wenn es in etwas komplizierterem Setup kläglich scheitert? Wenn Sie der Meinung sind, dass Sie die IP benötigen, bereiten Sie eine Möglichkeit vor, Fehler sorgfältig zu behandeln, wenn Sie entweder keine IP erhalten oder eine falsche.

2
peterph

Bei einem AWS EC2 können Sie Folgendes verwenden:

curl checkip.amazonaws.com

HINWEIS: Dieser Dienst kann von jedem Webclient aus verwendet werden.

1
Eric Semwenda

Diese Lösung funktioniert nicht, wenn Sie hinter nat oder so stehen. Es hilft ohne einen Service von Drittanbietern. Es funktioniert, wenn auf dem Computer die Verbindung vorhanden ist, beispielsweise ein Server oder eine PPP-Verbindung.

  • Keine genau richtige Antwort auf die Frage, hilft aber wahrscheinlich anderen Menschen (wie mir)
  • Erfordert in den meisten (oder allen?) Fällen Root zu sein

Sie können die (erste) Standardroute von route -n abrufen, die verwendete Schnittstelle und die IP-Adresse finden.

MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' )
IP=$( ifconfig $MAINIF | { IFS=' :';read r;read r r a r;echo $a; } )
1
Furkan Mustafa

Versuchen Sie diesen Befehl:

wget -O - -q icanhazip.com
1
MCurbelo

Verwenden Sie ipify API:

curl 'https://api.ipify.org?format=json'

Bash-Skript:

#!/bin/bash

ip=$(curl -s https://api.ipify.org)
echo "My public IP address is: $ip"
0
RiccardoCh

Verwenden Sie curl für hit shtuff.it IP-Dienst

curl http://shtuff.it/myip/short
0
Chris Montanaro

Nur bash verwenden (mit Hilfe von icanhazip.com ):

exec 3<>/dev/tcp/icanhazip.com/80 
echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3 
while read i
do
 [ "$i" ] && myip="$i" 
done <&3 
echo "$myip"

bash öffnet ein Socket für icanhazip und sendet eine http-Anfrage. Die IP-Adresse wird in der letzten nicht leeren Zeile der zurückgegebenen Daten zurückgegeben. (vorherige Zeilen sind http-Header)

Dies vermeidet die Notwendigkeit eines http-Clients wie wget oder curl.

0
Jasen