web-dev-qa-db-ja.com

PHP構成ファイルから資格情報を解析します

設定ファイルのデータを解析するbashスクリプトを書きたいのですが。私はこれを検索しましたが、自分のニーズに合うように変更できるものを見つけることができませんでした。

Joomla!設定ファイル:

   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"の行のデータベース資格情報を解析し、それらを変数に格納したいと思います。ベストプラクティスは何ですか?

2
Ydenda

GNU grepを使用すると、次のことができます。

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

-Pは、Perl互換の正規表現を有効にします。これにより\Kが得られます(これまでに一致したものはすべて無視してください)。 -oは、「行の一致する部分のみを出力することを意味します。次に、$var(変数の展開を回避し、\が正規表現の一部として使用されないようにするために3つの$が必要です)、1つの引用符と1つまたは次の'まで、より多くの非'文字。

または、awkを使用することもできます。

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

ここでは、フィールド区切り文字を'に設定しているため、変数の値は2番目のフィールドになります。 awkコマンドは、一致する行の2番目のフィールドを出力します。

3
terdon

このファイルはPHPファイルであるため、データを抽出する最も信頼できる方法は、PHPで解析することです。シェルスクリプトでデータを使用する必要がある場合は、シェル構文で変数の割り当てを出力するPHPコードを記述します。

#!/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"

サンプル入力の場合:

_$ 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式は、末尾の空白を削除します
  • 2番目のsed式は、末尾の;を削除します。
  • Awkは列区切り文字として=を使用し、2番目の列を出力します
  • var=$(...)はそれらすべてを評価し、出力を取得して変数に格納します
1
Andy Dalton