Shell-Script

如何通過 grep 獲取 php 函式的參數?

  • April 18, 2013

我正在編寫一個腳本,讓我知道我正在遷移的伺服器上每個基於 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 文件以獲取標記,以獲取它們的值;

我不確定您在這裡要做什麼,但是您可以使用以下命令“以非字母數字字元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

此腳本將查找所有 .php 文件,對每個文件進行 grep 查找您感興趣的變數,然後在找到它的文件中列印每個變數的第一個實例。例如,我創建了 2 個 .php 文件aa.phpbb.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';

引用自:https://unix.stackexchange.com/questions/72379