mysql bash脚本从用户的env.php中提取文本?

vuv7lop3  于 2023-01-01  发布在  Mysql
关注(0)|答案(2)|浏览(93)

我在一家网站托管公司工作。我是一个绿色,作为新手,我对客户的服务器只有非根权限。通常,我需要排除mysql故障。因为我没有根权限,我必须使用客户的mysql凭据。这些可以在

~/<domain>/html/app/etc/env.php

示例块:

'db' => [
        'table_prefix' => '',
        'connection' => [
            'default' => [
                'host' => 'localhost',
                'dbname' => 'xxxxx',
                'username' => 'xxxxx',
                'password' => 'xxxxx',
                'model' => 'mysql4',
                'engine' => 'innodb',
                'initStatements' => 'SET NAMES utf8;',
                'active' => '1',
                'driver_options' => [
                    1014 => false

我需要从每个唯一服务器上的这个文件块中提取dbname、username和password。到目前为止,我一直使用cat,但是由于每个服务器都有其唯一路径的env.php(基于域名)我不知道如何一次性完成这个操作。使用find来搜索~/中的env.php是不起作用的,因为客户经常会复制他们的站点用于备份和开发目的,创建多个同名文件。
我的bash是非常基本的。任何提示都很感激,会让我的工作效率高得多。
到目前为止,我一直在手动移动到网站目录,并导航到我需要的文件。这很耗时。
编辑:使用基本的grep来查找文件中的这些字段不起作用,因为它返回所有块(redis等)的凭据,而不仅仅是mysql用户名/密码。

carvr3hs

carvr3hs1#

sed可以很好地添加到您的工具箱中,因为您可以指定范围切换和要执行的块等内容。

$: sed -En "/^'db' *=>/,/]/{ /'connection' *=>/,/]/{ /'(dbname|username|password)' *=>/p }; }" file
            'dbname' => 'xxxxx',
            'username' => 'xxxxx',
            'password' => 'xxxxx',

显然,awk非常适合于编程性更强的解决方案,但是已经有人解决了这个问题。

2admgd59

2admgd592#

一个grep解决方案依赖于与您的示例匹配的'db'配置块的格式,该解决方案将使用grep的-B开关来请求与=> 'mysql[0-9]*'匹配的行之前的3行。这假定前面的3行是'dbname,username,and password'。因此,这可能相当脆弱。

grep -B 3 "=> 'mysql[0-9]*'" /path/to/your/env.php | grep 'dbname\|username\|password'
                'dbname' => 'xxxxx',
                'username' => 'xxxxx',
                'password' => 'xxxxx',

另一个选项(可能更不脆弱)是使用awk

awk -F'=>' '/^'\''db'\'' => \[/ {flag=1} /dbname|password|username/ && flag==1 {gsub(/'\''|,/,""); print $2} /^\]/ && flag==1 {flag=0}' /path/to/your/env.php 
 xxxxx
 xxxxx
 xxxxx

这个awk命令将显式地在数据库配置块中查找dbname、password和username行,然后打印这些配置的值,该命令还将去掉输出中的单引号和尾随逗号。

相关问题