#1 Le 06/06/2013, à 16:36
- fabkzo
Recuperer IP Raspberry Pi en Bash
Bonjour,
Je suis l'heureux possesseur d'un Raspberry Pi depuis peu; je l'utilise avec Raspbian, qui est une Debian adaptée pour cet appareil.
Mon objectif est simple : l'utilisant en nomade j'ai besoin de pouvoir recupérer la ou les adresse(s) ip de la machine ( locale et publique ) afin de pouvoir l'utiliser en ssh ; ne possédant pas de lcd pour le moment je cherche une solution à moindre coùt pour récupérer ces infos d'où l'idée de le faire en bash.
Le problème étant que je n'ai pas forcément les supports nécessaires pour la récupérer ( lecteur de carte sd, périphériques+ecran hdmi , envoi de mails non autorisés. )
Je veux donc pouvoir envoyer ces données sur:
Problème 1 ==> une clé USB si elle est connectée et montée
et
Problème 2 ==> Sur un site distant
sinon dans un fichier log ( dans $HOME par exemple)
Bon...
J'ai commencé à étudier la chose ; je sais que je vais mettre le script dans /etc/network/if-up.d afin qu'il se lance dès qu'un câble réseau est connecté
ensuite je récupère l'état de l'usb, l'ip locale, l'ip publique si connecté à internet et doit lancer les commandes en fonction de cela.
Le top serait que le script se lance aussi des qu'une clé est insérée.
Et c'est là que je me complique ; si quelqu'un d'intéressé pouvait me filer un coup de main ce serait gentil ^^
Voilà ce que j'ai commencé à faire ( $USB n'est pas encore créée il faut que j'étudie udev ) Sachant que j'ai un souci avec l'ordre des évenements à gerer; je ne sais pas si je ne dois utiliser que du "if...elif...", ou du "case" ou créer des fonctions que je vais appeler plutôt que des variables... enfin je m'embrouille...
#!/bin/bash
ip=$( ip addr show eth0 | grep -w inet | awk '{print$2}' | cut -d/ -f1 )
if [ -z "$ip" ]; then
break
fi
usb=$(...)
ip2=$( w3m -dump http://www.monip.org/ | awk -F': ' ' /IP/{print$2}')
sendips()
{
echo -e "adresse IP reseau local: $ip\nadresse ip publique : $ip2 " > /media/recupip/$ip.txt
curl --data-urlencode "file@$ip.txt" http://www.monsite.com/.../...
}
if [ -z "$ip2" ] && [ -n "$usb" ] ; then
echo -e "adresse IP reseau local: $ip" > /media/recupip/$ip.txt
elif [ -z "$ip2" ] && [ -z "$usb" ] ; then
echo -e "adresse IP reseau local: $ip" > $HOME/$ip.txt
else
sendips()
fi
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#2 Le 07/06/2013, à 05:37
- nesthib
Re : Recuperer IP Raspberry Pi en Bash
Pour lancer ton script à l'insertion de la clé, regarde du côté de udev, tu peux lancer des commandes arbitraires et donc écrire sur ta clé ton adresse IP :
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{product}=="…" , RUN+="/usr/bin/touch /tmp/u"
en mettant le modèle de la clé dans ATTRS{product} (facultatif mais permet de cibler précisément ta clé, ou encore mieux utilise ATTRS{serial}).
Quelques simplifications peuvent être faites :
ip addr show eth0 | awk -F '[ /]*' '/inet /{print $3}'
L'ensemble des tests qui suit est un peu brouillon et manque d'indentation pour être clair (les lignes vides ne servent en revanche à rien), mais ça me semble correct
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#3 Le 07/06/2013, à 18:49
- fabkzo
Re : Recuperer IP Raspberry Pi en Bash
Merci pour la simplification , ok pour l'indentation
à propos de udev, crois-tu que je puisse faire en sorte que quelque soit la clé USB - ou support de stockage -utilisé je puisse lancer cela , évitant des réglages pour un support unique qui peut être perdu?
( avant que je ne me tape la doc )
De plus je pensais rajouter une partie au début du script qui check si les outils necessaires sont bien installés ( par ex: curl ) et sinon les installer mais SANS les droits roots compte tenu du fait que je n'ai pas acces à l'interface... ça reste tres optionnel puisque je peux le faire avant , néanmoins j'aimerais savoir comment faire ( avec dpkg? )
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#4 Le 07/06/2013, à 19:46
- nesthib
Re : Recuperer IP Raspberry Pi en Bash
Tu peux faire ta règle udev pour n'importe quel support USB, il suffit de ne pas mettre la contrainte sur l'identifiant de ta clé.
En ce qui concerne l'installation sans droits root des paquets, c'est une mauvaise idée et, à mon avis, une perte de temps. Configure correctement tes outils dès le départ.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 10/06/2013, à 22:41
- fabkzo
Re : Recuperer IP Raspberry Pi en Bash
Voici la dernière mouture de mon petit script:
#!/bin/bash
day=$(date)
usb=$(ls /media/USB)
ip=$(ip addr show eth0 | awk -F '[ /]*' '/inet /{print $3}')
ip2=$(curl ifconfig.me)
sleep 3
if [ -z "$ip" ]; then
exit 0
else
echo -e "$day\nadresse IP reseau local: $ip" > /tmp/$ip.txt
fi
if [ -n "$usb" ] && [ -z "$ip2" ]; then
mv /tmp/$ip.txt /media/USB/$ip.txt
else
echo -e "$day\nadresse IP reseau local: $ip\nadresse ip publique : $ip2 " > /media/USB/$ip.txt
curl --data-urlencode "file@/tmp/$ip.txt" http://www.fabkzo.com/.../...
fi
Notes:
-Udev n'est pas utilisé pour la gestion d'évènements à l'insertion d'une clé USB (lancement de scripts etc... ) compte tenu de ce qui semble être une chute de tension à l'insertion de la clé qui coupe l'interface réseau du pi
-la clé USB est montée automatiquement au lancement grâce aux réglages de /etc/fstab
-Mon curl n'est pas prêt pour l'envoi des données sur le net, du coup le cas où l'accès au net est existant mais la clé USB absente n'est pas résolvable.
Au sujet de Curl plusieurs choix:
- soit poster les données en tant que commentaires sur un site qui m'appartient
- soit un truc style pastebin
- soit ce qui m'interesse le plus : création préalable d'un fichier XML , envoi pour remplacement par curl , lecture directe sur page web sans authentification ou quoi que ce soit ( ==>ajax)
[Et c'est là que par le pouvoir du crâne ancestral j'en appelle à toutes les forces qui pourraient m'aider...]
-soit tout faire mais pfiou...
Je compte rajouter l'envoi d'un mail (pour ceux qui n'auraient fait que ça) mais mon but est de pouvoir lire directement les éléments de mon petit appareil en rentrant une URL à partir d'un smartphone.
Si vous avez des idées d'infos à rajouter -tant qu'à faire- à l'enregistrement des données( resultat traceroute? nslookup? météo? ) je suis preneur !
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#6 Le 15/06/2013, à 07:33
- peyo56
Re : Recuperer IP Raspberry Pi en Bash
Voici la dernière mouture de mon petit script:
#!/bin/bash day=$(date) usb=$(ls /media/USB) ip=$(ip addr show eth0 | awk -F '[ /]*' '/inet /{print $3}') ip2=$(curl ifconfig.me) sleep 3 if [ -z "$ip" ]; then exit 0 else echo -e "$day\nadresse IP reseau local: $ip" > /tmp/$ip.txt fi if [ -n "$usb" ] && [ -z "$ip2" ]; then mv /tmp/$ip.txt /media/USB/$ip.txt else echo -e "$day\nadresse IP reseau local: $ip\nadresse ip publique : $ip2 " > /media/USB/$ip.txt curl --data-urlencode "file@/tmp/$ip.txt" http://www.fabkzo.com/.../... fi
Notes:
-Udev n'est pas utilisé pour la gestion d'évènements à l'insertion d'une clé USB (lancement de scripts etc... ) compte tenu de ce qui semble être une chute de tension à l'insertion de la clé qui coupe l'interface réseau du pi
-la clé USB est montée automatiquement au lancement grâce aux réglages de /etc/fstab
-Mon curl n'est pas prêt pour l'envoi des données sur le net, du coup le cas où l'accès au net est existant mais la clé USB absente n'est pas résolvable.Au sujet de Curl plusieurs choix:
- soit poster les données en tant que commentaires sur un site qui m'appartient
- soit un truc style pastebin
- soit ce qui m'interesse le plus : création préalable d'un fichier XML , envoi pour remplacement par curl , lecture directe sur page web sans authentification ou quoi que ce soit ( ==>ajax)
[Et c'est là que par le pouvoir du crâne ancestral j'en appelle à toutes les forces qui pourraient m'aider...]
-soit tout faire mais pfiou...Je compte rajouter l'envoi d'un mail (pour ceux qui n'auraient fait que ça) mais mon but est de pouvoir lire directement les éléments de mon petit appareil en rentrant une URL à partir d'un smartphone.
Si vous avez des idées d'infos à rajouter -tant qu'à faire- à l'enregistrement des données( resultat traceroute? nslookup? météo? ) je suis preneur !
Personelement, j'avait un script déclenché par cron toutes les heures :
INTERFACE="eth0"
ID="RPI"
IP=$(ifconfig $INTERFACE | sed -n 's/.*inet.*adr:\([0-9.]*\).*/\1/p')
wget -O - "http://monsite.com/private/ip.php?id=$ID&ip=$IP&interface=$INTERFACE"
Ensuite sur le serveur, suffisait de capturer l'ip externe due a la conexion et de reprendre les aguments, j'avait laissé le script en l'état, mais maintenant je l'utilise avec un dyndns.
Installation simple : Windows Vista 1h48 - Ubuntu Maverick 0h27
Instalation complete: Windows Vista ... - Ubuntu Maverick 2h
Comme quoi, Il y en a qui choisissent trop vite mais pas pour le plus rapide ...
Actuelement : Ubuntu 12.04 (Unity)
Hors ligne
#7 Le 15/06/2013, à 09:02
- fabkzo
Re : Recuperer IP Raspberry Pi en Bash
Ok, interessant
j'ai aussi vu un truc comme ça, en python:
http://www.siliciumcorp.com/developpeme … pberry-pi/
Donc ça te permet de toujours pouvoir joindre ton serveur malgré ton IP dynamique, mais toujours chez toi, avec des règles de routage spécifiques ?Quand l'IP change dois-tu la modifier à la main ou cela se fait-il automatiquement?
En tous cas je te remercie du tuyau et vais regarder tout ça de plus près.
Sinon mon cas est particulier dans la mesure où je veux pouvoir accéder au Pi en SSH depuis le réseau auquel je suis connecté avec un autre appareil ( par exemple au fablab) ; l'adresse ip publique peut me servir pour des infos de géolocalisation; mais je ne suis pas dans l'optique de laisser le raspberry branché H24 en mode serveur ==> Je veux qu'il puisse faire remonter des infos sur un autre serveur.
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne