Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bashshell脚本从PHP配置文件中读取变量_Bash_Shell - Fatal编程技术网

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

如何使用bashshell脚本从PHP配置文件中读取变量,bash,shell,Bash,Shell,我正在尝试使用bash从php配置文件中读取一些变量&它在大部分情况下都能正常工作,但我在尝试使用返回的值时遇到了问题。 变量可以在config中找到,但是当它被传回时,它周围仍然有来自PHP的单引号或双引号 这是我正在使用的 DBPASS="$(grep -oE '\$database_password = .*;' $CONFIG | tail -1 | sed 's/$database_password = //g;s/;//g')" 现在,变量可以用单引号或双引号括起来,密码字段中可以

我正在尝试使用bash从php配置文件中读取一些变量&它在大部分情况下都能正常工作,但我在尝试使用返回的值时遇到了问题。
变量可以在config中找到,但是当它被传回时,它周围仍然有来自PHP的单引号或双引号

这是我正在使用的

DBPASS="$(grep -oE '\$database_password = .*;' $CONFIG | tail -1 | sed 's/$database_password = //g;s/;//g')"
现在,变量可以用单引号或双引号括起来,密码字段中可以有单引号。所以我不能把它们都去掉

你知道怎么做吗

更新

因此,从另一个角度来看,我在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
HELPER=“backup HELPER.php”;
CONFIG=“../core/CONFIG/CONFIG.inc.php”
如果[!-f“$HELPER”];然后

echo'如果你感到幸运,可以这样做:

eval $(sed -Ene '/^\$database_(username|password)/{s/ = /=/;s/^\$//;s/;$//;p;}' config.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"
我只想说,你绝对不应该这样做,这是一个坏主意,我只是作为一个反例。如果你写这样的shell脚本,你最终会自食其果

这样做会更安全:

db_username="$(php -r 'include("config.php"); print $database_username;')"
db_password="$(php -r 'include("config.php"); print $database_password;')"
当然,这取决于周围有一个PHP解释器来处理PHP脚本的读取和解析。如果这是不可能的,那么编写基于shell的PHP解释器的方式可能与PHP解释PHP脚本的方式不完全一致。买方注意,可能含有坚果等

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

eval $(sed -Ene '/^\$database_(username|password)/{s/ = /=/;s/^\$//;s/;$//;p;}' config.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"
这使用bash进程以一种可以由bash的
read
命令安全读取的格式提供PHP数组的转储。如果您想从PHP配置中读取很多内容,并且只想启动一次PHP,而不是为获取的每个值启动PHP,那么这可能是有利的


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

如果您感到幸运,可以这样做:

eval $(sed -Ene '/^\$database_(username|password)/{s/ = /=/;s/^\$//;s/;$//;p;}' config.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"
我只想说,你绝对不应该这样做,这是一个坏主意,我只是作为一个反例。如果你写这样的shell脚本,你最终会自食其果

这样做会更安全:

db_username="$(php -r 'include("config.php"); print $database_username;')"
db_password="$(php -r 'include("config.php"); print $database_password;')"
当然,这取决于周围有一个PHP解释器来处理PHP脚本的读取和解析。如果这是不可能的,那么编写基于shell的PHP解释器的方式可能与PHP解释PHP脚本的方式不完全一致。买方注意,可能含有坚果等

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

eval $(sed -Ene '/^\$database_(username|password)/{s/ = /=/;s/^\$//;s/;$//;p;}' config.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"
这使用bash进程以一种可以由bash的
read
命令安全读取的格式提供PHP数组的转储。如果您想从PHP配置中读取很多内容,并且只想启动一次PHP,而不是为获取的每个值启动PHP,那么这可能是有利的


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

在纯PHP中,在该管道中执行的任何操作都不会有问题。将
$CONFIG
拉入一个数组并进行本机处理怎么样?我试图将PHP变量读入一个bash shell脚本,而不是用PHP做任何事情,只是读取一个CMS配置文件,以便bash可以运行自动更新。如果您需要在PHP脚本中使用这些值,我建议使用PHP函数
include()
文件,然后选择要作为函数返回值传回的变量(如果有多个变量,则在数组中)。但是,如果您真的试图提取PHP变量值,以便在shell脚本中使用,我会在答案中添加一些选项。您在该管道中所做的任何事情在纯PHP中都不会有问题。将
$CONFIG
拉入一个数组并进行本机处理怎么样?我试图将PHP变量读入一个bash shell脚本,而不是用PHP做任何事情,只是读取一个CMS配置文件,以便bash可以运行自动更新。如果您需要在PHP脚本中使用这些值,我建议使用PHP函数
include()
文件,然后选择要作为函数返回值传回的变量(如果有多个变量,则在数组中)。但是,如果您真的试图提取PHP变量值以在shell脚本中使用,我将在答案中添加一些选项。另外还有一个选项用于
PHP-r
方法。这是一个正确的方法,至少对于生产解决方案来说是这样。在这个问题上有点另辟蹊径-请参阅我的更新版本question@SeanKimball,没有显示编辑。您是否创建了一个新问题?如果我可以控制配置文件的格式,您的解决方案看起来不错,但不幸的是,我没有。不能保证值周围有空格或单引号/双引号。因此出现了“帮助文件”。。您以更新现有问题的形式提出了一个新问题。我对你新问题的回答是我现有答案中的“第二扇门”。让PHP解析PHP。但你不需要助手应用程序。只要按照我的建议使用
php-r
,再加上
php-r
方法。这是一个正确的方法,至少对于生产解决方案来说是这样。在这个问题上有点另辟蹊径-请参阅我的更新版本question@SeanKimball,没有显示编辑。您是否创建了一个新问题?如果我可以控制配置文件的格式,您的解决方案看起来不错,但不幸的是,我没有。不能保证值周围有空格或单引号/双引号。因此出现了“帮助文件”。。您以更新现有问题的形式提出了一个新问题。我对你新问题的回答是我现有答案中的“第二扇门”