Einführung
Jedes mal, wenn ich meine IP Adresse wissen will, gebe ich bei einer Suchmaschine “my ip address” ein und klicke auf eines der Ergebnisse. Dies ist nicht sehr elegant. Auf einem Server ohne Browser ist dies gar nicht möglich. Deshalb habe ich ein Script geschrieben, welches mir meine IP Adressen (IPv4 und IPv6) anzeigt.
Script
Das Script sieht folgenermassen aus:
#!/usr/bin/env bash
#IPURL="https://icanhazip.com/ip"
IPURL="https://motd.ch/ip.php"
print_usage(){
cat << EOI
Displays IP addresses of the current host used for internet connections.
Usage: myip [options]
Options:
-6 Show only IPv6 addresses (public ip address by default).
-4 Show only IPv4 addresses (public ip address by default).
-h Show usage help.
-l Show local insted of public addresses.
-g Show geolocation (using geoiplookup).
No options produces a more verbose output.
EOI
}
check_dependencies(){
local FAIL=0
for tool in "$@"
do
if ! hash "$tool" &> /dev/null
then
echo "The tool $tool does not exist."
FAIL=1
fi
done
if [[ "$FAIL" == 1 ]]
then
exit 1
fi
}
print_public_ipv4_address(){
echo "$(curl -s -4 -L $IPURL || echo "")"
}
print_public_ipv6_address(){
echo "$(curl -s -6 -L $IPURL || echo "")"
}
print_public_ipv4_geolocation(){
geoiplookup "$PUBLIC_IPV4_ADDRESS" | awk -F": " '{printf($2)}'
}
print_public_ipv6_geolocation(){
geoiplookup6 "$PUBLIC_IPV6_ADDRESS" | awk -F": " '{printf($2)}'
}
print_local_ipv4_address(){
echo "$(curl -s -4 -L --write-out %{local_ip} $IPURL -o /dev/null || echo "")"
}
print_local_ipv6_address(){
echo "$(curl -s -6 -L --write-out %{local_ip} $IPURL -o /dev/null || echo "")"
}
main(){
while getopts 46ghlv name
do
case "$name" in
4)
flag_4=1
;;
6)
flag_6=1
;;
g)
flag_g=1
;;
h)
print_usage
exit
;;
l)
flag_l=1
;;
?)
print_usage >&2
exit 2
;;
esac
done
if [[ -n $flag_l && -n $flag_4 ]]
then
print_local_ipv4_address
fi
if [[ -n $flag_l && -n $flag_6 ]]
then
print_local_ipv6_address
fi
if [[ -z $flag_l && -n $flag_4 ]]
then
print_public_ipv4_address
fi
if [[ -z $flag_l && -n $flag_6 ]]
then
print_public_ipv6_address
fi
if [[ -z $flag_l && -z $flag_4 && -z $flag_6 ]]
then
PUBLIC_IPV4_ADDRESS=$(print_public_ipv4_address)
PUBLIC_IPV6_ADDRESS=$(print_public_ipv6_address)
echo -e "Public IPv4 address: ${PUBLIC_IPV4_ADDRESS:--}"
echo -e "Public IPv6 address: ${PUBLIC_IPV6_ADDRESS:--}"
LOCAL_IPV4_ADDRESS=$(print_local_ipv4_address)
LOCAL_IPV6_ADDRESS=$(print_local_ipv6_address)
echo -e "Local IPv4 address: ${LOCAL_IPV4_ADDRESS:--}"
echo -e "Local IPv6 address: ${LOCAL_IPV6_ADDRESS:--}"
echo ""
if [[ -n "$PUBLIC_IPV4_ADDRESS" && -n "$LOCAL_IPV4_ADDRESS" ]]
then
if [[ "$PUBLIC_IPV4_ADDRESS" != "$LOCAL_IPV4_ADDRESS" ]]
then
echo "IPv4: NAT"
else
echo "IPv4: No NAT"
fi
fi
if [[ -n "$PUBLIC_IPV6_ADDRESS" && -n "$LOCAL_IPV6_ADDRESS" ]]
then
if [[ "$PUBLIC_IPV6_ADDRESS" != "$LOCAL_IPV6_ADDRESS" ]]
then
echo "IPv6: NAT"
else
echo "IPv6: No NAT"
fi
fi
if [[ -n "$flag_g" ]]
then
check_dependencies geoiplookup geoiplookup6
if [[ -n "$PUBLIC_IPV4_ADDRESS" ]]
then
PUBLIC_IPV4_GEOLOCATION="$(print_public_ipv4_geolocation)"
echo "Geolocation IPv4: $PUBLIC_IPV4_GEOLOCATION"
fi
if [[ -n "$PUBLIC_IPV6_ADDRESS" ]]
then
PUBLIC_IPV6_GEOLOCATION="$(print_public_ipv6_geolocation)"
echo "Geolocation IPv6: $PUBLIC_IPV4_GEOLOCATION"
fi
fi
fi
}
main "$@"
Die aktuellste Version davon gibt es auf GitHub in meinem Scripts Repository: myip.
Alternativ kann auch eine einfachere Shell-Funktion in die ~/.bashrc
geschrieben werden:
myip ()
{
local ipurl="https://motd.ch/ip.php";
echo "Public IPv4 Address: $(curl -s -4 -L --write-out "\nLocal IPv4 Addres: %{local_ip}" $ipurl)";
echo "Public IPv6 Address: $(curl -s -6 -L --write-out "\nLocal IPv6 Addres: %{local_ip}" $ipurl)"
}
Funktionsweise
Das Script ruft die Webseite https://motd.ch/ip.php auf, welches einem die IP Adresse zurück gibt, mit welche die Seite aufgerufen wurde. Je nach dem, ob IPv4 oder IPv6 genutzt wird, wird die entsprechende IP Adresse angezeigt. Beispielsweise bekommt man so seine IPv6 Adresse:
$ curl -6 https://motd.ch/ip.php
2a23:523:DEAD:BEEF:F00:BA5:23:05
Das kleine PHP Script ip.php
ist auch im Scripts Repository zu finden:
ip.php. So kann
jeder einfach seine eigene Version hosten. Man kann im myip
Script aber auch
eine fremde Seite wie https://icanhazip.com/ip
einkragen.
Funktionen
Standardmässig zeigt das Script die öffentliche und die lokal verwendete IPv4 und IPv6 Adresse an. Zudem wird angezeigt, ob NAT verwendet wird oder nicht.
$ myip
Public IPv4 address: 5.23.42.66
Public IPv6 address: 2a23:523:DEAD:BEEF:F00:BA5:23:05
Local IPv4 address: 10.5.23.1
Local IPv6 address: 2a23:523:DEAD:BEEF:F00:BA5:23:05
IPv4: NAT
IPv6: No NAT
Das Script bietet folgende Optionen
-6
: Nur IPv6 Adressen anzeigen-4
: Nur IPv4 Adressen anzeigen-h
: Hilfe anzeigen-l
: Nur lokal verwendete Adressen anzeigen
So kann beispielsweise nur die lokal verwendete IPv4 Adresse angezeigt werden:
$ myip -4l
10.5.23.1
Jetzt kann man ganz einfach seine IP Adresse und weitere zusätzliche Informationen herausfinden, ohne den Browser zu öffnen.