Как выполнить команду bash, сохраненную в виде строки с кавычками и звездочкой

Я пытаюсь выполнить следующую команду:

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

Я храню его в строке:

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

Проверьте это:

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

Попробуйте выполнить:

$cmd

И я получаю страницу справки 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]
(...)

Я думаю, что я делаю что-то не так с кавычками, но не могу понять, в чем проблема.

Ответ 1

Вы пробовали:

eval $cmd

Для последующего вопроса о том, как избежать *, поскольку он имеет особый смысл, когда он голый или в двойных кавычках: используйте одинарные кавычки.

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

Бонус: он также читает хороший: eval mysql query; -)

Ответ 2

Используйте массив, а не строку, как указано в руководстве в BashFAQ # 50.

Использование строки является крайне плохой практикой безопасности: рассмотрим случай, когда password (или условие where в запросе, или любой другой компонент) предоставляется пользователем; Вы не хотите, чтобы eval пароль, содержащий $(rm -rf.) !


Просто запускаю локальную команду

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

Печать вашей команды однозначно

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

Выполнение вашей команды через SSH (Метод 1: Использование 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"

Запуск вашей команды через SSH (Метод 2: Командная строка)

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"

Ответ 3

попробуйте это

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

Ответ 4

Вам не нужно даже "eval". Просто поставьте знак доллара перед строкой:

cmd="ls"
$cmd

Ответ 5

Чтобы устранить необходимость в переменной cmd, вы можете сделать это:

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