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

问题描述 投票:1回答:1

我脚本一个小工具,我解决WordPress网站用。

这个脚本有一个函数调用wpsql我通过SQL查询到。然后,它调用名为wpdb_creds另一个函数。 wpdb_creds回声5个变量从wp-config.php解析;数据库主机,名称,用户名和密码,按照这个顺序。 wpsql在一个局部变量作为字符串抓住这些变量并将它们存储。然后将局部变量被分割为一个阵列,并存储在使用IFS另一个变量。然后我用mysql命令,给它的数据库凭证和查询执行查询。从这个输出中回显。

然而,我在的问题,该脚本将返回列名,以及从查询的输出。例如,当我执行查询诸如(忽略%table_prefix%,它就会被替换为wp-config.php数据库表前缀wpsql使用SED):

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';");
}
mysql linux wordpress bash
1个回答
0
投票

传递-N或--skip-列名到mysql命令解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.