wget saját külső IP cím kinyerése és alternatívák?

Van egy egyszerű kis scriptem a saját külső IP címem kinyerésére:


#! /bin/bash
wget http://checkip.org -q -O - | grep "IP\ Address" |awk -F "[ \t<>]" '{print $8}'

Most már másodjára szaladok bele abba, hogy egy-egy helyen nem működik - olyan is van ahol hónapokig működött, aztán nem?
Ha csak simán a "wget http://www.checkip.org" parancsot lefuttatom ezt kapom:

--2011-11-22 00:29:55-- http://www.checkip.org/
Resolving www.checkip.org... failed: Name or service not known.
wget: unable to resolve host address "www.checkip.org"

Ha pingelem, akkor semmi gond ...
Érti ezt valaki?
Én nem :(

Hozzászólások

Azt írja, hogy: "Name or service not known", illetve "unable to resolve host address "www.checkip.org"". Ahogy olvasható, névfeloldási probléma, tehát a DNS környékén nézz körül.

Milyen DNS szervereket használsz? Szolgáltatói vagy saját? Mindegyikről kapsz választ? Ha szolgáltatói, akkor az még mindig a hivatalosan ajánlott, és nem változott az IP-je? Nincs rövid TTL-es mágia valamelyiken? (A checkip.org és a www.checkip.org A-rekordjánal TTL-je 60.)

És mi lenne ha összedobnál magadnak egy minimal php-t ami kidobja, hogy melyik IP-ről hívták meg?
Mint pl.: http://prociweb.hu/ip


<?php
//Gets the IP address
$ip = getenv("REMOTE_ADDR") ;
#echo "IP: " . $ip;
echo $ip;
?>

Sokkal egyszerűbb:)

"Sokkal egyszerűbb"
Ehhez ugye kellene egy olyan külső PHP-s webtárhely, amit IP alapján is meg lehetne szólítani, mert úgy biztosan nem jönne elő az "unable to resolve host address" hiba. Szerintem egyéb okok miatt is jobban jár, ha a névfeloldás anomáliájának jár utána.

wget -q checkip.dyndns.org -O - | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"

wget -O - http://dns.cvk.hu 2> /dev/null | head -n 1
________________
Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz, 4 Gb ram, x86_64 3.0.6-gentoo

"Érti ezt valaki?"
Én igen. Szerintem 1000%, hogy elrontottad a serialt, ezért nem minden dns szerver cachelte be, így attól függően, hogy honnan kéred, megy vagy nem. (Ha a legutóbbi módosítást megelőzően be volt cachelve, akkor nem megy, ha nem volt még lekérve, akkor igen).
Ellenőrzés, hogy tényleg így van-e:
host -t SOA checkip.org.
host -t ANY www.checkip.org.
Ezt több helyről, egy olyanról, ahol jó, meg egy olyanról, ahol nem. A két kimenetnek egyezni kéne, de nem fog.

"Szerintem 1000%, hogy elrontottad a serialt"
Meglepne, ha a checkip.org illetve a www.checkip.org módosítását véghez tudná vinni. Akkor minden bizonnyal nem itt merülne fel ez:

 
  Registrant Name: No-IP.com, Domain Operations
  Registrant Organization: Vitalwerks Internet Solutions, LLC


  Admin Name: No-IP.com, Domain Operations


  Tech Name: No-IP.com, Domain Operations
  Tech Organization: Vitalwerks Internet Solutions, LLC

Talán a no-ip.com képviselője nem ebben a fórumban tenné fel a kérdést.

"elrontottad a serialt, ezért nem minden dns szerver cachelte be"
Ez így ebben a formában...

Hehe, ezt jól benéztem, azt hittem, a checkip.org annak a domainnek a neve, amit csekkelni akar :-D Eszembe sem jutott, hogy létezhet...
Ettől függetlenül a dns hibát továbbra is fenntartom, biztos, hogy nem egyenletesen lett terítve a zóna, azért ez eléggé beszédes:
Resolving www.checkip.org... failed: Name or service not known.

Háááát ... úgy tűnik a DNS kiszolgálók is gyenge pontom (érdekes az utóbbi időkig ilyen gondom nem volt, pedig lassan 10 éve raktam össze és üzemeltetek néhány Linuxot és windowst). Ha valamit tudok pingelni név szerint azt eddig tudtam használni is (wget, ssh stb.), itt valami változott amiről én lemaradtam :(
Ahol most éppen nem működik a néveloldás még host parancs sincs :( Most néztem meg, a /usr/bin/host parancsot a bind9-host csomag tartalmazza a Debian világában (lehet hogy ez hiányzik?).

"Szerintem 1000%, hogy elrontottad a serialt ..."
Mi ez a serial? - amit elrontottam. Ilyet még sosem kellett beállítanom.

* Én egy indián vagyok. Minden indián hazudik.

Tipikusan akkor fordul elő, hogy az egyik helyen jól oldódik fel, máshol meg nem, ha elfelejtik növelni. A SOA rekord része, ezt csekkolja a bind, hogy eldöntse, változott-e. Pl.:
http://www.zytrax.com/books/dns/ch8/soa.html
Itt elmagyarázzák és össze is gyűjtötték a vonatkozó rfc-ket.

Érdekes! Megnyugtató hogy másnál is jelentkezik ez a képtelenség. Külön köszönöm fisher -nek hogy még emlékszik, I'm Debian!
Viszont, ez a konfigurációs fájl nem is tudom mire/kinek vonatkozik? Egy olyan gépen ahol a wget feloldással nincs gondom, ez így néz ki:


# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis 

Mit lehet kell ezen beállítani - mi használja ezt? Ki az a "Name Service Switch" - nincs nss nevű futó démon.

* Én egy indián vagyok. Minden indián hazudik.

hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4

legalábbis a e szerint

szerk.: ami azt illeti en is belefutottam ebbe, és én így oldottam meg.:))

hosts:          files wins dns

a wins a window$ok miatt kellet ugyi.
és azóta is így megy:)

szerk1: "Viszont, ez a konfigurációs fájl nem is tudom mire/kinek vonatkozik?"
bárkire/bármire aki - többek közt - a névfeloldást akarja használni:)) lást itt

Egy biztos, pusztán a wins bejegyzésétől nem javult meg :(
A szóban forgó eszköz, egy GSM router segítségével kapcsolódik a WEB -re, és a város szélén, egy oszlop tetején csücsül. A jelenlegi beállításokkal simán kapcsolódik a segéd szerverhez és reverse tunnelen keresztül lehet elérni a http és az ssh szolgáltatást!
Az asztalomon, szintén GSM routeren keresztül ketyeg a prototípusa és k9sz9ni szépen, minden rendben!?
Már csak azt tudom elképzelni, hogy a router beállításával nem stimmel valami :(

* Én egy indián vagyok. Minden indián hazudik.

Én ezt úgy oldottam meg, hogy lekérdezek több whatismyip jellegű weboldalt, kivadászom belőlük az IP-címeket, s többségi döntéssel elhiszem, hogy az a külső IP, amit sokan mondanak. Ja, és mivel egyes oldalak utálják a scripteket, így azt hazudom a wgettel, hogy én egy Firefox vagyok, így aztán odaadják nekem az oldalt. :)

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

A releváns rész:

ipurl=('http://whatismyipaddress.com/' 'http://www.ip-adress.com/' 'http://www.whatsmyip.org/' 'http://www.whatismyip.org/' 'http://www.cmyip.com/' 'http://my-i-p.com/')
user_agent='Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0'
iface='p10p1'
releasefile='/etc/system-release'
name="${0##*/}"

wanaddr() {
    IPADDR=''
    cnt=2
    while [ -z "$IPADDR" -a $cnt -gt 0 ]; do
        for ((j=0; j<3; j++)); do
            for i in 0 3; do
                IP_ADDR[j]=''
                url="${ipurl[j+i]}"
                [ ! -z "$url" ] && IP_ADDR[j]="`wget -l1 -U "$user_agent" -O - "$url" 2>/dev/null | grep -Eo '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | head -n1`"
                [ ! -z "${IP_ADDR[j]}" ] && break
            done
        done
        if [ x"${IP_ADDR[0]}" = x"${IP_ADDR[1]}" -o x"${IP_ADDR[0]}" = x"${IP_ADDR[2]}" ]; then
            IPADDR="${IP_ADDR[0]}"
        elif [ x"${IP_ADDR[1]}" = x"${IP_ADDR[2]}" ]; then
            IPADDR="${IP_ADDR[1]}"
        fi
        ((cnt--))
    done
}

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Ó, hogy dögöljenek meg! :) Különben kösz, hogy szóltál, kiveszem a címek közül.

Megnéztem, a HTML file-ba generálnak egy random értéket, ugyanakkor a CSS-ben azt mondják, ez ne jelenjen meg, s a valóságot egy javascript állítja elő. Így aztán marhaságot ad vissza ez a sor, már ha a cím a http://www.whatsmyip.org. Keresek egy másik címet ehelyett.

Egyébként a többségi döntés kiszűrte ezt a hibát. :)

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Sokat javítottam rajta. Az összes címről begyűjti az IP-címeket, s amelyikre a legtöbb szavazat érkezik, az nyer. Ezzel a rafinált weblapok mennek a levesbe. :)

ipurl=( 'http://whatismyipaddress.com/' 'http://www.ip-adress.com/' 'http://ip.ezit.hu/ip.php' \
        'http://www.whatismyip.org/' 'http://www.cmyip.com/' 'http://my-i-p.com/' \
        'http://ifconfig.me/ip' 'http://freedns.afraid.org/dynamic/check.php' 'http://checkip.dyndns.org/' )

user_agent='Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0'
iface='p10p1'
releasefile='/etc/system-release'
name="${0##*/}"

wanaddr() {
    max=0
    maxindex=0
    IP[0]=0
    for ((i=0; i<${#ipurl[@]}; i++)); do
        url="${ipurl[i]}"
        ip="`wget -l1 -U "$user_agent" -O - "$url" 2>/dev/null | grep -Eo '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | head -n1`"
        [ -z "$ip" ] && continue
        ready=0
        j=0
        while [ ${IP[j]} -ne 0 ]; do
            if [ x"${IP[j+1]}" = x"$ip" ]; then
                ((IP[j]++))
                if [ ${IP[j]} -gt $max ]; then
                    max=${IP[j]}
                    maxindex=$j
                fi
                ready=1
                break
            fi
            ((j+=2))
        done
        if [ $ready -ne 1 ]; then
            if [ 1 -gt $max ]; then
                max=1
                maxindex=$j
            fi
            IP[j++]=1
            IP[j++]="$ip"
            IP[j]=0
        fi
    done
    IPADDR="${IP[maxindex+1]}"
}

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

$ links -dump miazipm.hu | grep -m1 -Po "(\d+[\.\W])+"
78.24.191.244

No. Hát nálam megoldódott!
A szokásos én vagyok a buta. Az /etc/resolv.conf -ban a következő bejegyzések voltak:

nameserver "egy általam használt, kevéssé ismert szerver első címe"
nameserver "egy általam használt, kevéssé ismert szerver második címe"
nameserver 172.16.3.254

A harmadik volt a GSM router mint gateway - kitöröltem a többit és voila kitört a béke!
(én úgy tudtam hogy hármat vesz figyelembe a rendszer, úgy tűnik mire az igazihopz ért addigra kifáradt)

* Én egy indián vagyok. Minden indián hazudik.

Nem épp a téma, de miben különbözik a curl és a wget? Futólag nem sok. Akkor miért is ajánlod ezt? A wget szinte minden disztribúció alap készletében benne van, a curl viszont nem.

Még egy cím kinyerőke:

wget http://freedns.afraid.org/dynamic/check.php -O - 2>/dev/null | grep Detected | awk '{print $4}'

* Én egy indián vagyok. Minden indián hazudik.

"ki is lehet hagyni"
Félreérted. Nem a funkció kihagyásáról volt szó, hanem arról, hogy az awk alapból pattern-action szintaktikával bír.
man awk:
An AWK program consists of a sequence of pattern-action statements and optional function definitions.
  pattern { action statements }

Azaz teljesen felesleges a mintaillesztéshez külön processt indítani. Hát nem egyszerűbb így?

awk '/Detected/ {print $4}'

"Szerintem így megbízhatóbb"
Megbízhatóságban nem marad el a grep+awk páros mögött.

Megint tanultam valamit :D
Kipróbáltam, működik - a Debian a gawk -ot használja az awk helyett (ezt már néhányszor megsz'vtam) de ezt még ez is tudja!

wget http://freedns.afraid.org/dynamic/check.php -O - 2>/dev/null | awk '/Detected/ [print $4]'

Így az első verziómhoz képest, sokkal takarékosabb megoldást találtunk (a freedns check.php -je sokkal kisebb és a grep -et is ki lehet ejteni).

* Én egy indián vagyok. Minden indián hazudik.

"a Debian a gawk -ot használja az awk helyett (ezt már néhányszor megsz'vtam) de ezt még ez is tudja!"

Kíváncsivá tettél. _Elméletileg_ a gawk hibája legfeljebb az lehet, hogy (sokkal és egyre) többet tud, mint a "hagyományos", amely többet tudásáról egyébként a POSIXLY_CORRECT környezeti változó létezése, vagy a --posix paraméter szoktatja le.



wget -q http://checkip.dyndns.org -O- | awk 'BEGIN { FS="<" } { split($7,a," ") } END { print a[4] }'


curl ifconfig.me


dig @208.67.222.222 myip.opendns.com


dig +short myip.opendns.com @resolver1.opendns.com
ip_regex="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

Megüt a guta!
Március 1 -től valamit beletúrt a freedns a honlapjába, így nem tudom lekérdezni a saját IP címemet: http://freedns.afraid.org/dynamic/check.php
Tudtok valami komolyabb megoldást a saját, külső IP címünk megismerésére?

* Én egy indián vagyok. Minden indián hazudik.

OK Ezeket értem, de pont arra gondoltam hogy hátha van valami ami nem a wget és hasonlókon alapul. Próbáltam a ping -R és a traceoute opciókat, ezek szépen működnek a UPC hálózatán a kábeles routerekkel, viszont, nem működnek a GSM routerekkel, amivel most küzdök.

* Én egy indián vagyok. Minden indián hazudik.

Mert vagy működik, vagy nem, vagy elérhető, vagy nem, vagy megváltoztatják, vagy nem. Ezért csináltam azt, hogy több helyről gyűjtöm be a címet, aztán amilyen címre a legtöbb szavazat érkezuk, azt elhiszem.

Vannak olyan oldalak, amelyek képként generálják le az IP-címet, s adják a böngészőnek, a HTML forrásba pedig fals címet adnak hidden CSS attribútummal, ezzel elérve, hogy ne lehessen script-ből egyszerűen kiszedni, ami kell. Ezért célszerű a bonyolultabb eljárás.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Lehetőségem van, több UPC hálózatán, dinamikus IP című helyre felrakni egy kis gci scriptet, ami visszaadja az IP címemet (magamat csak nem próbálom meg átvágni), ezeket csak én módosítom, kezelem.
Most is az volt a megoldás, hogy a GSM hálózati eszközeim, időnként, ssh -n bejelentkeznek - frissítik az állapot adatukat, pl. az aktuális IP címüket. Így az /var/log/auth.log -ban megjelennek a kérdéses IP címek.
Kár hogy ezt az információt csak a root tudja kinyerni, az ssh szerverből ezt nem tudom kikérni, vagy mégis?

* Én egy indián vagyok. Minden indián hazudik.

A szerverbol nem, de userkent igen.


[hron@tom ~] $ echo $SSH_
$SSH_AUTH_SOCK   $SSH_CLIENT      $SSH_CONNECTION  $SSH_TTY
[hron@tom ~] $ echo $SSH_CLIENT 
80.99.178.192 60750 22
[hron@tom ~] $ echo $SSH_CONNECTION 
80.99.178.192 60750 94.199.180.213 22
[hron@tom ~] $ 

Erre scriptet irni, kb. ket perc?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Nagyon érdekes!
Az "állomás1" -ről belépek:
$ ssh eszköz12.dinamikus.net
A távoli eszközről:
$ ssh állomás2.dinamikus.net
Mikor beléptem kiadom a
$ echo $SSH_CLIENT
84.224.x.y 49509 22
"Visszalépek" az eszközbe, és kiadom a következő parancsot:
$ ssh állomás2.dinamikus.net "echo $SSH_CLIENT"
172.16.3.254 1123 10022
Ami az eszköz GSM router címe és portjai!?
Biztos vagyok benne hogy az állomás2 hajtotta végre az "$ echo $SSH_CLIENT" parancsot, mégis más eredményt dob?
Így már jó lesz :)
Az eszközről:
$ ssh állomás2.dinamikus.net 'echo $SSH_CLIENT'
(vagyis az előző esetben az eszköz shell -je behelyettesítette a lokális $SSH_CLIENT változót, de a második esetben az aposztrof miatt nem :)
Ez a nyerő!? Azért így is mindkettő állomást érdemes használni, hátha valamelyik épp nem üzemel!
SZERK:
Ez megint közvetett!
Vagyis nem lehet közvetlenül az IP címet a külső "interfészről" kinyerni :(

* Én egy indián vagyok. Minden indián hazudik.

Nem, nem lehet, mert #define kulso interfesz.

Egy gep mindig azt tudja ip cimenek, ami direktben a sajat ip cime. Miert kellene tudnia arrol, hogy o pl. egy router mogott acsorog? Semmi koze hozza.

Persze, meg lehet oldani, le kell kerdezni a legkulso eszkozt, hogy kekszcsokolom, mi az aktualis IP cim? Es akkor kapsz egy tobbe-kevesbe relevans valaszt. Mivel azonban ez nem mindig jarhato ut, ezert erdemes elmenni egy kulso oldalhoz, es megerdeklodni tole kedvesen, hogy szerinte mi az IP cimem. Ekkor mar tuti relevans valaszt kapok, mert o azt a cimet fogja mondani, ami hozza kapcsolodott, es ez lehet router, GSM modem, soros porti adapter, barmi, annak a cimet fogja visszaadni.

Tehat az egzakt valasz biztos, hogy a kozvetett valasz.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Vigasztalan vagyok :(
Az érvelésedet azonban el kell fogadnom, ilyen a TCP/IP.
Pl. ott van a traceroute a külső IP cím nem jelenik meg mint hopp csak a router belső címe. A ping -R opciójával, viszont ott van a UPC/kábel modem. A GSM routeren át viszont semmi, megkukul.
Ha a gépészetben így készülnének a fogaskerekek, még mindíg csak a dörzs áttételt tudnák megvalósítani - RFC de jó :P

* Én egy indián vagyok. Minden indián hazudik.

Azert, mert a traceroute-nal belulrol nezel kifele, es befele mindig mas latszik. Ha egy fogaskereket belulrol neznel kifele, nem ertened, miert vannak ilyen erdekes kituremkedesek, ahelyett, hogy egyenes lenne az egesz. Ott is kivulrol munkalod meg a fogaskereket, hogy szep fogai legyenek (es ne kelljen fogorvoshoz jarnia :D)
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Mint minden hasonlat, ez is sántít, ha a fogaskerék kinézne, szép sima felületet érezne/látna - pont az a lényeg (mostanra) hogy a fogaskerék egyenletesen és folyamatosan halad - ne valami középkori vízemelő áttételre gondolj.
Ja, hogy az informatika ma éli a középkort - és én még azt képzeltem ez a felvilágosodás.

* Én egy indián vagyok. Minden indián hazudik.