脚本执行mysql查询并返回列名+结果

时间:2014-12-23 01:26:15

标签: mysql linux wordpress bash

我正在编写一个小工具,用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';");
}

1 个答案:

答案 0 :(得分:0)

将-N或--skip-column-names传递给mysql命令解决了这个问题。