Comment exécuter une commande bash stockée sous forme de chaîne avec des guillemets et un astérisque

J’essaie d’exécuter la commande suivante:

mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" 

Je le stocke dans une chaîne:

 cmd="mysql AMORE -u username -ppassword -h localhost -e\"SELECT host FROM amoreconfig\"" 

Essaye-le :

 echo $cmd mysql AMORE -u username -ppassword -h localhost -e"SELECT host FROM amoreconfig" 

Essayez d’exécuter en faisant:

 $cmd 

Et je reçois la page d’aide de mysql:

 mysql Ver 14.14 Dissortingb 5.1.31, for pc-linux-gnu (i686) using readline 5.1 Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redissortingbute it under the GPL license Usage: mysql [OPTIONS] [database] (...) 

Je suppose que je fais quelque chose de mal avec les citations, mais je ne peux pas savoir quel est le problème.

As-tu essayé:

 eval $cmd 

Pour la question suivante sur la manière de s’échapper * car elle a une signification particulière lorsqu’elle est nue ou dans des chaînes entre guillemets doubles: utilisez des guillemets simples.

 MYSQL='mysql AMORE -u username -ppassword -h localhost -e' QUERY="SELECT "'*'" FROM amoreconfig" ;# <-- "double"'single'"double" eval $MYSQL "'$QUERY'" 

Bonus: il lit aussi bien: eval mysql query 😉

Utilisez un tableau, pas une chaîne, comme indiqué dans BashFAQ # 50 .

L’utilisation d’une chaîne est une pratique de sécurité extrêmement mauvaise : considérez le cas où password (ou une clause where dans la requête, ou tout autre composant) est fourni par l’utilisateur; vous ne voulez pas eval un mot de passe contenant $(rm -rf .) !


Juste exécuter une commande locale

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) "${cmd[@]}" 

Imprimer votre commande sans ambiguïté

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf 'Proposing to run: ' printf '%q ' "${cmd[@]}" printf '\n' 

Exécution de votre commande sur SSH (méthode 1: utilisation de Stdin)

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf -v cmd_str '%q ' "${cmd[@]}" ssh other_host 'bash -s' <<<"$cmd_str" 

Exécution de votre commande sur SSH (méthode 2: ligne de commande)

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf -v cmd_str '%q ' "${cmd[@]}" ssh other_host "bash -c $cmd_str" 

essaye ça

 $ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"' $ eval $cmd 

Vous n’avez pas besoin du “eval” même. Il suffit de mettre un signe de dollar devant la chaîne:

 cmd="ls" $cmd 

Pour éliminer le besoin de la variable cmd, vous pouvez le faire:

 eval 'mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'