IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Commande système dans awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Commande système dans awk
    Bonjour,
    Je dois m'envoyer un mail chaque fois que l'adresse IP de l'équipement change. Pour celà, j'ai un petit script qui s'éxécute toutes les heures et qui me donne le petit fichier avec l'anciennne [(t-1)heure] et la nouvelle [t heure] adresse.
    adresses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    125.213.27.10:158.145.12.34
    Si les 2 adresses sont différentes, j'envoie un mail avec la 2ème adresse, et dans tous les cas (== ou <>), je supprime la 1ère adressse.
    La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hubert@ubuntu:~$ mutt -s "Changement IP" ***********@free.fr < adresses
    fonctionne correctement en ligne, mais je ne parviens pas à l'intégrer dans un script awk. Pour simplifier, j'ai essayé d'intégrer la commande echo à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hubert@ubuntu:~$ awk -F":" '{if($1!=$2) {system ("echo" "$1")} {print $2":"}}' adresses> ip
    ne donnne rien, par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hubert@ubuntu:~$ awk -F":" '{if($1!=$2) {system ("echo" $1)} {print $2":"}}' adtresses > ip
    /bin/sh: 1: echo125.213.27.10: not found
    La commande réelle serait de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F":" '{if($1!=$2) {system ("mutt -s \"Changement IP\" **********@free.fr <" $2)} {print $2":"}}' adtresses > ip
    Je pense que j'ai un problème de systaxe, mais je ne vois pas où.

  2. #2
    Membre régulier Avatar de supaplex
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Avril 2012
    Messages : 47
    Points : 87
    Points
    87
    Par défaut
    Une autre façon d'avoir son ip:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl http://requestbin.net/ip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl 'https://api.ipify.org?format=json'

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Citation Envoyé par hapalemur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hubert@ubuntu:~$ mutt -s "Changement IP" ***********@free.fr < adresses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F":" '{if($1!=$2) {system ("mutt -s \"Changement IP\" **********@free.fr <" $2)} {print $2":"}}' adtresses > ip
    Je pense que j'ai un problème de systaxe, mais je ne vois pas où.
    Dans le premier code cité, tu injectes un fichier "adresses" dans la commande "mutt".
    Dans le second code cité, tu injectes un fichier "158.145.12.34" dans la commande "mutt"; fichier qui n'existe vraisemblablement pas.

    À ta place, je ne ferais pas de commande dans le awk. Trop alambiqué, dur à déboguer. As-tu le choix ?

    @Supaplex : joli pseudo, joli avatar.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour les réponses,
    Je vois l'erreur d'injection dans le second cas avec $2. J'utilise awk, car c'est l'outil que je connais le mieux (enfin presque) pour manipuler les chaines avec $i; je peux m'en passer si je manipule les string dans le shell, mais pour moi, c'est nettement moins simple.

    donc à partir du fichier adresses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    125.213.27.10:158.145.12.34
    j'ai le pseudo algorithme : (avec ip1 et ip2 1ére et 2ème adresses)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    newip=false
    if [$ip1!=$ip2]; then newip=true
    fi
    suppression de ip1 du fichier adresses (je passerai par awk, car plus simple pour moi)
    awk -F":" '{print $2":"}' adresses> ipadr
     
    if [$newip="true"]; then mutt -s "Changement IP" ***********@wanadoo.fr < ipadr
    fi
    Le point critique, c'est comment récupérer mes 2 varaiables ip1 et ip2 sans passer par awk?

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Pas tout compris, mais bon, un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cat adresses
    0.0.0.0:1.1.1.1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IFS=\: read ip1 ip2 <adresses
    echo $ip1
    0.0.0.0
    echo $ip2
    1.1.1.1
    Et on n'isole pas IFS sur une ligne à part !!!
    Car ici, cela permet de ne redéfinir l'IFS que pour la commande read uniquement.
    Cordialement.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    Bonjour,

    il y a au moins deux trous dans ton algo :
    - comment est stockée l'adresse courante (emplacement, format)
    - comment tu récupères la nouvelle adresse

    comment lire des fichiers en shell
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par hapalemur Voir le message
    J'utilise awk, car (...)
    Le point critique, c'est comment récupérer mes 2 varaiables ip1 et ip2 sans passer par awk?
    Non, je ne remets pas en cause awk, mais la place de la commande externe. On préférera laisser la commande externe à l'extérieur. (Lapalissade, n'est-ce pas ? )

    awk -F":" '{if($1!=$2) {system ("echo" "$1")} {print $2":"}}' adresses> ip
    Entrée: "adresses"
    2 Sorties : la sortie standard dans le fichier "ip" et la commande système.

    Idée : faire le contraire. rediriger l'ancien affichage dans ip, et mettre sur la sortie standard l'adresse pour la commande externe.
    Schématiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{print "sortie pour ip" > "ip"; print $2;}' adresses | commande_externe

    Citation Envoyé par hapalemur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [$ip1!=$ip2]; then newip=true
    fi
    suppression de ip1 du fichier adresses (je passerai par awk, car plus simple pour moi)
    if [$newip="true"]; then mutt -s "Changement IP" ***********@wanadoo.fr < ipadr
    fi
    aïe. Le crochet est raccourci pour la commande test. Il faut mettre des espaces. De plus, les commentaires commencent par un croisillon #. Enfin le point virgule symbolise le retour à la ligne (bizarre de mettre à la ligne le "fi" mais pas le "then").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$newip" = "true"; then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$newip" = "true" ]; then
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bon, vous donnez des pistes intéressantes (à explorer pour la compréhension); de mon côté, j'étais parti sur la solution qui essaie d'éviter awk pour la commande d'envoi de mail, j'ai une solution quasi fonctionnelle sauf si j'inclue le test sur $ip1 et $ip2.

    Ceci fonctionne pour l'envoi de mail avec la valeur de ip2 dans le corps du texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $ip2 | mutt -s "Changement IP" **********@free.fr
    Par contre avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [ $ip1 != $ip2 ]; then echo $ip2 | mutt -s "Changement IP" *************@free.fr fi
    >
    celà ne fonctionne plus
    J'ai passage à la ligne avec un chevron (attente d'une commande ???)

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Il manque le point-virgule avant le "fi". Il attend donc la fin du "if", puisque le fi fait partie de la commande "mutt".
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bon, c'est OK : merci pour l'aide.
    Donc la solution finale : avant le script et après le script le fichier de base:
    ipaddress :
    et les infos de status obtenues avec la 1ère ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    hubert@ubuntu:~$ cat status
    Configuration data '/usr/local/etc/no-ip2.conf' is read-only!
    No updates can be made.
    1 noip2 process active.
     
    Process 786, started as noip2, (version 2.1.9)
    Using configuration from /usr/local/etc/no-ip2.conf
    Last IP Address set 146.128.26.49
    Account f********@orange.fr
    configured for:
    	host  f***.****.org
    Updating every 30 minutes via /dev/eth0 with NAT enabled.
    Et le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    /usr/local/bin/noip2 -S 2> status
    sed -n '7p' status > ftemp
    sed -i 's/Last IP Address set //g' ftemp
    cat ftemp >> ipaddress
    tr -d '\n' < ipaddress > ftemp
     
    IFS=\: read ip1 ip2 < ftemp
    if [ $ip1 != $ip2 ]; then
      echo $ip2 | mutt -s "Changement IP" ***********@free.fr; 
    fi 
    awk -F":" '{{print $2":"}}' ftemp > ipaddress
    #sed -i 2d ipaddress

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    addressFile=/je/sais/pas/ou
     
    curIP=$(/usr/local/bin/noip2 -S 2 | grep -Po '^Last.*\s\K.*') # et hop! plus aucun fichier temporaire
    preIP=$(sed 's/:$//' "$addressFile") # cette commande pourra être supprimée , car le format inutile va être changé
     
    test "$curIP" = "$(<"$addressFile")" || echo "$curIP" | tee "$addressFile" | mail -s "nouvelle adresse" $user@wanadoo.fr
    c'est tout.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    curIP=$(/usr/local/bin/noip2 -S 2 | grep -Po '^Last.*\s\K.*') # et hop! plus aucun fichier temporaire
    Euh, tu es sur pour le -S 2 | en remplacement de -S 2> ?
    Cordialement.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    non.
    ce n'est pas un argument de l'option -S ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    En regardant le man, à priori, le -S ne prend pas de paramètre...
    Cordialement.

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    s'il est alors question de rediriger la sortie d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    noip2 -S 2>&1 1>/dev/null | grep...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre régulier Avatar de supaplex
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Avril 2012
    Messages : 47
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    @Supaplex : joli pseudo, joli avatar.
    Merci C'est un ancien jeu vidéo d'une autre époque

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Auquel j'ai joué étant enfant.J'ai encore la musique dans la tête.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bsr,
    En relisant vos comments, je m'aperçois que le 2> pose question : il m'en a posé auussi car je n'arrivais pas à rediriger la sortie des status.
    En regardant le code de noip.c, on s'aperçoit que toutes les sorties son redirigées vers stderr ... (bizarre??? )
    Citation Envoyé par N_BaH
    c'est tout.
    Eh oui il y en a qui font du shell presque tous les jours ... moi, ce n'est qu'occasionnellement, et je suis loin d'avoir atteint cette densité d'écriture et son esthétique..
    Quand je vais avoir quelques moments, je vais remettre awk en chantier afin de comprendre comment effectuer une commande système.
    Merci encore pour les conseils.

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    comment effectuer une commande système
    aucun de mes programmes 100% awk, et aucun de mes scripts shell appelant awk, n'utilisent system().
    les appels à des programmes externes, dans awk, se font par une simple variable.
    et encore cela n'est fait que dans les scripts 100% awk.
    si j'appelle awk dans un script shell, je ne m'enquiquine pas : la commande reste externe.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonctionnement aléatoire de commandes système dans un script
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 03/08/2016, 21h09
  2. Réponses: 8
    Dernier message: 04/03/2011, 16h22
  3. Executer commande système dans un .bat
    Par chezwam56 dans le forum Langage
    Réponses: 20
    Dernier message: 04/03/2009, 19h59
  4. Réponses: 1
    Dernier message: 14/03/2007, 15h56
  5. Masquer une commande système dans python
    Par Mysti¢ dans le forum Général Python
    Réponses: 5
    Dernier message: 03/11/2006, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo