我正在编写一个小工具,用Word解析wordpress网站。
这个脚本有一个名为wpsql的函数,我将SQL查询传递给它。然后,它调用另一个名为wpdb_creds
的函数。 wpdb_creds echos从wp-config.php
解析的5个变量;按顺序的数据库主机,名称,用户名和密码。 wpsql捕获这些变量并将它们作为字符串存储在局部变量中。然后将局部变量拆分为一个数组,并使用IFS存储在另一个变量中。然后我使用mysql命令执行查询,为其提供数据库凭据和查询。这个输出是echo'd。
但是,我遇到的问题是,脚本将返回列名以及查询的输出。例如,当我执行诸如(ignore %table_prefix%
之类的查询时,它将使用wpsql中的sed替换为wp-config.php
中的数据库表前缀:
SELECT option_value FROM %table_prefix%options WHERE option_name='active_plugins';
我得到的输出是:
option_value a:5:{i:0;s:29:"gravityforms/gravityforms.php";i:1;s:45:"no-captcha-recaptcha/no-captcha-recaptcha.php";i:2;s:25:"relevanssi/relevanssi.php";i:3;s:41:"woot-search-engine/woot-search-engine.php";i:4;s:23:"wordfence/wordfence.php";}
不应该在输出中返回 option_value
,我无法弄清楚它为什么会这样做。以下是涉及的功能:
function wp_domain_root {
found=false;local root='';cwd=${PWD}
IFS="/" read -a dirs <<< "$cwd"
for((i="${#dirs[@]}"; i>0; i--)); do
tmp_dir=""
for((ii=0;ii < $i; ii++)); do
tmp_dir+="${dirs[ $ii ]}/"
done
if [ -f $tmp_dir"/wp-config.php" ]; then root=$tmp_dir; break; fi
done
echo $root
}
function wpdb_creds {
local domain_root=$(wp_domain_root)
if [[ ${#domain_root} -ge 5 ]]; then
read -r dbhost dbname dbpass dbuser dbprefix <<< $(cat $domain_root"wp-config.php" | egrep "^[^/].*[\"']DB_(NAME|USER|PASSWORD|HOST[^_])|table_prefix" | sort -d | sed "s/.*[\"']\(.*\)[\"'].*;.*/\1/" )
if [[ ! -z $1 && $1 == '-p' ]]; then
echo -e "\nWP Database Info\n\tHostname: "$dbhost"\n\tDatabase: "$dbname"\n\tPassword: "$dbpass"\n\tUsername: "$dbuser"\n\tPrefix: "$dbprefix"\n";
else
local dbcreds=($dbhost $dbname $dbpass $dbuser $dbprefix)
echo "${dbcreds[@]}"
fi; else echo -e 'Could not find a wp-config.php file...'; fi
}
function wp_sql {
args=$@
local query=$(IFS=" "; echo "${args[*]}")
if [[ ! -z $1 ]]; then
local dbcredstr=$(wpdb_creds)
IFS=" " read -a dbcreds <<< "$dbcredstr"
if [ "${#dbcreds[@]}" -eq 5 ]; then
sql_query=$(echo $query | sed "s/%table_prefix%/${dbcreds[4]}/g")
echo $(mysql -u "${dbcreds[3]}" -p"${dbcreds[2]}" -h "${dbcreds[0]}" -D "${dbcreds[1]}" -e "$sql_query" 2>&1)
fi
fi
}
function wpplug_print_active {
echo $(wp_sql "SELECT option_value FROM %table_prefix%options WHERE option_name='active_plugins';");
}
答案 0 :(得分:0)
将-N或--skip-column-names传递给mysql命令解决了这个问题。