我正在编写一个脚本,让我了解要迁移的服务器上每个基于 PHP 的网站的数据库登录信息。登录信息通常是这样完成的:
$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';
mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);
或者像这样:
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
该脚本正在搜索包含 PHP 连接函数之一的每一行:
grep -irE "mysql_connect\|mysql_select_db\|new PDO" *
现在,如何获取$
以非字母数字开头和结尾的每个字符串?此外,如果;
屏幕上没有找到字符,我希望收到通知,以便我可以手动处理它,因为某些编码员可能会这样做:
$pdo = new PDO("mysql: host={$servername};
dbname={$$database_name}",
$database_username,
$database_password
);
获得这些标记(PHP 变量)后,我将再次 grep 文件查找标记,希望获得它们的值;
答案1
我不太确定你在这里想做什么,但是你可以用以下方法“以非字母数字字符grep
开头和结尾的所有字符串”:$
grep -oP '\$.+?\W'
为了回应你的评论,像这样的事情怎么样:
for f in `find . -name "*.php"`; do \
echo "----- $f -----";
for s in $(grep -iE "mysql_connect|mysql_select_db|new PDO" $f |
grep -oP '\$\w+?\W' | sed 's/.$//' | sort | uniq); do \
grep -m 1 $s $f;
done;
done
此 scriptlet 将找到所有 .php 文件,对每个文件进行 grep 查找您感兴趣的变量,然后打印找到的文件中每个变量的第一个实例。例如,我创建了 2 个 .php 文件,aa.php
并且bb.php
,它们的内容是:
$ cat aa.php
$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';
mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);
$ cat bb.php
$servername='localhost2';
$database_username='some2Name';
$database_password='p@ssw0rd2';
$database_name='someDatabase2';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
上面脚本的输出是:
----- ./bb.php -----
$database_name='someDatabase2';
$database_password='p@ssw0rd2';
$database_username='some2Name';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
$servername='localhost2';
----- ./aa.php -----
$database_name='someDatabase';
$database_password='p@ssw0rd';
$database_username='someName';
$servername='localhost';