Cómo ejecutar un comando bash almacenado como una cadena con comillas y asterisco [duplicado]
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.
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 ;-)
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 eval
una 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"
prueba esto
$ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'
$ eval $cmd
Ni siquiera necesitas la "evaluación". Simplemente coloque un signo de dólar delante de la cadena:
cmd="ls"
$cmd