Cómo ejecutar un comando bash almacenado como una cadena con comillas y asterisco [duplicado]

Resuelto Barth asked hace 14 años • 5 respuestas

Intento ejecutar el siguiente comando:

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

Lo guardo en una cadena:

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

Pruébalo :

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

Intente ejecutar haciendo:

$cmd

Y obtengo la página de ayuda 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]
(...)

Supongo que estoy haciendo algo mal con las comillas pero no puedo descubrir cuál es el problema.

Barth avatar Jan 05 '10 16:01 Barth
Aceptado

Has probado:

eval $cmd

Para la siguiente pregunta sobre cómo escapar, *ya que tiene un significado especial cuando está desnudo o entre comillas dobles: use comillas simples.

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

Bonificación: también se lee bien: consulta eval mysql ;-)

slebetman avatar Jan 05 '2010 09:01 slebetman

Utilice una matriz, no una cadena, como se indica como guía en BashFAQ #50 .

Usar una cadena es una práctica de seguridad extremadamente mala : considere el caso donde password(o una cláusula dónde en la consulta, o cualquier otro componente) es proporcionada por el usuario; ¡No quieres evaluna contraseña que contenga $(rm -rf .)!


Simplemente ejecutando un comando local

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

Imprimir su comando sin ambigüedades

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

Ejecutar su comando a través de SSH (Método 1: usar 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"

Ejecutar su comando a través de SSH (Método 2: Línea de comando)

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"
Charles Duffy avatar Aug 28 '2015 21:08 Charles Duffy

prueba esto

$ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'
$ eval $cmd
ghostdog74 avatar Jan 05 '2010 10:01 ghostdog74

Ni siquiera necesitas la "evaluación". Simplemente coloque un signo de dólar delante de la cadena:

cmd="ls"
$cmd
David Beckwith avatar Aug 28 '2015 21:08 David Beckwith