Как выполнить команду 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"'