如何用Bash脚本从env.php提取MySQL的dbname、用户名及密码?
提取Magento env.php中MySQL认证信息的Bash方案
一、定位正确的env.php文件
由于存在备份、开发站点等冗余文件,可通过路径过滤排除非生产环境的文件,命令如下:
find ~ -path "*/html/app/etc/env.php" ! -path "*backup*" ! -path "*dev*" ! -path "*staging*" ! -path "*test*"
- 该命令仅查找用户家目录下标准
html/app/etc/路径下的env.php,同时排除包含backup/dev/staging/test的备份/测试站点路径 - 如果未找到结果,可去掉过滤条件,直接查找所有env.php,再通过
ls -lt查看修改时间判断活跃站点(最新修改的大概率是正在使用的):
find ~ -path "*/html/app/etc/env.php" | xargs ls -lt
二、提取指定配置块的MySQL信息
使用awk脚本精准定位db配置块下的default连接,仅提取目标字段,避免匹配其他配置块(如Redis):
单文件提取命令
awk -F"'" '/\'db\' => \[/{in_db=1} in_db && /\'default\' => \[/{in_default=1} in_default && /\'dbname\'|username|password/{print $2": "$4} in_default && /\]/{in_default=0} in_db && /\]/{in_db=0}' /path/to/your/env.php
批量提取脚本
将以下内容保存为extract_mysql_creds.sh,方便日常使用:
#!/bin/bash # 查找符合条件的env.php文件 env_files=$(find ~ -path "*/html/app/etc/env.php" ! -path "*backup*" ! -path "*dev*" ! -path "*staging*" ! -path "*test*") # 如果未找到,放宽条件查找所有相关文件 if [ -z "$env_files" ]; then echo "未找到过滤后的文件,列出所有可能的env.php:" env_files=$(find ~ -path "*/html/app/etc/env.php") fi # 遍历文件并提取信息 for file in $env_files; do echo "=== 来自文件: $file ===" awk -F"'" '/\'db\' => \[/{in_db=1} in_db && /\'default\' => \[/{in_default=1} in_default && /\'dbname\'|username|password/{print $2": "$4} in_default && /\]/{in_default=0} in_db && /\]/{in_db=0}' "$file" echo "" done
使用步骤
- 赋予脚本执行权限:
chmod +x extract_mysql_creds.sh
- 运行脚本:
./extract_mysql_creds.sh
脚本说明
awk通过标记变量in_db和in_default,仅在进入db配置块及子级default连接块时,提取dbname/username/password字段- 以单引号
'为分隔符,直接获取键值对中的内容,避免复杂的正则匹配
内容的提问来源于stack exchange,提问作者procyon108
相关产品推荐
相关产品推荐

