Linux : Programmer

Résolu
Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
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

7 réponses

Résumé de la discussion

Le sujet décrit un projet sous Linux consistant à exécuter un script Bash en fond qui vérifie chaque minute l'adresse IP publique et, en cas de changement, met à jour une URL. Des échanges portent sur la récupération de l'IP (via whatismyip.org ou alternatives), le stockage de l'ancienne IP et l'envoi de la nouvelle valeur vers l'URL de mise à jour. Les questions techniques portent sur l'utilisation de cron et crontab pour lancer le script chaque minute, sur l emplacement et les permissions, et sur l impact des sources IP. En parallèle, des conseils abordent des détails pratiques comme éviter le répertoire Bureau et privilégier /home/utilisateur, tout en rappelant que les sources IP évoluent et nécessitent d'adapter le script.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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 
    0
  2. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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 !
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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 ;-))
      0
  3. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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}
    
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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.
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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é ;-(
      0
  4. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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 !
    0
    1. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      Up svp :(
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      wget -qO - http://server.bilow.be/update?password=haha&newip=${IP}

      Est-ce que la commande seule depuis un shell marche au moins (en initialisant la variable $IP avant bien entendu) ?

      Pour la crontab, il faut donner les chemins absolus de chaque exécutable.
      0
    3. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      /opt/ipupdate.sh n'est pas un chemin absolu ? Le dossier "opt" est placé à côté des "etc", "home", "var", "dev" etc. à la racine.
      J'ai initialisé $IP, et j'ai fait ce que tu m'as dit. Voici le terminal :
      bilow@BilowCentral:~$ IP=$(wget -qO- whatismyip.org)
      bilow@BilowCentral:~$ echo ${IP}
      91.180.231.128
      bilow@BilowCentral:~$ wget -qO - http://server.bilow.be/update?password=haha&newip=${IP} 
      [1] 9780
      bilow@BilowCentral:~$ server.bilow.be a repondu ok avec haha et  ;

      A noter que la dernière ligne est ce que renvoi la page de mon serveur. Tu peux toi-même tester, cela fonctionnera. Toujours bizarre que l'IP ne soit pas reçue... :(
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Il faut que tu quotes l'URL sans quoi l'éperluette (&) est interprétée comme étant un caractère interprétable par ton shell (& = mise en arrière-plan d'une commande), c'est d'ailleurs ce qui explique le retour après ta commande "[1] 9780", c'est en fait un job qui tourne sur l'arrière (que tu peux tuer avec la commande "kill %1").

      Essaie comme ça :

      $
      wget -qO - "http://server.bilow.be/update?password=haha&newip=91.180.231.128"
      server.bilow.be a repondu ok avec haha et 91.180.231.128 ;
      0
    5. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
       
      ésperluette, tu commences à perdre la boule si tu ébreches même ce doux mot ;)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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 ;)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Quand je parlais de chemins absolus c'était en référence à chaque commande employée dans ton script :

      cat => /bin/cat
      wget => /usr/bin/wget
      etc.

      La crontab lorsqu'elle est exécutée ne récupère aucun environnement, d'où la nécessité de tout initialiser, chemins et variables d'environnement ;-\
      0
    2. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      Ok... "etc" : Il y en a d'autres ? Et que se passe-t-il quand la tâche est éxécutée mais une erreur survient ? Le script s'arrête ? La tâche s'éxécutera encore ?
      #! /bin/bash 
      
      #Ensuite, il récupère l'IP de l'ordinateur (exemple : 109.129.249.50) 
      IP_OLD=$(/bin/cat /opt/ip.txt) 
      IP=$(/usr/bin/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} 
      /usr/bin/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 
      


      Edit : Fonctionne toujours pas :(
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Que contient "/home/bilow/Bureau/lol" ?
      0
    4. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      En fait à chaque fois je le supprime. Mais si tu veux vraiment le savoir : pour avoir la mise à jour, j'ai modifié /opt/ip.txt ; Il contient donc une autre IP. J'éxécute "bash /opt/ipupdate.sh", et "/home/bilow/Bureau/lol" contient maintenant :
      ip_old : 91.180.97 et ip_actuelle : 91.180.97.115
      Etape 1 passee
      ip sont differentes
      fin de la modif
      fin du script

      Je ne sais pas si cela peut t'aider...
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon déjà il s'exécute en entier ;-)

      Rajoute ça (ce qui est en gras) :

      /usr/bin/wget -qO - "http://server.bilow.be/update?password=haha&newip=${IP}"  >>/home/bilow/Bureau/lol 

      Relance la crontab et affiche le contenu du fichier de log...
      0
  7. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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 ?
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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 ;-)
      0
    2. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      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 !
      0
  8. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
     
    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 ;)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

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

      ;-))
      0