我正在尝试使用 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 期望返回值?)
如果你感觉幸运的话,像这样:
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 的一个功能。