analisa as credenciais do arquivo de configuração do PHP

1

Gostaria de escrever um script bash para analisar dados de um arquivo de configuração. Eu procurei por isso, mas sem encontrar algo que eu pudesse modificar para atender às minhas necessidades.

Joomla! arquivo de configuração:

   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';

Gostaria de analisar as credenciais do banco de dados nas linhas com "$user" e "$password" e armazená-las em uma variável. Qual é a melhor prática?

    
por Ydenda 16.09.2015 / 18:27

3 respostas

2

Com o GNU grep , você poderia fazer:

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

O -P ativa as Expressões Regulares Compatíveis com Perl, que nos fornecem \K (ignore qualquer coisa correspondida até o momento). O -o significa "imprimir apenas a parte correspondente da linha. Em seguida, procuramos $var (precisamos de três \ , para evitar expandir a variável e evitar que o $ seja considerado como parte da regex ), uma aspa simples e um ou mais caracteres que não são ' até o próximo ' .

Como alternativa, você pode usar awk :

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

Aqui, estamos definindo o delimitador de campo para ' , então o valor da variável será o segundo campo. O comando awk imprime o segundo campo de linhas correspondentes.

    
por 16.09.2015 / 18:57
1

Para sua entrada de amostra:

$ 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';

Você poderia fazer:

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}')"
  • O grep procura as linhas de usuário ou senha no arquivo fornecido
  • A primeira expressão sed remove qualquer espaço em branco
  • A segunda expressão sed remove o rastro;
  • O awk usa = como o delimitador de coluna e imprime a segunda coluna
  • O var=$(...) avalia tudo isso, pega a saída e armazena na variável
por 16.09.2015 / 18:45
1

Como esse arquivo é um arquivo PHP, a maneira mais confiável de extrair dados é analisá-lo com o PHP. Se você precisar usar os dados em um script shell, escreva algum código PHP que imprima as atribuições de variáveis na sintaxe do 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"
    
por 17.09.2015 / 02:18