如何使用 bash shell 脚本从 PHP 配置文件读取变量

Sea*_*all 0 bash shell

我正在尝试使用 bash 从 php 配置文件中读取一些变量,它在大部分情况下都有效,但我在尝试使用传回的值时遇到问题。
该变量在配置中找到,但当它被传回时,它仍然带有 PHP 的单引号或双引号。

这是我正在使用的。

DBPASS="$(grep -oE '\$database_password = .*;' $CONFIG | tail -1 | sed 's/$database_password = //g;s/;//g')"
Run Code Online (Sandbox Code Playgroud)

现在,变量可以用单引号或双引号括起来,并且单引号可以出现在密码字段中。所以我不能把它们全部去掉。

知道怎么做吗?

更新

因此,采用另一种方式,我在 bash 脚本(基本上备份 CMS)中添加了一些内容,该脚本将查找并编写一些 PHP“帮助程序”。该助手只会读取配置,构建一个数组并将其传递回 bash 脚本。

HELPER="backup-helper.php";

CONFIG="../core/config/config.inc.php"

if [ ! -f "$HELPER" ]; then
    echo '<?php' >> $HELPER;
    echo '$config = "$argv[1]";' >> $HELPER;
    echo 'include_once($config);' >> $HELPER;
    echo 'echo $dbase;' >> $HELPER; 
    echo 'echo $modx_core_path;' >> $HELPER;

    echo 'return "this";' >> $HELPER;
    chmod 755 $HELPER;

    php $HELPER  $CONFIG;
fi
Run Code Online (Sandbox Code Playgroud)

所以这基本上只是寻找帮助程序文件并创建它(如果它不存在),然后运行它来测试 - 这一切都有效。

我可以轻松添加逻辑以从配置文件创建我需要的数组,但是:

如何格式化它(要传回的数组)以便 bash 能够理解它?我如何将它(数组)传递回 bash?(基本上我如何告诉 bash 期望返回值?)

gho*_*oti 6

如果你感觉幸运的话,像这样:

eval $(sed -Ene '/^\$database_(username|password)/{s/ = /=/;s/^\$//;s/;$//;p;}' config.php)
Run Code Online (Sandbox Code Playgroud)

我只是在这里说,你绝对不应该这样做,这是一个坏主意,我只是作为一个反例。如果你写这样的 shell 脚本,你最终会搬起石头砸自己的脚。

像这样的事情会更安全:

db_username="$(php -r 'include("config.php"); print $database_username;')"
db_password="$(php -r 'include("config.php"); print $database_password;')"
Run Code Online (Sandbox Code Playgroud)

当然,这取决于是否有 PHP 解释器来处理 PHP 脚本的读取和解析。如果这根本不可能,那么您将面临以不完全符合 PHP 解释 PHP 脚本的方式编写基于 shell 的 PHP 解释器的风险。买家要小心,可能含有坚果等。

你可以做一些非常丑陋的事情,如下所示:

#!/usr/bin/env bash

shopt -s extglob

while read -r line; do
  #echo "line = $line"
  case "$line" in
    '$database_username = '*|'$database_password = '*)
      output="${line#\$database_+([[:alpha:]]) = }"
      output="${output#\"}"     # strip leading double quote
      output="${output%\";}"    # strip trailing double quote and semicolon
      ;;
  esac
  case "$line" in
    '$database_username = '*)
      db_username="$output"
      ;;
    '$database_password = '*)
      db_password="$output"
      ;;
  esac
done < config.php

printf 'u = %s\np = %s\n' "$db_username" "$db_password"
Run Code Online (Sandbox Code Playgroud)

这样做的优点是没有管道,它的所有功能都独立包含在 bash 脚本中。但是,如果您的 config.php 包含分号后面的空格,或分号之前的空格,或断行并以转义换行符继续,或在多行上构建的变量,例如或$database_password .= "MOAR";任何其他可能的内容,它就会中断。完全有效的 PHP。

我最喜欢的是二号门,使用 PHP 解释器来解释你的 PHP。


更新

如果您的 PHP 配置位于数组中(例如,Drupal),您可以使用如下所示将该数组导出到 bash:

declare -A conf
while IFS== read -r -d '' key value; do
  conf["$key"]="$value"
done < <( php -r 'include("config.php"); foreach ($conf as $key => $value) printf("%s=%s\0",$key,$value);')'
Run Code Online (Sandbox Code Playgroud)

这使用 bash 进程以 bash 命令可以安全读取的格式提供 PHP 数组的转储read。如果您想从 PHP 配置中读取很多内容,并且您只想启动 PHP 一次,而不是为您获取的每个值启动一次,这可能会很有帮助。

请注意,如果您的任何键包含等号,您可能需要调整此项。此外,关联数组是 bash 4 的一个功能。