[BASH] Probleme Difference

Probleme Difference [BASH] - Shell/Batch - Programmation

Marsh Posté le 03-03-2014 à 14:55:12    

Bonjour tout le monde,

 

je me bagarre avec mon script Shell depuis quelques temps.

 

Son but :

 

Récupérer mon IP publique, puis la stocker dans un fichier ip_temp.

 

Ensuite si le contenu du ip_temp est différent du fichier de réference monippublique.txt, il devra injecter la nouvelle ip dans le fichier de ref et ensuite m'envoyer un mail avec ma nouvelle IP.

 

Ce script sera executé en tâche de fond via Cron

 
Code :
  1. #!/bin/bash
  2. wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > /tmp/ip_temp
  3. #VARIABLES
  4. T1=`cat /tmp/ip_temp`
  5. T2=`cat /tmp/monippublique.txt`
  6. #Check Dev
  7. echo $T1
  8. echo $T2
  9. #Comparaison , maj et envoi
  10. if [ "$T1" != "$T2" ]; #j'ai essayé sans quote et avec
  11.     then
  12. #       echo T1 > /tmp/monippublique.txt
  13. #       echo "l'ip a change et est devenue $T1" |mail -s "changement" mon-email@gmail.com
  14.         echo "c'est bon"
  15. fi
 

CODE : code provisoire le temps de régler le pb

 


Mode debug

 
Code :
  1. + wget http://checkip.dyndns.org/ -O - -o /dev/null
  2. + cut -d: -f 2
  3. + cut '-d<' -f 1
  4. ++ cat /tmp/ip_temp
  5. + T1=' 111.11.111.1'
  6. ++ cat /tmp/monippublique.txt
  7. + T2=' 111dsdsd.11.111.1'
  8. + echo 111.11.111.1
  9. 111.11.111.1
  10. check_ip_publique.sh: line 27: 111.11.111.1: command not found
  11. + echo 111dsdsd.11.111.1
  12. 111dsdsd.11.111.1
  13. + ["$T1"!="$T2"]
  14. check_ip_publique.sh: line 33: [$T1!=$T2]: command not found
 

mon fichier de ref a volontairement des lettres dans son IP pour que la MAJ se fasse


Message édité par nomiss le 03-03-2014 à 15:49:05
Reply

Marsh Posté le 03-03-2014 à 14:55:12   

Reply

Marsh Posté le 03-03-2014 à 18:18:23    

Es-tu sur de contenu du fichier /tmp/ip_temp ? Il n'y a pas de ligne blanche ou autre ? Vu que tu le génère à partir d'un site que tu ne maîtrise pas toi, en ce qui me concerne je mettrais un certain nombre de protection, notamment je vérifierais via regexp que j'obtiens bien une et une seule adresse IP sans rien d'autre. D'ailleurs il ne sert a rien de passer par un fichier temporaire non plus. En gros je ferais quelque chose comme (fait vite fait sans test il y a surement mieux a faire) :
 

Code :
  1. T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" | tail -1`
  2. [ -z "$T1" ] && exit 1


 
Le mode debug que tu montres ne corresponds pas à ton code :
Quelle est la ligne 27 de ton script ? c'est comme si tu avait fait "$T1" au lieu de "echo $T1".
 
Le problème de la ligne 33 est le manque d'espace entre les "[" et les valeurs.
Il faut bien des quotes également. Si tu veux oter tout doute lié à la présence de variables vide par exemple tu peux modifier le test pour faire quelque chose comme :

Code :
  1. [ "x${T1}" != "x${T2}" ]


 
Attention dans la ligne en commentaire "echo T1 > /tmp/monippublique.txt" il n'y a pas de $ avant le nom de la variable.

Reply

Marsh Posté le 04-03-2014 à 08:54:39    

Salut, merci pour ta réponse,  
 
- "D'ailleurs il ne sert a rien de passer par un fichier temporaire non plus"
 
en fait à la base j'avias fais ça :
 
T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > /tmp/monippublique.txt`
 
je vais vérifier tout ça ...
 
[edit]
 
- "Es-tu sur de contenu du fichier /tmp/ip_temp ? Il n'y a pas de ligne blanche ou autre ?"
 
via le lien checkip, il me retourne l'@ avec un espace au début.
 
- "En gros je ferais quelque chose comme (fait vite fait sans test il y a surement mieux a faire) :"
 
J'ai testé :
 

Code :
  1. T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" | tail -1`

 
 
il ne me retourne rien.
 
- "Quelle est la ligne 27 de ton script ? c'est comme si tu avait fait "$T1" au lieu de "echo $T1"."
 

Code :
  1. #!/bin/bash
  2. echo Execution du script
  3. echo
  4. echo Adresse Publique Actuelle :
  5. wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > /tmp/ip_temp
  6. #VARIABLES
  7. T1=`cat /tmp/ip_temp`
  8. T2=`cat /tmp/monippublique.txt`
  9. #Check
  10. echo $T1
  11. $T1
  12. echo $T2
  13. #Boucle de verification
  14. if ["$T1" -ne "$T2"]                         (ndlr : pour trouvé mon problème j'ai fias un script à côté avec ce type de notation fonctionnelle)
  15.     then
  16. #       echo T1 > /tmp/monippublique.txt
  17. #       echo "l'ip a change et est devenu $T1" |mail -s "changement" monemail@gmail.com
  18.         echo "super"
  19. fi
  20. echo Termine !


 

Code :
  1. [root@pocpup tmp]# bash -x check_ip_publique.sh
  2. + echo Execution du script
  3. Execution du script
  4. + echo
  5. + echo Adresse Publique Actuelle :
  6. Adresse Publique Actuelle :
  7. + wget http://checkip.dyndns.org/ -O - -o /dev/null
  8. + cut -d: -f 2
  9. + cut '-d<' -f 1
  10. ++ cat /tmp/ip_temp
  11. + T1=' 999.11.254.88'
  12. ++ cat /tmp/monippublique.txt
  13. + T2=' 999dsdsd.11.254.88'
  14. + echo 999.11.254.88
  15. 999.11.254.88
  16. + 999.11.254.88
  17. check_ip_publique.sh: line 21: 999.11.254.88: command not found
  18. + echo 999dsdsd.11.254.88
  19. 999dsdsd.11.254.88
  20. + '[ 999.11.254.88' -ne ' 999dsdsd.11.254.88]'
  21. check_ip_publique.sh: line 27: [ 999.11.254.88: command not found
  22. + echo Termine '!'
  23. Termine !
  24. (ndlr : Biensûr l' "ip" est volontairement changée)

Message cité 1 fois
Message édité par nomiss le 04-03-2014 à 09:13:00
Reply

Marsh Posté le 04-03-2014 à 11:56:22    

nomiss a écrit :

en fait à la base j'avias fais ça :

 

T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > /tmp/monippublique.txt`

 

je vais vérifier tout ça ...

 

Normal que ca ne donne rien dans T1, si tu mets une redirection (le > ) tu n'auras rien dans la variable T1

 
nomiss a écrit :


via le lien checkip, il me retourne l'@ avec un espace au début.

 

J'ai testé :

 
Code :
  1. T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" | tail -1`

 

il ne me retourne rien.

 

Normal, si il y a un espace avant, il faut l'inclure dans la regexp, ou alors le supprimer avant de passer la regexp

 


nomiss a écrit :


echo $T1

 

$T1

 



Le $T1 tout seul la ne sert a rien. C'est lui qui te fait une erreur de syntaxe : le système essaie d'exécuter le contenu de la variable, donc ton IP, ce qui n'est pas une commande valide

 
nomiss a écrit :


if ["$T1" -ne "$T2"]


Il manque les espaces apres et avant les [ ]. En outre le -ne ne sert qu'a tester des entiers, ce qui n'est pas le cas en l'occurence. Il faut donc utiliser !=

 
Code :
  1. if [ "$T1" != "$T2" ]


Message édité par Nukolau le 04-03-2014 à 11:58:20
Reply

Marsh Posté le 04-03-2014 à 11:58:23    

Code :
  1. #!/bin/bash
  2. echo Execution du script
  3. echo
  4. echo Adresse Publique Actuelle :
  5. wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > /tmp/ip_temp
  6. #VARIABLES
  7. T1=`cat /tmp/ip_temp`
  8. T2=`cat /tmp/monippublique.txt`
  9. #T1=A
  10. #T2=B
  11. #Check
  12. echo $T1
  13. echo $T2
  14. #Boucle de verification
  15. if [ " ${T1}" != " ${T2}" ]
  16.     then
  17.         echo T1 > /tmp/monippublique.txt
  18.         echo "l'ip a change et est devenu $T1" |mail -s "changement" monemail@gmail.com
  19.         echo "super"
  20. fi
  21. echo Termine !
 


je n'ai plus d'erreur, par contre j'attend encore mon mail.

 

Je vais aussi modifier T1 et mettre lcommande wget dedans

 

[edit] j'ai pris note de tout ce que tu m'as dis, merci.


Message édité par nomiss le 04-03-2014 à 13:27:02
Reply

Marsh Posté le 05-03-2014 à 19:50:39    

Script Opérationnel !  
 

Code :
  1. #!/bin/bash
  2. #VARIABLES
  3. T1=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d ' ' -f 6 | cut -d\< -f 1`
  4. T2=`cat /home/ScriptIP/IP`
  5. #Boucle de verification
  6. if [ "$T1" != "$T2" ] #Si le resultat du retour commande est different du fichier de ref
  7.     then
  8.         echo $T1 > /home/ScriptIP/IP    #MISE A JOUR DU FICHIER IP
  9.         echo "Voici la nouvelle IP Publique => $T1 " |mail -s "Nouvelle IP Publique" monmail@gmail.com #ENVOI DU MAIL AVEC LA NOUVELLE IP PUBLIQUE
  10. fi
  11. #FIN


 
à présent je vais le mettre en Cron,
 
Comment ça se passe pour ça ? (CENTOS 6.5)
 
L'idéal serait des le boot de ma VM et puis toute les 10mn qui suivent, possible ?

Reply

Marsh Posté le 06-03-2014 à 22:09:50    

Un cron est exécuté à intervalles de temps. Pour exécuter un programme au boot, il te faut un script de boot.
http://www.commentcamarche.net/faq [...] it-et-cron

Reply

Marsh Posté le 07-03-2014 à 10:23:53    

Oui j'avais pensé à ça. Je vais exploiter ce lien, merci
 
[edit]
 
j'ai juste à mettre mon .sh dans le init.d ? et de parametrer ensuite un cron ?


Message édité par nomiss le 07-03-2014 à 10:25:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed