OVH Cloud OVH Cloud

recuperer mon ip du jour sur le routeur

10 réponses
Avatar
Geo Cherchetout
Bonjour,
Heureux titulaire d'une connexion permanente par ADSL, mon pc est relié
au réseau mondial par un modem Alcatel SpeedTouchHome transformé en pro
grâce au site forpage.com. De ce fait, je ne connais mon adresse IP du
jour qu'en interrogeant ce modem-routeur par telnet ou par son interface
web. Jusqu'ici c'est facile, même pour moi.
Mais je souhaiterais automatiser cette récupération à l'aide d'un script
qui serait exécuté toutes les heures grâce à cron et qui rajouterait à
la fin d'un fichier date, heure et adresse IP. Or, en shell, je ne vois
pas de commande susceptible d'initier et entretenir le dialogue sous
telnet. (Pour obtenir l'information recherchée il faut d'abord saisir
login et mot de passe.) Je ne vois pas non plus comment introduire des
temporisations dans cet improbable dialogue.
De son côté, minicom ne semble fait que pour les échanges par port série.
Pouvez vous m'orienter vers un procédé permettant d'atteindre le but
recherché avec les outils linux, s'il n'est pas trop ambitieux ?
Merci d'avance.

10 réponses

Avatar
Frédéric BISSON
Bonjour,
Bonjour !


Heureux titulaire d'une connexion permanente par ADSL, mon pc est relié
au réseau mondial par un modem Alcatel SpeedTouchHome transformé en pro
grâce au site forpage.com. De ce fait, je ne connais mon adresse IP du
jour qu'en interrogeant ce modem-routeur par telnet ou par son interface
web. Jusqu'ici c'est facile, même pour moi.
Je suis exactement dans le même cas !

J'ai moi aussi ce modem transformé en Pro :)

Mais je souhaiterais automatiser cette récupération à l'aide d'un script
qui serait exécuté toutes les heures grâce à cron et qui rajouterait à
la fin d'un fichier date, heure et adresse IP. Or, en shell, je ne vois
pas de commande susceptible d'initier et entretenir le dialogue sous
telnet. (Pour obtenir l'information recherchée il faut d'abord saisir
login et mot de passe.) Je ne vois pas non plus comment introduire des
temporisations dans cet improbable dialogue.
Voici ma solution et mon cas :

- j'ai un compte sur http://www.dyndns.org
- j'ai l'utilitaire wget (probablement livré sur les distributions)
- j'ai l'utilitaire ez-ipupdate (liens sur le site de dyndns)
- j'ai écrit un petit script (dont tu trouveras le source à la fin)

Le principe est d'aller récupérer régulièrement l'adresse internet de ma
machine sur www.myip.com par l'intermédiaire de wget (il doit surement y
avoir une autre méthode plus optimale).

Je lance ce script avec 'nohup nice sh loopupdate.bash &' (je suis une
grosse
feignasse et je n'ai pas eu envie de me compliquer la vie avec cron ;-P )

Evidemment, tu n'oublieras pas de configurer les entrées NAT de ton
modem/routeur, sans quoi on ne pourra pas t'atteindre de l'extérieur...
(ni même d'ailleurs le firewall).

Tu pourras également te rendre compte que, de ta propre machine, tu ne
pourras pas appeler ton serveur web par son adresse internet, le
SpeedTouch n'arrive pas à suivre.

Bonne chance !
Frédéric

/////////////////////////////// Script loopupdate.bash
////////////////////////////////////
Remplacer les chaînes ###USER###, ###PASSWORD### et ###SITEWEB###
///////////////////////////////////////////////////////////////////////////////////////////
#!/bin/bash
# -----------------------------------------------
# Define a function to update Internet IP address
# -----------------------------------------------
function dyndnsupdate() {
oldinternetipfile=/tmp/oldinternetip

# -------------------------------------
# Check whether wget has been installed
# -------------------------------------
wgetpath=$(which wget 2> /dev/null)
if [ "$wgetpath" = "" ]
then
echo "Unable to find wget"
return 1
fi

# --------------------------------------------
# Check whether ez-ipupdate has been installed
# --------------------------------------------
ezupdatepath=$(which ez-ipupdate 2> /dev/null)
if [ "$ezupdatepath" = "" ]
then
echo "Unable to find ez-ipupdate"
return 2
fi

# ----------------------------
# Retrieve Internet IP address
# ----------------------------
internetip=$(wget -O - -q www.myip.com | sed 's/[^0-9.]//g')

if [ "$internetip" = "" ]
then
echo "Unable to find Internet IP address"
return 3
fi

# -------------------------------------------------------
# Compare retrieved Internet IP address with previous one
# -------------------------------------------------------
oldinternetip=$(cat $oldinternetipfile 2> /dev/null)

if [ "$oldinternetip" = "$internetip" ]
then
echo "Internet IP address need not be updated"
return 4
fi

# --------------------------------------------
# Update Internet IP address on www.dyndns.org
# --------------------------------------------
ez-ipupdate --user ###USER###:###PASSWORD###
--service-type dyndns
--interface eth0
--host ###SITEWEB###
--address $internetip > /dev/null 2>&1

if [ "$?" -ne "0" ]
then
echo "Error while update Internet IP address"
return 5
fi

# --------------------------------
# Save current Internet IP address
# --------------------------------
echo $internetip > $oldinternetipfile

echo "Internet IP address updated"

return 0
}

# ----------------------------------------------------------
# Check every hour to see if Internet IP address has changed
# ----------------------------------------------------------
while [ 1 -eq 1 ]
do
dyndnsupdate
sleep 1h
done
/////////////////////////////// Script loopupdate.bash
////////////////////////////////////

Avatar
Michel Tatoute

Bonjour,
Heureux titulaire d'une connexion permanente par ADSL[...]
De ce fait, je ne connais mon adresse IP du
jour qu'en interrogeant ce modem-routeur par telnet ou par son interface
web.



a priori tu devrais facilement trouver l'ip de ton routeur avec tracepath
ou traceroute.

Michel.

Avatar
TiChou
Dans l'article news:buc8aj$gk7$,
Geo Cherchetout écrivait :

Bonjour,


Bonsoir,

Heureux titulaire d'une connexion permanente par ADSL, mon pc est
relié au réseau mondial par un modem Alcatel SpeedTouchHome
transformé en pro grâce au site forpage.com. De ce fait, je ne
connais mon adresse IP du jour qu'en interrogeant ce modem-routeur
par telnet ou par son interface web. Jusqu'ici c'est facile, même
pour moi.
Mais je souhaiterais automatiser cette récupération à l'aide d'un
script qui serait exécuté toutes les heures grâce à cron et qui
rajouterait à la fin d'un fichier date, heure et adresse IP. Or, en
shell, je ne vois pas de commande susceptible d'initier et entretenir
le dialogue sous telnet. (Pour obtenir l'information recherchée il
faut d'abord saisir login et mot de passe.) Je ne vois pas non plus
comment introduire des temporisations dans cet improbable dialogue.
De son côté, minicom ne semble fait que pour les échanges par port
série. Pouvez vous m'orienter vers un procédé permettant d'atteindre
le but recherché avec les outils linux, s'il n'est pas trop ambitieux


On peut faire cela avec bash, avec l'outil netcat (indispensable ! ;) ou
avec perl et son module Net::Telnet.

Je vous propose une solution avec bash, simpliste mais qui devrait vous
satisfaire.

$ cat ip.sh
#!/bin/bash

LOGIN=foo
PASSºr

ROUTER.0.0.138
COMMAND=":ip aplist"

{ 3<>/dev/tcp/$ROUTER/23; } &>/dev/null ||
{ echo "Impossible de se connecter !" >&2; exit 1; }

sleep 1

while :
do
read -t 4 -n 1 -u 3 || { echo "Temps dépassé !" >&2; exit 1; }

buf="$buf$REPLY"

case "$buf" in
User : )
echo -e "$LOGINr" >&3
;;
Invalid Password)
echo "Mot de passe invalide !" >&2
exit 1
;;
Password : )
echo -e "$PASSr" >&3
;;
$'=>07')
[ "$COMMAND" ] && { echo -e "$COMMANDr" >&3; unset COMMAND; } ||
{ echo -e ":exitr" >&3; echo "Connexion down !" >&2; exit 1; }
;;
*point-to-point*)
buf=${buf% *point-to-point*}
ip=${buf#*ip-addr:}
echo -e ":exitr" >&3
break
;;
*$'r'|*$'03')
buf ;;
esac
done

date +"%b %e %X `hostname -s` `basename $0`: $ip"

$ ./ip.sh
Jan 18 04:48:59 florizarre ip.sh: 81.56.244.12

On place le cron suivant :

0 * * * * /path/ip.sh >>/var/log/ip.log

Merci d'avance.


De rien.

Mais sachez que nous sommes assez hors sujet étant donné qu'il n'y a rien de
spécifique à Linux dans ce que vous demandez. Il faudra la prochaine fois
faire votre requete sur fr.comp.os.unix.

--
TiChou

Avatar
Frédéric BISSON
Hello, c'est encore moi ! :)

Or, en shell, je ne vois pas de commande susceptible d'initier et
entretenir le dialogue sous telnet.
Après mure réflexion, et après avoir essayé sans succès traceroute,

je me suis rappelé qu'en fait il existe bel et bien une commande
qui ferait ton bonheur : expect.

le script en bas de mail s'occupe de ça :
- il faut remplacer le mot de passe par celui que tu as récupéré
pour passer ton modem en mode Pro
- il assume que ton modem est situé à l'adresse 10.0.0.138
- il est loin d'être parfait. Il ne gère pas le cas où deux
sessions sont ouvertes et il nécessite un script shell
qui s'occupera de récupérer les bonnes valeurs
- expect doit être installé (telnet aussi mais je pense que c'est
déjà fait)

En sortie, il donne quelque chose comme ça :
...
...
...
Destination Source Gateway Intf Mtrc
10.0.0.0/8 10.0.0.0/8 10.0.0.138 eth0 0
81.248.200.86/32 0.0.0.0/0 81.248.200.86 MXS 0
255.255.255.255/32 0.0.0.0/0 10.0.0.138 eth0 0
10.0.0.138/32 0.0.0.0/0 10.0.0.138 eth0 0
127.0.0.1/32 0.0.0.0/0 127.0.0.1 loop 0
10.0.0.0/8 0.0.0.0/0 10.0.0.138 eth0 0
0.0.0.0/0 10.0.0.141/0 81.248.200.86 MXS 0
=>Connection closed by foreign host.

Chez moi, l'interface concernée s'appelle MXS. Il suffit donc de récupérer
les
lignes concernées par un grep, de ne garder que la première ligne et de
récupérer la troisième colonne.

Faudra que je me le fasse :-P

Bonne journée
Frédéric

//////////////////////////// Script ////////////////////////////////
#!/usr/bin/expect
set login "expert"
set password "##########"
set CTRLC 03

spawn telnet 10.0.0.138
expect "User :"
send "$loginr"
expect "Password :"
send "$passwordr"
expect "=>"
send "ip rtlistr"
expect "=>"
send "$CTRLC"
expect "Connection closed by foreign host"
//////////////////////////// Script ////////////////////////////////

Avatar
Geo Cherchetout
Le 18.01.2004 09:12, Frédéric BISSON a écrit fort à propos :

je me suis rappelé qu'en fait il existe bel et bien une commande
qui ferait ton bonheur : expect.


Merci, merci. C'est trop, vraiment. :-)
Je ne connaissais ni wget ni expect qui sont pourtant installés
d'origine avec Mandrake. Il faut bien découvrir les choses un jour.
Avec wget j'obtiens déjà un fichier qui contient l'information
recherchée avec :
wget --http-user= --http-passwd=mot_de_passe http://10.0.0.138/cgi/router/
Reste plus qu'à en extraire l'adresse ip, qui figure à la ligne 17, et à
détruire le fichier.
Par ce moyen, le mot de passe du mode EXPERT n'est pas nécessaire. Celui
du mode normal suffit.
Mais j'espère parvenir seul (en m'inspirant de tes scripts quand-même) à
finir le travail. Je donnerai ma solution ici dans quelques jours.
Ce qui ne m'empêchera pas d'essayer expect, puisque mon but est avant
tout d'apprendre. Je n'ai en effet pas (encore) de site web hébergé sur
mon poste qui n'est en service que quelques heures par jour.
Merci également à Michel, et bon dimanche à tous.

Avatar
Xes
Tu peux utiliser no-ip.com aussi ! Perso je le trouve mieux que dyndns
(affaire de gout).
Sinon si tu peux avoir ton adresse ip par telnet alors tu peux forcément
faire un script pour automatiser l'acces telnet.

Pour cela, il faut utiliser les redirections d'entrées/sorties et les pipes

Bonne chance A+

Bonjour,
Bonjour !


Heureux titulaire d'une connexion permanente par ADSL, mon pc est relié
au réseau mondial par un modem Alcatel SpeedTouchHome transformé en pro
grâce au site forpage.com. De ce fait, je ne connais mon adresse IP du
jour qu'en interrogeant ce modem-routeur par telnet ou par son interface
web. Jusqu'ici c'est facile, même pour moi.
Je suis exactement dans le même cas !

J'ai moi aussi ce modem transformé en Pro :)

Mais je souhaiterais automatiser cette récupération à l'aide d'un script
qui serait exécuté toutes les heures grâce à cron et qui rajouterait à
la fin d'un fichier date, heure et adresse IP. Or, en shell, je ne vois
pas de commande susceptible d'initier et entretenir le dialogue sous
telnet. (Pour obtenir l'information recherchée il faut d'abord saisir
login et mot de passe.) Je ne vois pas non plus comment introduire des
temporisations dans cet improbable dialogue.
Voici ma solution et mon cas :

- j'ai un compte sur http://www.dyndns.org
- j'ai l'utilitaire wget (probablement livré sur les distributions)
- j'ai l'utilitaire ez-ipupdate (liens sur le site de dyndns)
- j'ai écrit un petit script (dont tu trouveras le source à la fin)

Le principe est d'aller récupérer régulièrement l'adresse internet de ma
machine sur www.myip.com par l'intermédiaire de wget (il doit surement y
avoir une autre méthode plus optimale).

Je lance ce script avec 'nohup nice sh loopupdate.bash &' (je suis une
grosse
feignasse et je n'ai pas eu envie de me compliquer la vie avec cron ;-P )

Evidemment, tu n'oublieras pas de configurer les entrées NAT de ton
modem/routeur, sans quoi on ne pourra pas t'atteindre de l'extérieur...
(ni même d'ailleurs le firewall).

Tu pourras également te rendre compte que, de ta propre machine, tu ne
pourras pas appeler ton serveur web par son adresse internet, le
SpeedTouch n'arrive pas à suivre.

Bonne chance !
Frédéric

/////////////////////////////// Script loopupdate.bash
////////////////////////////////////
Remplacer les chaînes ###USER###, ###PASSWORD### et ###SITEWEB###

////////////////////////////////////////////////////////////////////////////

///////////////
#!/bin/bash
# -----------------------------------------------
# Define a function to update Internet IP address
# -----------------------------------------------
function dyndnsupdate() {
oldinternetipfile=/tmp/oldinternetip

# -------------------------------------
# Check whether wget has been installed
# -------------------------------------
wgetpath=$(which wget 2> /dev/null)
if [ "$wgetpath" = "" ]
then
echo "Unable to find wget"
return 1
fi

# --------------------------------------------
# Check whether ez-ipupdate has been installed
# --------------------------------------------
ezupdatepath=$(which ez-ipupdate 2> /dev/null)
if [ "$ezupdatepath" = "" ]
then
echo "Unable to find ez-ipupdate"
return 2
fi

# ----------------------------
# Retrieve Internet IP address
# ----------------------------
internetip=$(wget -O - -q www.myip.com | sed 's/[^0-9.]//g')

if [ "$internetip" = "" ]
then
echo "Unable to find Internet IP address"
return 3
fi

# -------------------------------------------------------
# Compare retrieved Internet IP address with previous one
# -------------------------------------------------------
oldinternetip=$(cat $oldinternetipfile 2> /dev/null)

if [ "$oldinternetip" = "$internetip" ]
then
echo "Internet IP address need not be updated"
return 4
fi

# --------------------------------------------
# Update Internet IP address on www.dyndns.org
# --------------------------------------------
ez-ipupdate --user ###USER###:###PASSWORD###
--service-type dyndns
--interface eth0
--host ###SITEWEB###
--address $internetip > /dev/null 2>&1

if [ "$?" -ne "0" ]
then
echo "Error while update Internet IP address"
return 5
fi

# --------------------------------
# Save current Internet IP address
# --------------------------------
echo $internetip > $oldinternetipfile

echo "Internet IP address updated"

return 0
}

# ----------------------------------------------------------
# Check every hour to see if Internet IP address has changed
# ----------------------------------------------------------
while [ 1 -eq 1 ]
do
dyndnsupdate
sleep 1h
done
/////////////////////////////// Script loopupdate.bash
////////////////////////////////////



Avatar
TiChou
Dans l'article news:buc8aj$gk7$,
Geo Cherchetout écrivait :

Bonjour,


Bonsoir,

Heureux titulaire d'une connexion permanente par ADSL, mon pc est
relié au réseau mondial par un modem Alcatel SpeedTouchHome
transformé en pro grâce au site forpage.com. De ce fait, je ne
connais mon adresse IP du jour qu'en interrogeant ce modem-routeur
par telnet ou par son interface web. Jusqu'ici c'est facile, même
pour moi.
Mais je souhaiterais automatiser cette récupération à l'aide d'un
script qui serait exécuté toutes les heures grâce à cron et qui
rajouterait à la fin d'un fichier date, heure et adresse IP. Or, en
shell, je ne vois pas de commande susceptible d'initier et entretenir
le dialogue sous telnet. (Pour obtenir l'information recherchée il
faut d'abord saisir login et mot de passe.) Je ne vois pas non plus
comment introduire des temporisations dans cet improbable dialogue.
De son côté, minicom ne semble fait que pour les échanges par port
série. Pouvez vous m'orienter vers un procédé permettant d'atteindre
le but recherché avec les outils linux, s'il n'est pas trop ambitieux


On peut faire cela avec bash, avec l'outil netcat (indispensable ! ;) ou
avec perl et son module Net::Telnet.

Je vous propose une solution avec bash, simpliste mais qui devrait vous
satisfaire.

$ cat ip.sh
#!/bin/bash

LOGIN=foo
PASSºr

ROUTER.0.0.138
COMMAND=":ip aplist"

{ 3<>/dev/tcp/$ROUTER/23; } &>/dev/null ||
{ echo "Impossible de se connecter !" >&2; exit 1; }

sleep 1

while :
do
read -t 4 -n 1 -u 3 || { echo "Temps dépassé !" >&2; exit 1; }

buf="$buf$REPLY"

case "$buf" in
User : )
echo -e "$LOGINr" >&3
;;
Invalid Password)
echo "Mot de passe invalide !" >&2
exit 1
;;
Password : )
echo -e "$PASSr" >&3
;;
$'=>07')
[ "$COMMAND" ] && { echo -e "$COMMANDr" >&3; unset COMMAND; } ||
{ echo -e ":exitr" >&3; echo "Connexion down !" >&2; exit 1; }
;;
*point-to-point*)
buf=${buf% *point-to-point*}
ip=${buf#*ip-addr:}
echo -e ":exitr" >&3
break
;;
*$'r'|*$'03')
buf ;;
esac
done

date +"%b %e %X `hostname -s` `basename $0`: $ip"

$ ./ip.sh
Jan 18 04:48:59 florizarre ip.sh: 81.56.244.12

On place le cron suivant :

0 * * * * /path/ip.sh >>/var/log/ip.log

Merci d'avance.


De rien.

Mais sachez que nous sommes assez hors sujet étant donné qu'il n'y a rien de
spécifique à Linux dans ce que vous demandez. Il faudra la prochaine fois
faire votre requete sur fr.comp.os.unix.

PS: Désolé si mon post est posté avec retard, petit soucis avec mon serveur
de news habituel.

--
TiChou

Avatar
Geo Cherchetout
Le 18.01.2004 13:34, TiChou a écrit fort à propos :

On peut faire cela avec bash, avec l'outil netcat (indispensable ! ;)
ou avec perl et son module Net::Telnet.


J'ajoute tout ça dans mon panier. La cueillette a été bonne. :-)

Je vous propose une solution avec bash, simpliste mais qui devrait
vous satisfaire.


Simpliste ? Je trouve ce script si savant qu'il me faudra *au moins* une
journée pour le comprendre. Faut il préciser que je débute ?

Il faudra la prochaine fois faire votre requete sur fr.comp.os.unix.


Merci donc doublement d'avoir répondu quand-même aussi complètement. Je
tiendrai compte de la recommandation.

PS: Désolé si mon post est posté avec retard, petit soucis avec mon
serveur de news habituel.


Comme tu as été indulgent avec moi, je ferme les yeux pour cette fois.
;-)) D'ailleurs je les fermais aussi à 4h54...

Avatar
TiChou
Dans l'article news:buf31n$2b1$,
Geo Cherchetout écrivait :

Je vous propose une solution avec bash, simpliste mais qui devrait
vous satisfaire.


Simpliste ? Je trouve ce script si savant qu'il me faudra *au moins*
une journée pour le comprendre. Faut il préciser que je débute ?


Me suis mal exprimé. :) Quand je parlais de simplicité, je voulais parler de
ce que faisait le script et de ce qui ne faisait pas surtout, c'est-à-dire
de tenir compte de tout ce qui était renvoyé par une session telnet.

--
TiChou


Avatar
Erwann ABALEA
Bonsoir,

On Sun, 18 Jan 2004, Geo Cherchetout wrote:

[...]
Simpliste ? Je trouve ce script si savant qu'il me faudra *au moins* une
journée pour le comprendre. Faut il préciser que je débute ?


En Linux seulement. Je sais que vous aidez également votre lot de
débutants[*] sur d'autres newsgroup plus ... 'bas-niveau'... ;)

[*] débutants là-bas dont je fais partie.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Je profite de cet AAD pour faire un hors-sujet car je ne sais oû poser
la question. Je cherche un Web qui explique le mode de transcription
qui permet de transcrire la plupart des alphabets en alphabet latin.
-+- PG in <http://neuneu.mine.nu> : transcrire la charte en neuneu -+-