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 :

Utiliser variable dans une requete curl API cloudflare ne fonctionne pas.


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut Utiliser variable dans une requete curl API cloudflare ne fonctionne pas.
    Bonjour à tous,

    Voilà j'ai comme projet de faire un script qui mettrait à jour mon IP dans la règles (policies) cloudflare qui autorise les accès à mes service auto-hébergés. Mais le problème n'est pas la j'ai trouvé la bonne commande Curl pour cette mise à jour dans les API cloudflare.
    J'ai commencer à faire un script qui détecte les changements d'IP depuis sa dernière exécution (jusque la tout vas bien) et si l'IP a changé je veux exécuté un code qui inclue l'adresse IP stockée dans une variable... et c'est la que les ennuis commencent.
    La commande curl fonctionne bien avec une adresse IP mais si à la place de l'adresse IP je tente de mettre la variable ça ne marche plus j'ai essayé pas mal de choses mais ça ne marche pas.
    C'est mon premier script j'ai du m'aider de google pour quasiment chaque commande mais la je coince et mes recherches ne donnent pas vraiment de résultat.
    Voici mon script l'IP remplacer par une variable et tout à la fin de l'avant dernière ligne "--data" (j'ai bien sur enlevé tout mes tokens perso):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
    new_ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
    current_ip=`cat current_ip.txt`
    if [ "$new_ip" = "$current_ip" ]
    then 
    	echo 'pas de changement ip'
    	exit 0
    else
    	echo $new_ip> current_ip.txt
    fi
     
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data '{"precedence":1,"decision":"bypass","name":"IP","include":[{"ip":{"ip":"$new_ip"}}]}'	 
     
    echo 'Mise à jour effectuée'
    Donc j'ai besoin de votre aide pour que la variable "new_ip" soient prise en compte. En l'état la requête part tel quel et cloudflare me renvoie une erreur ("message": "access.api.error.invalid_request: invalid json in policy rule").

    Merci d'avance pour votre aide.
    Bon dimanche.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Première remarque: si l'iP est inchangée, tu quittes le script. Le "else" n'a donc pas lieu d'être. Et dans les redirections on a l'habitude de coller la redirection au fichier de destination et non pas à la commande => echo "$new_ip" >current_ip.txt.
    Ensuite, on écrit toujours les chaines entre quotes => new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)" et current_ip="`cat current_ip.txt`". Pour une affectation ça n'a pas d'importance mais ça en aura pour les comparaisons donc si on prend l'habitude de le faire tout le temps on ne tombera pas dans le piège idiot où le test [ $toto = $titi ] plantera connement parce que la variable "titi" contient une phrase et que le shell considèrera chacun des mots de la phrase comme autant d'éléments distincts et non pas comme un seul (sans parler de l'autre cas où titi est vide et où le shell ne voyant rien à comparer te répond alors qu'il manque un opérande...)
    Concernant la variable "current_ip" on peut se poser la question sur l'utilisation de l'ancienne écriture de substitution de commande `commande` au lieu de la plus récente et plus lisible $(commande) (d'autant plus que tu la connais puisque tu l'utilises juste au dessus) et surtout de l'utilité de cette variable qui n'est utilisée qu'une seule fois.

    Pour ton souci principal, il provient du fait que tu utilises des quotes simples pour l'option "--data" et que dans ce cas, une variable n'est alors pas interprétée.
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> toto="Hello World !!!"
    >>> echo "$toto"
    Hello World !!!
    >>> echo '$toto'
    $toto
    D'où le fait que l'utilisation de doubles quotes en tout temps (qui justement ne bloquent ni les variables, ni les substitution de commandes) permet de résoudre beaucoup de soucis liés aux strings avec espace...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut
    Sve@r je te remercie ça n'as pas marché du premier coup mais en m'inspirant d'un autre script j'ai réussi (d’ailleurs ce script utilise bien les doubles quotes je n'avais pas fait attention...)
    https://github.com/K0p1-Git/cloudflare-ddns-updater

    Pour les bizarreries de mon code. Bah c'est mon premier code et je demandais à google pour chaque ligne "comment mettre un fichier texte dans une variable bash" ou "comment ecrire une variable bash dans un fichier texte" et je prenais le premier résultat qui fonctionnais. J'ai apporté les modifications que tu as suggéré merci.
    En revanche pour le else inutile si les IP sont différente il faut bien que je mette else non ?
    Et pour les simples quote pareil j'ai bêtement copié le code des documentation clouflare en l'adaptant à mon besoin https://api.cloudflare.com/#access-p...-access-policy

    Donc voilà mon script corrigé et fonctionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    then 
    	echo 'pas de changement ip'
    	exit 0
    else
    	echo $new_ip> current_ip.txt
    fi
     
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data "{\"precedence\":1,\"decision\":\"bypass\",\"name\":\"IP\",\"include\":[{\"ip\":{\"ip\":\"$new_ip\"}}]}"
     
    echo 'Mise à jour effectuée'
    Est ce que ce genre de script est assez léger pour être lancé toutes les minutes (même si en vrai je pense plutôt le faire toutes les 10 ou 15 minutes ça me semble suffisant).

    En tout cas encore merci pour ton aide je commençais à m'arracher les cheveux

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rutsah Voir le message
    En revanche pour le else inutile si les IP sont différente il faut bien que je mette else non ?
    Non, puisque dans le cas du "if" le script s'arrête. Corollaire, s'il continue c'est que fatalement tu es dans un "else" implicite. D'ailleurs tu dois le sentir puisque la commande "curl" n'est pas dans le "else" mais ne s'exécute que si les IP sont différentes...

    Citation Envoyé par Rutsah Voir le message
    Donc voilà mon script corrigé et fonctionnel:
    Les chaines se mettent entre quotes doubles. Toutes les chaines. Seules exceptions, quand on utilise "tr" ou "awk" parce que même si les quotes doubles sont possibles, la syntaxe est plus simple avec des quotes simples (surtout que "awk" utilise le "$" qui pourra foutre le bordel avec le shell si tu ne bloques pas son interprétation).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    then 
    	echo "pas de changement ip"
    	exit 0
    fi
     
    echo "$new_ip" >current_ip.txt
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data "{\"precedence\":1,\"decision\":\"bypass\",\"name\":\"IP\",\"include\":[{\"ip\":{\"ip\":\"$new_ip\"}}]}"
     
    echo "Mise à jour effectuée"
    Citation Envoyé par Rutsah Voir le message
    Est ce que ce genre de script est assez léger pour être lancé toutes les minutes (même si en vrai je pense plutôt le faire toutes les 10 ou 15 minutes ça me semble suffisant).
    Il est pas super lourd en tant que tel sauf le "dig" toutes les minutes qui peut être une charge un peu inutile. Si tu penses que 10 ou 15 minutes est un bon compromis alors pourquoi forcer? Tu le mets dans un "cron" et tu ne t'en occupes plus...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut
    Ok, merci pour tout tes bons conseils. Pour la fonction if je ne sais pas pourquoi mais je pensais que le else était obligatoire.
    J'étais déjà content simplement que ça fonctionne mais un code nettoyé et optimisé ça ne fait pas de mal, surtout que ça tournera sur un Raspberry (4 mais quand même).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut UUOC!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    Code /bin/bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$new_ip" = "$(<current_ip.txt)" ]
    Code /bin/bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$new_ip" = "$(<current_ip.txt)"
    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. Utilisation d'une variable dans une requete
    Par namto dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/03/2010, 11h23
  2. utiliser des variables dans une requet INSERT
    Par k_boy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/12/2009, 10h45
  3. Utiliser une variable dans une requete et *
    Par USnico dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 30/10/2007, 17h41
  4. utilisation d'une variable dans une requete SQL
    Par ezneti dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/04/2007, 09h47
  5. utilisation de variable dans une requete
    Par JUSTIN Loïc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/07/2006, 08h40

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