La commande

ssh ionos "mysql --verbose -usam -e 'insert into aladin.products (name,price) values ('\'test\'','\'test\'');'"

Fonctionne. Mais pourquoi les personnages d'échappement fonctionnent-ils? Ou pourquoi cette partie:

mysql --verbose -usam -e 'insert into aladin.products (name,price) values ('\'test\'','\'test\'');'

Traduire en

insert into aladin.products (name,price) values ('test','test')

Autant que je sache, l'interpréteur ne devrait pas être en mesure de donner un sens à cela car j'ai des guillemets simples non échappés dans la chaîne d'exécution.

0
Mo3bius 10 mars 2021 à 19:36

2 réponses

Meilleure réponse

La réponse de Bill Karwin est correcte et devrait être utilisée pour une meilleure lisibilité du code. Cela ne répond cependant pas directement à ma question.

Voici une réponse plus directe:

Le fait de placer des caractères entre guillemets simples préserve la valeur littérale de chaque caractère entre guillemets. Un guillemet simple peut ne pas apparaître entre guillemets simples, même s'il est précédé d'une barre oblique inverse.

(https://linux.die.net/man/1/bash)

Le problème principal est donc que \' n'est pas interprété entre guillemets simples. Si j'essaye ceci, j'ajoute seulement un \ et ferme la chaîne. Mon code fonctionne car il est permis de coller des chaînes ensemble s'il n'y a pas d'espace entre les caractères.

Voici un exemple plus simple de mon code:

mysql 'insert ('\'test\'');'

La chaîne après "mysql" est en fait insert ( + \' + test + \' + );

Cela est interprété comme

insert('test');
0
Mo3bius 10 mars 2021 à 19:38

Vous avez affaire à plusieurs niveaux d'interprètes de devis.

  1. Votre shell local.
  2. Votre shell distant sur l'hôte sur lequel vous vous connectez.
  3. L'analyseur SQL de MySQL.

Chacune de ces couches obtient à son tour d'analyser l'entrée et de supprimer un niveau de cotation. Chaque calque "voit" le résultat de la chaîne sans guillemets du calque précédent.

Finalement, cela devient déroutant. Il est difficile pour un humain de prédire le format de la chaîne à chaque niveau d'être dépouillé.

Une façon de le simplifier est de diriger l'entrée vers ssh:

echo "insert into aladin.products (name,price) values ('test','test');" |
  ssh ionos "mysql --verbose -usam"

Vous éliminez ensuite la plupart des calques et des problèmes de guillemets imbriqués.

1
Bill Karwin 10 mars 2021 à 16:43