web-dev-qa-db-fra.com

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 Distrib 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 redistribute it under the GPL license
Usage: mysql [OPTIONS] [database]
(...)

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

224
Barth

As-tu essayé:

eval $cmd

Pour la question suivante, comment échapper à * puisqu'il a une signification particulière lorsqu'il est nu ou entre guillemets: 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 Nice: eval mysql query ;-)

329
slebetman

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

Utiliser une chaîne est une pratique de sécurité extrêmement mauvaise : considérons 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 .)!


Exécuter juste 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"
45
Charles Duffy

essaye ça

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

Vous n'avez même pas besoin de "eval". Il suffit de mettre un signe dollar devant la chaîne:

cmd="ls"
$cmd
2
David Beckwith