我尝试执行以下命令:
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] (...)
我想我正在做一些关于引号的错误但却无法找出问题所在.
你有没有尝试过:
eval $cmd
关于如何逃避的后续问题,*
因为它在裸体或双引号字符串中具有特殊含义时:使用单引号.
MYSQL='mysql AMORE -u username -ppassword -h localhost -e' QUERY="SELECT "'*'" FROM amoreconfig" ;# <-- "double"'single'"double" eval $MYSQL "'$QUERY'"
奖励:它也读得很好:eval mysql查询;-)
使用数组,而不是字符串,如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'
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"
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"
试试这个
$ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"' $ eval $cmd