get_ip ? Funktionsweise?

Status
Für weitere Antworten geschlossen.

Astrong

Neuer User
Mitglied seit
28 Mai 2007
Beiträge
51
Punkte für Reaktionen
0
Punkte
6
Servus,

ich möchte gerne den Befehl "get_ip" auf anderen Linux-Derivaten anwenden.
Leider finde ich keine wirklichen Hinweise wie der Befehl im Backround arbeitet (PS: Bin kein Software-Developer, sonder nur standard Anwender.)

http://freetz.org/wiki/packages/mod

Vielen Dank schonmal!
 
Morgen
Es ist nur ein Skript, und/aber in sich dokumentiert:
PHP:
#!/bin/sh

[ -r /mod/etc/conf/mod.cfg ] && . /mod/etc/conf/mod.cfg

# Global result
IP=""

helpmsg() {
cat << EOF
get_ip - determine external IP address

Usage: $0 [option]
    -a, --all      - use all methods (order: stun, route, dsld, webcm) [recommended]
    -d, --dsld     - use showdsldstat (since firmware 04.86)
    -r, --route    - use routing table
    -s, --stun     - use STUN server (stun.1und1.de)
    -w, --webcm    - use webcm CGI handler / ctlmgr_ctl
    -?, --help     - print this help message

Current default method: $MOD_GET_IP_METHOD

Note: If environment variable IPADDR is set and contains a public IP (not from
a private or link-local network), its value will be returned.

EOF
}

# Detect private (RFC 1918) or link-local (RFC 5735) IPs
# Returns 0 for public IP, 1 for private IP, 2 if IP == ""
ip_public()
{
        [ "$1" ] || return 2
        local ip=$1
        # 10.0.0.0/8 (private), 192.168.0.0/16 (private), 169.254.0.0/16 (link-local)
        (
                [ "$ip" != "${ip#10.}" ] ||
                [ "$ip" != "${ip#192.168.}" ] ||
                [ "$ip" != "${ip#169.254.}" ]
        ) && return 1
        # 172.16.0.0/12 (private)
        [ "$ip" == "${ip#172.}" ] && return 0
        ip=$(echo $ip | cut -d '.' -f 2)
        [ $ip -ge 16  ] && [ $ip -le 31 ] && return 1 || return 0
}

via_dsld() {
        # Firmware ca. 04.68 and newer should be safe, but some boxes had it since 04.31
        IP="$(/sbin/showdsldstat 2>/dev/null | sed -nr 's/0: ip ([0-9.]+).*/\1/p')"
        ip_public "$IP" || return 1
}

# AVM's home-brew NAT does not expose the external IP on network interface
# "dsl", but sets a route to it. This method should work on most DSL boxes,
# with two known exceptions:
#   a) DNS servers are configured manually to hosts with public IP address.
#      In this case multiple candidate IPs would be found. Thus we return an
#      error rather than trying to guess which IP might be correct.
#   b) If the box does not connect to DSL via PPPoE but uses the DSL modem as a
#      bridge to e.g. a public /21 network, the external IP is not listed in
#      the routing table at all, but the /21 network instead.
# There might be more exceptions in case of routing table manipulation (maybe
# for VPNs or if for any reason a single external host IP is explicitly added
# to the routing table).
via_route() {
        local candidate_count=0
        for ip in $(route -n | sed -nr 's/^([1-9][0-9]*(\.[0-9]+){3}) +0(\.0){3} +255(\.255){3} +.* dsl$/\1/p'); do
                ip_public "$ip" && IP="$ip" && candidate_count=$((candidate_count + 1))
        done
        [ $candidate_count -eq 1 ] && return 0
        unset IP
        return 1
}

# On IP clients or UMTS, we are mostly behind a NAT and the only way to
# determine the external IP is to get the information from an external
# server. The most efficient method is STUN (stun-ip applet will try 3x).
via_stun() {
        IP=$(stun-ip stun.1und1.de)
        [ $? -eq 0 ] && [ "$IP" ] && return 0
        return 1
}

via_webcm() {
        local queryfile="/usr/www/all/html/query.txt"
        local querystring=""
        if which ctlmgr_ctl >/dev/null; then
                # Firmware ca. 04.76 and newer
                IP=$(ctlmgr_ctl r connection0 pppoe:status/ip)
        else
                if [ "$(sed -n '/var:n\[/p' $queryfile)" ]; then
                        # Firmware ca. 04.84 and newer (should never be used, see above)
                        querystring="var:n[0]=connection0:pppoe:status/ip"
                else
                        # Older firmware
                        querystring="var:cnt=1&var:n0=connection0:pppoe:status/ip"
                fi
                IP="$(/usr/www/html/cgi-bin/webcm "getpage=${queryfile}&${querystring}")"
        fi
        # ctlmgr_ctl return values [box=val]: 7170=176, 7270=177, 7141=172
        # Caveat: must use "-o" instead of "||", otherwise "$?" would be reset
        [ $? -eq 0 -o $? -ge 170 ] && ip_public "$IP" && return 0 || return 1
}

# If multid (or whoever) has already determined the external IP, use it
ip_public "$IPADDR" && echo "$IPADDR" && exit 0

# Set user-defined method (e.g. via web UI) if no argument is given
[ $# -eq 0 ] && method="$MOD_GET_IP_METHOD" || method="$1"

case $method in
        -a|--all|""|-e|--extquery|-o|--ostat)
                # for compatibility reason only, may be removed later
                [ "$method" ] && [ "$method" != "-a" ] && [ "$method" != "--all" ] &&
                        echo "warning: method $method is obsolete, using --all instead" >&2
                # Why this order?
                #   1.) STUN should always work and is fast
                #   2.) route is fast, works in all firmwares, problematic routing configs are rare
                #   3.) dsld is faster than ctlmgr/webcm, but not always available
                #   4.) ctlmgr/webcm is slow, but should work in all firmwares on DSL boxes
                for mode in stun route dsld webcm; do
                        via_$mode
                        [ $? -eq 0 ] && break
                done
                ;;
        -d|--dsld)
                via_dsld
                ;;
        -r|--route)
                via_route
                ;;
        -s|--stun)
                via_stun
                ;;
        -w|--webcm)
                via_webcm
                ;;
        -?|-h|--help)
                helpmsg
                exit 0
                ;;
        *)
                helpmsg >&2
                exit 1
                ;;
esac

[ $? -ne 0 ] && echo "get_ip error" >&2 && exit 1
echo "$IP"
Die speziellen Aufrufsformen, die die Software der Fritz!Box von AVM voraussetzen, würden dann natürlich nicht mehr funktionieren.
Der Aufruf mit dem Parameter -s/--stun sollte aber klappen, bestehende Internetverbindung vorausgesetzt.
Du kannst also das Skript auf den Ziellinuxrechner kopieren, ausführbar machen (chmod +x get_ip) , und einfach mal mit ./get_ip -s oder sh get_ip -s testen.
 
Zuletzt bearbeitet:
Unter Ubuntu hab ich mir folgendes Skript erstellt:

Code:
#!/bin/sh
# eigene öffentliche IP anzeigen

wget http://checkip.dyndns.org/ -q -O - |
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
 
Hi,
vielen Dank für die Infos.
Das mit wget ist mir bereits bekannt.
Ich suche aber andere Möglichkeiten.. sprich ohne wget. Vllt. mit diesem stun ??
 
Moin
Wie schon geschrieben in #2, draufkopieren und ausprobieren.

Hier gebe ich dir auch noch ein Beispiel wie du es dann weiterverwenden kannst:
PHP:
export PUBLIC_IP=$(get_ip -s) # Die öffentliche IP wird als Umgebungsvariable abgespeichert
echo $PUBLIC_IP                   # Ab jetzt benutzen wir die Umgebungsvarianle, die die öffentliche IP vorhält

Falls sich die IP verändern sollte (resync) müsste die Variable natürlich mit export PUBLIC_IP=$(get_ip -s) neu gesetzt werden.
 
debian unterstützt kein "get_ip"
und ich konnte auch leider kein annähernd passendes paket finden.
 
Wie meinst du dass denn jetzt?
Debian unterstützt keine Shellskripte?
Dass seh ich aber anders.
Als .deb Paket gibt es get_ip natürlich nicht.
Ich hab doch ausdrücklich geschrieben: Auf deinen Linuxrechner kopieren und ausführbar machen mit: chmod +x get_ip
 
Wie meinst du dass denn jetzt?
Debian unterstützt keine Shellskripte?
Dass seh ich aber anders.
Als .deb Paket gibt es get_ip natürlich nicht.
Ich hab doch ausdrücklich geschrieben: Auf deinen Linuxrechner kopieren und ausführbar machen mit: chmod +x get_ip

-bash: get_ip: command not found

Was willstn jetzt hören? Ich hab das Script auf die kiste kopiert, ausgeführt und er meckert eben dass er mit dem Befehl "get_ip" nichts anfangen kann, da dies nirgends definiert ist
 
du hast aber nicht viel Ahnung von Linux oder? wenn du get_ip in der Console eingibst, sucht er in den Pfaden aus PATH und der aktuelle ist natürlich nicht drin!
probiere doch mal folgendes:
Code:
sh ./get_ip
vorausgesetzt, dass du auch im richtigen Verzeichniss bist, wo get_ip liegt.
 
Wie hast du es aufgerufen?
(Auch dafür hab ich Beispiele gegeben)
Gehen wir mal davon aus das du im selben Verzeichnis bist, wo get_ip auch liegt, dann kannst du es so aufrufen:

sh get_ip -s
(funktioniert auch wenn du es vorher nicht mit chmod +x get_ip ausführbar gemacht hast)

Hast du es ausführbar gemacht, rufst du es so auf:

./get_ip -s
(Voraussetzung ist dann, dass das SHEBANG stimmt, also ganz oben im Skript: #!/bin/sh zu einem gültigen Interpreter führt)

Desweiteren wäre es keine schlechte Idee get_ip mit vi zu öffnen und folgende Zeile auszukommentieren:

also
[ -r /mod/etc/conf/mod.cfg ] && . /mod/etc/conf/mod.cfg
in
# [ -r /mod/etc/conf/mod.cfg ] && . /mod/etc/conf/mod.cfg
zu ändern.
 
Zuletzt bearbeitet:
Hallo zusammen,

bevor Ihr da weiter unsinnig Eure Zeit verschwendet... Keine der Methoden aus get_ip wird ohne Anpassungen auf einem normalen Linux-Rechner funktionieren, auch die stun-ip basierte. stun-ip ist ein busybox-Applet, welches nur in der busybox-Version von freetz vorhanden ist (s. diesen Patch). Die Idee hinter stun-ip funktioniert an sich aber auch auf einem normalen Linux-Rechner. Ihr braucht einen stun-client, z.B. diesen und dann könnt Ihr sowas aufrufen (gegoogelt, ungetestet von mir):
Code:
stun -v 1 stun.1und1.de 2>&1 | sed -nr 's/^MappedAddress = (.*):.*$/\1/p'

VG,
Gene
 
du hast aber nicht viel Ahnung von Linux oder? wenn du get_ip in der Console eingibst, sucht er in den Pfaden aus PATH und der aktuelle ist natürlich nicht drin!
probiere doch mal folgendes:
Code:
sh ./get_ip
vorausgesetzt, dass du auch im richtigen Verzeichniss bist, wo get_ip liegt.

oh weh oh weh. LPI-0.001?

root@tslinux:/tmp# sh ./get_ip
./get_ip: 78: ./get_ip: stun-ip: not found
sed: can't read /usr/www/all/html/query.txt: No such file or directory
./get_ip: 97: ./get_ip: /usr/www/html/cgi-bin/webcm: not found
get_ip error
root@tslinux:/tmp#

"Mein" Linux möchte gerne get_ip ausführen. Es findet aber dummerweise in seinem "hirnkastel" kein get_ip und sagt mir dann "get_ip? kenn ich nicht"


Hallo zusammen,

bevor Ihr da weiter unsinnig Eure Zeit verschwendet... Keine der Methoden aus get_ip wird ohne Anpassungen auf einem normalen Linux-Rechner funktionieren, auch die stun-ip basierte. stun-ip ist ein busybox-Applet, welches nur in der busybox-Version von freetz vorhanden ist (s. diesen Patch). Die Idee hinter stun-ip funktioniert an sich aber auch auf einem normalen Linux-Rechner. Ihr braucht einen stun-client, z.B. diesen und dann könnt Ihr sowas aufrufen (gegoogelt, ungetestet von mir):
Code:
stun -v 1 stun.1und1.de 2>&1 | sed -nr 's/^MappedAddress = (.*):.*$/\1/p'

VG,
Gene



Vielen Dank, funktioniert!

:)
 
...oder du bastelst dir selber was(PHP-Fähiger Webserver, im Internet erreichbar) : Siehe REMOTE_ADDR
 
...oder du bastelst dir selber was(PHP-Fähiger Webserver, im Internet erreichbar) : Siehe REMOTE_ADDR

ne das möcht ich eben nicht, also KEINE http/wget ähnlichen Varianten.
Ich möchte so wenig wie möglich nach extern Abfragen, wobei sich das nicht ganz vermeiden lässt, außer man hat auf dem Modem/Router eine direkte Port-Abfrage. Aber das ist eben nicht möglich
 
Ich mach hier mal zu. Das hat nichts mit Freetz zu tun und scheint auch erledigt.

Gruß
Oliver
 
Status
Für weitere Antworten geschlossen.
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.