Linux : Programmer [Résolu/Fermé]

Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
-
Bonjour !

J'ai un petit projet personnel à réaliser, mais je n'ai aucune idée en quel language le faire, ou bien comment le réaliser sous Linux ! En Bash ? Mais comment alors ? Je vous explique mon projet, ensuite j'espère que quelqu'un pourra soit m'orienter, soit m'aider.

Le programme doit s'éxécuter automatiquement en tâche de fond au démarrage de l'ordinateur. Ensuite, il récupère l'IP de l'ordinateur (exemple : 109.129.249.50), qu'il compare à la dernière IP enregistrée. Si les IP sont égales, le programme s'arrête une minute, et revérifie l'IP. Si les IP sont différentes, il enregistre la nouvelle IP (dans un fichier ou n'importe quoi qui retient), et récupère la source d'une page web, dont l'URL ressemble à :

http://updateIP.domaine.com/index.php?motDePasse=monpass&nouvelleIP=[ici la nouvelle IP]

Ce que je souhaite faire est un peu le principe de DynDNS : Chaque minute, vérifier, et si les IP diffèrent, alors mettre à jour dans le site web (par conséquent ne me dites pas d'utiliser inadyn, je souhaite créer mon propre programme).

Quelqu'un a-t-il une idée de comment réaliser ce projet ?
Merci !

Linux Ubuntu 10.04 LTS
Afficher la suite 

7 réponses

Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277
0
Merci
Salut,

Une idée parmi d'autres à exploiter :

Le programme doit s'éxécuter automatiquement en tâche de fond au démarrage de l'ordinateur. 

#Paramétrer ta crontab :
*/1 * * * * /chemin/vers/ton_script.sh >>/dev/null

#! /bin/bash

#Ensuite, il récupère l'IP de l'ordinateur (exemple : 109.129.249.50)
IP_OLD=$(cat /chemin/vers/fichier/contenant/IP_ACTUELLE.txt)
IP=$(wget -qO- whatismyip.org)


#qu'il compare à la dernière IP enregistrée. 

if [ "${IP}" = "{IP_OLD}" ]
then

#Si les IP sont égales, le programme s'arrête une minute, et revérifie l'IP. 

exit

#Si les IP sont différentes, il enregistre la nouvelle IP (dans un fichier ou n'importe quoi qui retient), 

else

echo "${IP}" > /chemin/vers/fichier/contenant/IP_ACTUELLE.txt

#et récupère la source d'une page web, dont l'URL ressemble à :

# Ne sachant pas ce que tu veux faire exactement là, je laisse tel quel, 
## mais peut être auras-tu besoin de wget ou curl...

http://updateIP.domaine.com/index.php?motDePasse=monpass&nouvelleIP=${IP}

fi 
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
Merci pour ton code.
Connaissant déjà d'autres languages de programmation, je comprends ce code (enfin une bonne partie), mais je bloque sur trois choses :

*/1 * * * * /chemin/vers/ton_script.sh >>/dev/null
Cela veut dire quoi ? Il fait partie du script ?

Le programme s'arrête une minute, puis revérifie. Et là, je ne vois nulle part une minute, mais "exit". Cela fonctionnera quand-même chaque minute ?

(Question bête) Le script je l'éxécute où ? Je l'utilise comment ?

Merci !
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
Re-

*/1 * * * * /chemin/vers/ton_script.sh >>/dev/null
Cela veut dire quoi ? Il fait partie du script ?

Ça tu le mets dans ta crontab (voir crontab et Automatiser des tâches avec init et cron) en changeant juste le chemin vers ton script...


Le programme s'arrête une minute, puis revérifie. Et là, je ne vois nulle part une minute, mais "exit".
C'est la crontab qui s'en charge. Elle lancera le programme toutes les minutes (*/1)

Cela fonctionnera quand-même chaque minute ?
Oui.

(Question bête) Le script je l'éxécute où ? Je l'utilise comment ?
Voir cron au-dessus ;-))
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
Ok ;)
Mais comment savoir si tout se passe bien ? Parce que cela ne fonctionne pas...

J'ai modifié la crontab (crontab -e ; puis rajouté : */1 * * * * /opt/ipupdate.sh >>/dev/null); Je précise que le script et le fichier contenant l'IP se trouvent dans /opt ;

Voici le code, au cas où je me serais planté en le modifiant...
Merci.

#! /bin/bash

#Ensuite, il récupère l'IP de l'ordinateur (exemple : 109.129.249.50)
IP_OLD=$(cat /opt/ip.txt)
IP=$(wget -qO- whatismyip.org)


#qu'il compare à la dernière IP enregistrée. 

if [ "${IP}" = "{IP_OLD}" ]
then

#Si les IP sont égales, le programme s'arrête une minute, et revérifie l'IP. 

exit

#Si les IP sont différentes, il enregistre la nouvelle IP (dans un fichier ou n'importe quoi qui retient), 

else

echo "${IP}" > /opt/ip.txt

#et récupère la source d'une page web, dont l'URL ressemble à :

#http://updateIP.domaine.com/index.php?motDePasse=monpass&nouvelleIP=${IP}
wget -qO - http://server.bilow.be/update?password=haha&newip=${IP}
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
On ne planifie pas une tâche sans au-préalable avoir testé le script sensé être exécuté par ladite tâche ;-\

De plus il manque le "fi" final du "if ... then ... else ... fi

Ensuite, il te faut placer des testeurs tout le long de ton script (echo "blabla" >> fich.log) à chaque commande exécutée en cas de réussite ou d'erreur (c'est selon).

Le fichier contenant l'adresse IP de référence ne doit contenir que cette information, sans espace en début et/ou en fin de ligne et surtout aucun retour à la ligne.
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
Oups y'a une erreur dans le code il manque le "$" à la variable "IP_OLD" pour quelle soit interprétée dans le test :

if [ "${IP}" = "${IP_OLD}" ]

Désolé ;-(
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
C'est pas grave ;)

J'ai effectué les modifs que tu m'as indiquées :
#! /bin/bash

#Ensuite, il récupère l'IP de l'ordinateur (exemple : 109.129.249.50)
IP_OLD=$(cat /opt/ip.txt)
IP=$(wget -qO- whatismyip.org)

echo "ip_old : ${IP_OLD} et ip_actuelle : ${IP}" >>/home/bilow/Bureau/lol
echo "Etape 1 passee" >>/home/bilow/Bureau/lol

#qu'il compare à la dernière IP enregistrée. 

if [ "${IP}" = "${IP_OLD}" ]
then

echo "on choisit de partir" >>/home/bilow/Bureau/lol

#Si les IP sont égales, le programme s'arrête une minute, et revérifie l'IP. 

exit

#Si les IP sont différentes, il enregistre la nouvelle IP (dans un fichier ou n'importe quoi qui retient), 

else

echo "ip sont differentes" >>/home/bilow/Bureau/lol

echo "${IP}" > /opt/ip.txt

#et récupère la source d'une page web, dont l'URL ressemble à :

#http://updateIP.domaine.com/index.php?motDePasse=monpass&nouvelleIP=${IP}
wget -qO - http://server.bilow.be/update?password=haha&newip=${IP}

echo "fin de la modif" >>/home/bilow/Bureau/lol

fi

echo "fin du script" >>/home/bilow/Bureau/lol
exit
# j'ai rajouté 'exit', je suppose que cela ne change rien

Et j'ai éxécuté :
bash /opt/ipupdate.sh
Et là, j'ai bien eu le fichier "lol" qui me disait que l'IP a été modifiée. J'obtiens :

ip_old : 127.0.0.1 et ip_actuelle : 91.180.166.98
Etape 1 passee
ip sont differentes
fin de la modif
fin du script


Le script est bon. Par contre, côté du serveur qui recoit la requête (server.bilow.be/update), il recoit bien le mot de passe, mais pas l'IP. Il recoit une chaîne vide comme si ${IP} valait "" (rien). N'y a-t-il pas une erreur dans la syntaxe du wget ? Ou bien autre chose ?

Autre chose, la tâche ne s'éxécute tout simplement pas. Crontab semble être "inactif". Pourtant en éxécutant "crontab -e" j'obtiens :
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

*/1 * * * * /opt/ipupdate.sh >>/dev/null


Merci !
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
C'est les joies de la vieillesse ;-D

;-))
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1374 -
Chapeau, j'aurais pas su le retrouver ;-)
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
Je l'avais en bookmark depuis le temps ;-))
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1374 -
;-)
Bilow
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109 -
:D
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
Merci :D

Le script fonctionne bien, maintenant. Mais il y a un problème qui persiste, celui du crontab : la tâche ne s'effectue pas.Le script se situe dans le chemin absolu (à côté de etc, home, dev, var, ...) /opt/ipupdate.sh ; Le fichier log est créé sur mon bureau. Le serveur ne reçoit rien non plus lors d'un changement d'IP. Pourquoi cela ne fonctionne-t-il pas ?

Merci ;)
Bilow
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109 -
Tu penses au problème de droits ?
bilow@BilowCentral:~$ ls -l /opt/ipupdate.sh
-rw-r--r-- 1 bilow bilow 1135 2011-01-21 17:58 /opt/ipupdate.sh
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
Ben oui ton script n'est pas exécutable ;-((

chmod u+x /opt/ipupdate.sh
Bilow
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109 -
T'es génial :D
Toutes les minutes, le script s'éxécute !!! Je pensais avoir lancé l'hypothèse du problème de droit auparavant, mais au fait non.
Je vais maintenant installer ce système sur un serveur à distance (le but de ce script était de remplacer DynDNS avec inadyn qui ne fonctionnait pas). Je t'appellerai si besoin.
Merci beaucoup !!!
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
De rien ;-))
Bilow
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109 -
Zut, je n'ai pas l'IP du serveur. Je devrai attendre avant d'installer le système, et ensuite, j'aurai toujours accès au serveur grâce à server.bilow.be/update, qui me donnera l'IP ! C'est génial, tu ne trouves pas ? :D
Merci pour ton aide. Franchement j'y croyais pas, à ce que cela fonctionne :)
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
J'ai un petit problème : je viens d'installer le système sur l'orinateur distant. Mais à cause d'un problème côté serveur (bilow.be), je dois enregistrer le retour dans un fichier :
/usr/bin/wget -qO - "http://server.bilow.be/update?password=haha&newip=${IP}"  >>/home/bilow/Bureau/lol


N'ayant pas de bureau sur l'ordinateur distant, je suis obligé de placer le fichier autre part. J'ai essayé /media, mais "autorisation refusée". Que dois-je faire pour que la crontab puisse créer un fichier, en ayant l'autorisation, et où doit-il le faire ?

Merci !

Edit : Résolu
J'ai mis le CHMOD de /media et /opt à 777 ainsi que le propriétaire (bilow au lieu de root). Cela fonctionne. Mais était-ce une bonne idée ?
lami20j
Messages postés
21511
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3409 -
Salut,

Pourquoi ne le mets tu dans /home/utilisateur tout simplement ?
Pas besoin de répertoire Bureau.
Sinon tu peux créer sur le serveur distant un répertoire Bureau ou autre.
De toute façon sous Linux tout est fichier ;-)
Bilow
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109 -
Merci ;)
C'est vrai, j'aurais pu. Mais c'est fini, je n'ai plus besoin de ce fichier "lol" ! Tout le système est en place, et maintenant j'ai, en permanence, de n'importe où, accès à l'ordinateur distant avec cette ligne :
ssh $(wget -qO - http://server.bilow.be/update) 

Merci beaucoup !
Messages postés
1028
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
109
0
Merci
Salut tout le monde !

A noter pour tout ceux qui souhaiteraient éventuellement utiliser ce script :

whatismyip.org

Est un site qui n'existe plus. J'ai donc eu des ennuies avec cela...
Solution, utiliser un autre site, il faut le trouver, ou bien le créer soi-même (je le fais en PHP).

A part ca, merci zipe31 ;)
zipe31
Messages postés
37595
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
11 décembre 2019
4277 -
Salut,

Pour les sites de substitutions, il y a :
whatismyip.fr/raw/
whatismyip.akamai.com
http://www.whatismyip.com/automation/n09230945.asp

;-))