Como executar um comando bash armazenado como uma string com aspas e asterisco

Eu tento executar o seguinte comando:

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

Eu guardo em uma string:

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

Teste-o :

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

Tente executar fazendo:

 $cmd 

E eu recebo a página de ajuda do 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] (...) 

Eu acho que estou fazendo algo errado com as citações, mas não consigo descobrir qual é o problema.

Você tentou:

 eval $cmd 

Para a seguinte questão sobre como escaping * uma vez que tem um significado especial quando está nu ou em strings entre aspas duplas: use aspas simples.

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

Bônus: Ele também lê nice: eval mysql query 😉

Use uma matriz, não uma string, conforme fornecido como orientação no BashFAQ # 50 .

Usar uma string é uma prática de segurança extremamente ruim : considere o caso em que a password (ou uma cláusula where na consulta ou qualquer outro componente) é fornecida pelo usuário; você não quer eval uma senha contendo $(rm -rf .) !


Apenas executando um comando local

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

Imprimindo seu comando sem ambiguidade

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

Executando seu comando sobre SSH (método 1: usando o 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" 

Executando seu comando sobre SSH (método 2: linha 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" 

tente isso

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

Você não precisa do “eval” mesmo. Basta colocar um cifrão na frente da string:

 cmd="ls" $cmd 

Para eliminar a necessidade da variável cmd, você pode fazer isso:

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