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.