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 :

Problème d'échappement dans une commande mysql lancée par ssh en bash


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
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut Problème d'échappement dans une commande mysql lancée par ssh en bash
    Bonjour,

    je dois récupérer des informations se trouvant dans une base mysql distante d'un serveur web sous ISPconfig. Les infos dont j'ai besoin de trouvent dans la base MySQL d'isponfig qui est dbispconfig. Et je veux des infos de la table web_domain.

    Manque de chance les concepteurs de cette base ont appelé un champ ssl, or c'est un mot réservé MySQL. Quand je me connecte en local à MySQL je peux lancer une requête en utilisant des quotes inversées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select `ssl` from web_domain;
    Ça fonctionne.

    Mais là je dois lancer la requête en ssh depuis un script tournant sur une autre machine, et là je n'arrive pas à trouver comment échapper ce champ pour qu'il ne génère pas d'erreur.

    si j'écris ma commande ssh pour interroger mysql comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select ssl,ssl_letsencrypt from dbispconfig.web_domain where domaine like '%${nomDom}%';\" | mysql -N -u${user} -p'${mdp}'"
    et que je lance l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remoteDatasChain=$(ssh server.exemple.com "${sshCommand}")

    j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ssl,ssl_letsencrypt from dbispconfig.web_domain where domain like '%domain.tld%'' at line 1
    Si je la lance avec juste le champ ssl_letsencrypt alors il n'y a pas d'erreur.

    si j'essaye de rajouter des backquotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select `ssl`,ssl_letsencrypt from dbispconfig.web_domain where domain like '%${nomDom}%';\" | mysql -N -u${user} -p'${mdp}'"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    go-test.sh: ligne9: ssl : commande introuvable
    ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ssl_letsencrypt from dbispconfig.web_domain where domain like '%domain.tld%'' at line 1
    là j'ai en plus une erreur bash, normal puisqu'il croit que je lui demande d'exécuter la commande ssl.

    Donc j'essaye d'échapper mes ` :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select \`ssl\`,ssl_letsencrypt from dbispconfig.web_domain where domain like '%${nomDom}%';\" | mysql -N -u${user} -p'${mdp}'"
    toujours la même erreur.

    j'essaye alors de mettre mes ` entre quotes ' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select '`ssl`',ssl_letsencrypt from dbispconfig.web_domain where domain like '%${nomDom}%';\" | mysql -N -u${user} -p'${mdp}'"
    Là, plus d'erreur MySQL, c'est un progrès, mais toujours l'erreur bash qui veut à tout prix exécuter la commande ssl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    go-test.sh: ligne9: ssl : commande introuvable
    (les champs en question sont des enum avec y ou n)

    Mais en fait en echotant ma requête ssl est remplacé par ' ' donc pas d'erreur mais pas de valeur...

    Donc ma question : quelqu'un sait-il comment je peux proprement me tirer de cette situation ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Alarc'h Voir le message
    si j'écris ma commande ssh pour interroger mysql comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select ssl,ssl_letsencrypt from dbispconfig.web_domain where domaine like '%${nomDom}%';\" | mysql -N -u${user} -p'${mdp}'"
    Je ne m'y connais pas suffisamment en shell pour quoter correctement les backquotes...

    Il me semble qu'en MySQL, le nom complet d'une table est obtenu par nom complet ::= nom base.nom_table.

    Existe-t-il un équivalent pour le nom complet d'un champ qui permettrait de lever l'ambiguïté ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut
    OUI !!!! Vous avez parfaitement raison ! En ajoutant le nom de la table ça résoud le problème, c'est évident. Mais quand on a le nez sur le guidon on ne voit plus rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select web_domain.ssl,ssl_letsencrypt from dbispconfig.web_domain where domain like '%mydomaine.tld%';
    Voilà la requête comme ça fonctionne, en fait on devrait toujours écrire les formes longues et éviter les raccourcis, mais c'est tellement long et verbeux qu'on va vers la facilité. La vrai forme propre serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select web_domain.ssl,web_domain.ssl_letsencrypt from dbispconfig.web_domain where web_domain.domain like '%mydomaine.tld%';
    Et bien merci beaucoup, vous me retirez une belle épine du pied !

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    j'essaye alors de mettre mes ` entre quotes ' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sshCommand="echo \"select '`ssl`',ssl_letsencrypt
    Ça, il n'y a aucune chance que cela marche. Tu es dans un contexte de "double quotes". Donc les 'simple quotes' sont protégés (non interprétés) et les backticks sont interprétés (donc exécutés). Tout le contraire de ce que l'on veut.
    Pourquoi ne pas mettre simplement entre simple quotes (donc juste retirer les backticks) ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour
    Pourquoi ne pas mettre simplement entre simple quotes (donc juste retirer les backticks) ?
    Parce que ça ne fonctionne pas comme ça, dans ce cas le résultat contient la chaîne ssl littéralement. La solution est donnée au message précédent.

    Merci quand même

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

Discussions similaires

  1. problème d'insertion dans une table mysql
    Par mawkli dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/05/2012, 12h05
  2. Entrer une variable dans une commande déja lancée
    Par Druks8 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/02/2009, 12h55
  3. Problème de quote dans une commande
    Par nicolas_lepot dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 01/10/2008, 16h44
  4. problème d'insertion dans une base MySql
    Par cerco1 dans le forum JDBC
    Réponses: 13
    Dernier message: 01/10/2007, 20h40
  5. Problème d'insertion dans une table MYSQL
    Par greg69 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/10/2005, 11h34

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