Comment exécuter une commande bash stockée sous forme de chaîne de caractères Avec guillemets et astérisque [dupliquer]

cette question a déjà une réponse ici:

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""

Test :

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

essayer 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 tout à fait erroné avec les citations mais ne peut pas trouver ce qui est le problème.

190
demandé sur Stephane Rolland 2010-01-05 12:55:04

5 réponses

avez-vous essayé:

eval $cmd

pour la question suivante sur la façon d'échapper à * car il a un sens particulier quand il est nu ou dans des cordes double Cité: 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: requête eval mysql ; -)

268
répondu slebetman 2010-01-05 15:27:22

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

utiliser une chaîne de caractères est extrêmement mauvaise pratique de sécurité : considérez le cas où password (ou une clause où 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 .) !


La Simple Exécution D'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écuter votre commande sur SSH (Méthode 1: utiliser 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écuter 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"
36
répondu Charles Duffy 2018-04-06 17:18:12

essayez cette

$ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'
$ eval $cmd
22
répondu ghostdog74 2010-01-05 10:03:29

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

cmd="ls"
$cmd
1
répondu David Beckwith 2015-08-28 21:22:25

pour éliminer la nécessité de la variable cmd, vous pouvez faire ceci:

eval 'mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'
-3
répondu Paul Havens 2015-01-27 17:15:34