从 PHP 配置文件中解析凭据

从 PHP 配置文件中解析凭据

我想编写 bash 脚本来解析配置文件中的数据。我搜索了这个,但没有找到可以修改以满足我的需要的东西。

乔姆拉!配置文件:

   public $access = '1';
   public $debug = '0';
   public $debug_lang = '0';
   public $dbtype = 'mysqli';
   public $host = 'localhost';
   public $user = 'template';
   public $password = 'template';
   public $db = 'template_druha';
   public $dbprefix = 'dsf1i_';
   public $live_site = '';
   public $secret = '2w9gHzPb4HfAs2Y9';
   public $gzip = '0';
   public $error_reporting = 'default';

我想用 和 解析数据库凭据"$user"并将"$password"它们存储在变量中。最佳实践是什么?

答案1

使用 GNU grep,你可以这样做:

user=$(grep -oP "\\\$user.+?'\K[^']+" file)
pass=$(grep -oP "\\\$password.+?'\K[^']+" file)

启用-PPerl 兼容正则表达式,它给我们\K(忽略到目前为止匹配的任何内容)。意思-o是“仅打印该行的匹配部分。然后,我们搜索$var(我们需要三个\,以避免扩展变量并避免$被视为正则表达式的一部分),单引号和一个或多个非'字符直到下一个'

或者,您可以使用awk

user=$(awk -F"'" '/\$user/{print $2}' file)
pass=$(awk -F"'" '/\$password/{print $2}' file)

在这里,我们将字段分隔符设置为',因此变量的值将是第二个字段。该awk命令打印匹配行的第二个字段。

答案2

对于您的示例输入:

$ cat /tmp/foo
public $access = '1';
public $debug = '0';
public $debug_lang = '0';
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'template-user';
public $password = 'template-pass';
public $db = 'template_druha';
public $dbprefix = 'dsf1i_';
public $live_site = '';
public $secret = '2w9gHzPb4HfAs2Y9';
public $gzip = '0';
public $error_reporting = 'default';

你可以这样做:

user="$(grep '$user' /tmp/foo | sed -e 's/  *$//g' -e 's/;$//' | awk -F= '{ print $2}')"
pass="$(grep '$password' /tmp/foo | sed -e 's/  *$//g' -e 's/;$//' | awk -F= '{ print $2}')"
  • grep 在给定文件中搜索用户或密码行
  • 第一个 sed 表达式删除所有尾随空格
  • 第二个 sed 表达式删除尾随 ;
  • awk 使用 = 作为列分隔符,并打印第二列
  • 评估var=$(...)所有这些,获取输出并将其存储在变量中

答案3

由于该文件是 PHP 文件,因此为其提取数据的最可靠方法是使用 PHP 解析它。如果您需要在 shell 脚本中使用数据,请编写一些 PHP 代码,以 shell 语法打印出变量分配。

#!/bin/sh
eval "$(php -r '
    include $argv[1];
    $config = new JConfig();
    echo "joomla_user=\x27" . preg_replace("/\x27/", "\x27\\\x27\x27", $config->user) . "\x27\n";
    echo "joomla_password=\x27" . preg_replace("/\x27/", "\x27\\\x27\x27", $config->password) . "\x27\n";
' /path/to/configuration.php)"
echo "User is $joomla_user"

相关内容