Jump to content

[RESOLU] Script Bash - Adresse IP de mon router ?


Recommended Posts

Salut,

Je cherche comment m'y prendre afin de déterminer l'adresse IP, en mode console (que je vais intégrer dans un script), du côté WAN de mon router depuis mon serveur Linux qui est du côté LAN du router Linksys. Un peu comme DynDNS ou No-IP fait pour mettre à jour votre DNS dynamiquement.

Cela me permattrait de créer une tâche CRON à toutes les heures afin de vérifier si l'adresse IP à changée, puis ensuite mettre à jour dans ma BD MySQL les valeurs nécessaires pour PHPBB ou dans VSFTPD.CONF pour l'adresse IP du PASV.

Où je bloque c'est que je ne sais pas du tout quel outil (commande) utiliser qui va me retourner l'adresse IP du côté WAN du router (et déterminer que c'est vraiment une adresse IP valide sur Internet)... ? Il doit exister une fac¸on de déterminer qu'elle adresse IP est utilisée pour l'encapsulation NAT des données lorsque transmises sur Internet ?

Merci

Link to comment
Share on other sites

ifconfig -a , puis parser le résultat, mais c'est pas simple :/

En plus il faut être root pour lancer cette commande.

Comme il s'agit d'une question concernant spécifiquement la console linux, je transfère ce post dans la section du forum adéquate, où tu auras plus de chances d'obtenir une réponse.

Link to comment
Share on other sites

ifconfig -a , puis parser le résultat, mais c'est pas simple :/
Si c'est juste récup l'ip d'une interface, c'est facile :
ifconfig eth0 | grep "inet adr" | cut -d: -f2 | cut -d' ' -f1

Mais pour l'ip publique tu peux faire un wget sur un site miroir (pas au sens miroir dl, mais miroir ip).

Par exemple :

#! /usr/bin/perl -w

use strict;
use LWP::Simple;

my $page = get("http://mire.ipadsl.net/");
$page =~ m/<span class="ip">([0-9\.]+)<\/span>/;

print $1;

Merde j'avais pas vu la réponse d'angel eyes :non:

Link to comment
Share on other sites

En plus il faut être root pour lancer cette commande.

C'est pas vrai ça 8)

Quand on est root on a /sbin dans le PATH et donc /sbin/ifconfig

Mais il suffit de faire pareil et ça marche très bien (on ne peux juste pas modifier quoi que ce soit)

Sinon pour des scripts qui parsent des pages internet curl est mieux que wget...

Après, bah ça marche tout pareil de ce qu'ils ont dit les autres...

% curl http://www.whatismyip.com | sed -nr -e 's/^.*Your IP Is ([0-9.]+).*$/\1/ p'

% curl http://mire.ipadsl.net | sed -nr -e 's|^.*<span class="ip">([0-9.]+)</span>.*$|\1| p'

que ce soit avec perl, sed ou cut c'est pareil hein, c'est pas le principe qui change... remarque wget/curl c'est aussi pareil... bon bah ça fait juste un exemple de plus quoi :ouioui:

Link to comment
Share on other sites

En plus il faut être root pour lancer cette commande.

C'est pas vrai ça :win:

Quand on est root on a /sbin dans le PATH et donc /sbin/ifconfig

Mais il suffit de faire pareil et ça marche très bien (on ne peux juste pas modifier quoi que ce soit)

Sinon pour des scripts qui parsent des pages internet curl est mieux que wget...

Après, bah ça marche tout pareil de ce qu'ils ont dit les autres...

% curl http://www.whatismyip.com | sed -nr -e 's/^.*Your IP Is ([0-9.]+).*$/\1/ p'

% curl http://mire.ipadsl.net | sed -nr -e 's|^.*<span class="ip">([0-9.]+)</span>.*$|\1| p'

que ce soit avec perl, sed ou cut c'est pareil hein, c'est pas le principe qui change... remarque wget/curl c'est aussi pareil... bon bah ça fait juste un exemple de plus quoi :ouioui:

juste une question d'habitude en fonction des outils 8)

Je préfère wget (dans l'absolu), c'est un tout terrain qui retombe presque toujours sur ses pattes, mais je dois admettre que curl est plus facile parce que le "-O -" de wget, je l'oublie à chaque fois ... vive les manpages :smack:

Link to comment
Share on other sites

Merci beaucoup pour toutes ces merveilleuses réponses !

Angel Eyes, lorsque tu dis que le signe entre " et " n'est pas pas ' -> un simple guillemet... si je le copie dans mon bloc-notes, il me donne vraiment un simple guillemet... alors c'est supposé être quoi comme caractère ?

Merci encore !

------------------------------------------

J'étais justement entrain de me fabriquer un outil du genre avec wget, mais qui lisait la page status.htm de mon router Linksys. Sauf cette manière ne permettait pas de savoir si c'était vraiment une adresse IP valide Internet dans le cas qu'il existerait une seconde passerelle en amont.

En utilisant un site comme www.whatismyip.com ça assure une adresse valide... tant et aussi longtemps que le site existe ou ne change pas le contenu de la pge par contre !!!

Link to comment
Share on other sites

Mon script finale sera:

#!/bin/bash
# Script Bash pour récuperer la valeur de l'adresse IP Internet.
MONWANIP=$(curl -s http://www.whatismyip.com | sed -nr -e 's/^.*Your IP Is ([0-9.]+).*$/\1/ p')
echo "Mon adresse IP est: $MONWANIP"

Bien sur que je remplacerai le echo par une validation si l'adresse est 0.0.0.0 ou NULL et ensuite le résultat sera copié dans ma BDD MySQL dans le champs approprié avec le client en console, puis modification de vsftpd.conf sur la ligne pasv_address=

Je commence à y comprendre qqchose grace à vos conseils !!!

-----------------------------------------------

En passant j'ai trouvé un livre génial pour mieux comprendre les scripts (de Bash à Ruby) c'est "Scripts sous Linux" de Cristophe Blaess. ISBN: 2-212-11405-2. Un beau livre de 761 pages. Très complet et surtout bien fait pour utiliser les scripts de façon "administrative" au-lieu de beaucoup d'autres livres qui accentu le scripting pour le web.

Link to comment
Share on other sites

Merci beaucoup pour toutes ces merveilleuses réponses !

Angel Eyes, lorsque tu dis que le signe entre " et " n'est pas pas ' -> un simple guillemet... si je le copie dans mon bloc-notes, il me donne vraiment un simple guillemet... alors c'est supposé être quoi comme caractère ?

sur clavier belge, le "single quote", c'est "shift + 4"

le caractère, ici, c'est "altgr + ù" ( accent aigu, juste à coté du m )

´ et non ' ... on ne voit pas tjrs la différence en fonction de la font utilisée ...

Link to comment
Share on other sites

sur clavier belge, le "single quote", c'est "shift + 4"

le caractère, ici, c'est "altgr + ù" ( accent aigu, juste à coté du m )

´ et non ' ... on ne voit pas tjrs la différence en fonction de la font utilisée ...

En l'occurence, le caractère utilisé sur la page html c'est un sigle quote, et ce que tu as mis dans ta commande c'est un single quote aussi...

Moi je connais 3 types de quote : single ', souble ", back `

Le "forward quote" je connaissais pas (et d'ailleurs je l'ai jamais vu en programmation et quasiment jamais en vrai :zarb: )

Pour info sur un clavier "français" azerty, il faut faire "altgr + ?" (2 fois, c'est une touche morte, pour l'associer avec des lettres)

De toute façon chez moi ça passe pas dans la console...

Link to comment
Share on other sites

sur clavier belge, le "single quote", c'est "shift + 4"

le caractère, ici, c'est "altgr + ù" ( accent aigu, juste à coté du m )

´ et non ' ... on ne voit pas tjrs la différence en fonction de la font utilisée ...

En l'occurence, le caractère utilisé sur la page html c'est un sigle quote, et ce que tu as mis dans ta commande c'est un single quote aussi...

Moi je connais 3 types de quote : single ', souble ", back `

Le "forward quote" je connaissais pas (et d'ailleurs je l'ai jamais vu en programmation et quasiment jamais en vrai :zarb: )

Pour info sur un clavier "français" azerty, il faut faire "altgr + ?" (2 fois, c'est une touche morte, pour l'associer avec des lettres)

De toute façon chez moi ça passe pas dans la console...

essaye en faisant "space" juste après ...

par contre, c'est bizarre, ici, au boulot, le "single quote" passe sans broncher alors qu'à la maison, il me fout un #### de warning qui m'a obligé à mettre le "forward quote" pour l'éviter ... peut-etre un problème lié à unicode ... il va falloir que je regarde ça ce WE

Link to comment
Share on other sites

Alors là je vous perds :heben: moi je suis avec un clavier Canadien-Français.

Les type de guillemets possibles sont:

" (double-quote = SHIFT + 2 )

' (simple-quote ou apostrophe = SHIFT + , )

` (back-quote = ` (touche pour faire les accents graves + SPACE )

Ž (forward-quote = ALTCar + é + SPACE ) *C'est drôle, mon forward-quote est mal interpété quand la page est rafraichit ici.

Mais dans tous les cas... c'est le simple-quote standard qui est utilisé en programmation quand on utilise une "simple-quote" et non un back ou encore un forward.

Link to comment
Share on other sites

Alors là je vous perds ;) moi je suis avec un clavier Canadien-Français.

Les type de guillemets possibles sont:

" (double-quote = SHIFT + 2 )

' (simple-quote ou apostrophe = SHIFT + , )

`(back-quote = ` (touche pour faire les accents graves + SPACE )

´(forward-quote = ALTCar + é + SPACE )

Mais dans tous les cas... c'est le simple-quote standard qui est utilisé en programmation quand on utilise une "simple-quote" et non un back ou encore un forward.

faux, le ` est utilisé, il peut remplacer un $() en bash ...

KERNEL_VERSION=$(uname -r)

équivaut à

KERNEL_VERSION=`uname -r`

et non à

KERNEL_VERSION='uname -r'

maintenant, le "forward quote" est plus particulier, reste à trouver son sens exact car, comme je l'ai dit plus haut, j'ai un gros warning sur ma bécanne à la maison que je n'ai pas au boulot...

Link to comment
Share on other sites

C'est bien de savoir que le ` est utilisé comme $() car on ne l'a jamais appris dans nos cours à l'école. Si je rencontre qqchose programmé de cette manière je vais mieux comprendre.

Link to comment
Share on other sites

Un peu off-topic, mais voici un fait intéressant pour les programmeurs php :

Si vous avez apache2 et php sur votre machine perso qui a linux, vous pouvez executer des commandes directemetn dans le php avec les ` `

par exemple :

<?php
$ps = `ps fx`;
echo $ps;
?>

:)

Link to comment
Share on other sites

C'est bien de savoir que le ` est utilisé comme $() car on ne l'a jamais appris dans nos cours à l'école. Si je rencontre qqchose programmé de cette manière je vais mieux comprendre.

mhmmm pas exactement.. d'abord, je crois que $() n'est pas reconnu par tous les shell (theo, c'est toi le bosse dans le domaine)

et surtout, images que tu as une syntaxe bizarre :

TOTO=`commande 1 avec `resultats de commande` en arguments`

tu as un ambiguïté avec les ` que tu n'as pas avec les $().

es-ce que `résultats est le début d'un sous-shell, ou bien est-ce la fin du précédent ?

en gros, est-ce :

TOTO=$(commande 1 avec $(résultats de commande) en arguments)

ou

TOTO=$(commande 1 avec) résultats de commande $(en argument)

???

on en parlait au dernier first jeudi.

Comme le dit tuXXX, toujours privilégier les $(), même s'il y a incompatibilité avec certains shell :mad2:

(quoi ? j'ai même pas prononcé le mot solaris... :mdr: )

Link to comment
Share on other sites

Humm plusieurs choses.

Déjà je ne bosse pas spécialement sur les shells (Ouh le noob :zarb:)

Ensuite, comme l'a dit TuXXX, $() caymieux comme l'a dit lorinc parce que ça permet de les imbriquer, que c'est plus lisible et que c'est plus net pour l'interpréteur.

Par contre pour certains OS pourris (ou non) avec de vieux sh, il faut faire des scripts en .sh et se passer de plein de builtin functions. Pas de $() pour le bourne shell donc, il faut passer par ``.

Il faut choisir entre portabilité et efficacité.

Ce dont on parlait avec l'ami orgim au first jeudi (et quelque part près d'une station du RER A avec des bouteilles de vodka orange) c'était la différence entre certains shells comme le ksh qui ferme automatiquement les guillements à la fin d'un sous shell.

Reste à savoir quel shell a raison. Faut il corriger les erreurs de codage silencieusement ou obliger à coder proprement.

Une autre chose : Même en restant sur des OS performant, il est bon d'utiliser sh, qui reste le plus petit dénominateur commun entre les shells.

Au contraire même s'ils sont très semblables, faire des scripts bash only ou zsh only ou pour tcsh, ksh, etc, c'est ne pas être sûr que ça fonctionne sous les autres shells.

Link to comment
Share on other sites

Tout en sachant qu'il faut privilégier les $(commande) plutôt que `commande` (et ce, même si vim vous le met en rouge :transpi: )

effectivement, c'est bien plus lisible :zarb:

par contre, on parle bien ici de BASH, et dès lors, on brise la compatibilité avec d'autres shell. Tous ne supportant pas les expressions du genre

for (( i = 0; i < 10; i++ )); do uname -r && echo ${i}; done

en ce qui concerne l'imbrication des ``, c'est comme tous les autres quotes, ceux à l'intérieur doivent etre mis en escape (avec un \ en l'occurence).

ainsi :

KERNEL_VERSION=`uname \`echo "-r"\``

équivaut à

KERNEL_VERSION=$(uname $(echo "-r"))

si on veut faire des trucs tordus du genre, il y a aussi l'histoire des $$ pour utiliser awk dans un makefile :transpi:

Link to comment
Share on other sites

par contre, on parle bien ici de BASH, et dès lors, on brise la compatibilité avec d'autres shell. Tous ne supportant pas les expressions du genre
for (( i = 0; i < 10; i++ )); do uname -r && echo ${i}; done

Surtout que là c'est simple de passer outre :

 $ for i in $(seq 0 9); do uname -r && echo ${i}; done

Par contre, par exemple, ça ça marche avec zsh... et pour les autres shell non, non :

 $ echo "$((3/2)) != $((3/2.0))"

Et je ne parle pas des trucs genre :

 $ for i in $(seq 10); { echo $i }

C'est plus sympa pour faire des scripts d'une ligne, mais pour la compatibilité c'est zéro :D

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...