SED命令在现有PHP文件的开头替换复杂的PHP字符串

时间:2016-02-17 17:38:57

标签: php bash sed

我决定在我看到攻击的几个基于PHP的网站上安装ZB Block。所有网站都在Ubuntu 14.04 LTS / Apache 2.4 / PHP 5.5.9上运行

需要在每个.php文件的开头插入ZB Block脚本调用。为了在多个网站上的所有.php文件中自动替换字符串,我做了一个sed语句来在第一次出现时执行替换。

sed '#s:<?php:<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php#’ First-Occurence-Replacement-Sample.php > First-Occurence-Replacement-Sample.tmp && mv First-Occurence-Replacement-Sample.tmp First-Occurence-Replacement-Sample-NEW.php

运行sed语句给出了以下结果:
 1文件名为First-Occurence-Replacement-Sample-NEW.php,GOOD
 2未进行所需的字符串替换。 BAD

 # ls -l
 -rw-r--r-- 1 root root 39 Feb 17 15:40 First-Occurence-Replacement-Sample-NEW.php
 -rw-r--r-- 1 root root 39 Feb 17 15:13 First-Occurence-Replacement-Sample.php

 # nano First-Occurence-Replacement-Sample-NEW.php

 Line 1 <?php <<< string wasn’t replaced as desired.
 Line 2 /***************************************************************************
 Line 3 <?php <<< This second occurrence should never be replaced
 Line 4 ?> ?>

所需的sed语句行为

字符串替换前的示例文件

 Line 1 <?php
 Line 2 /***************************************************************************
 Line 3 <?php
 Line 4 ?>

替换字符串后的示例文件

 Line 1 <?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php
 Line 2 /***************************************************************************
 Line 3 <?php <<< This second occurrence should never be replaced
 Line 4 ?> ?>

如何更改sed语句以实现所需的替换?

我可以获得帮助让这个sed语句正常工作后我想把它放在一个脚本中,在整个.php文件的目录上运行替换,如下所示:

创建脚本文件:  #nano zbblock-string-insertion.bash

 #! /bin/bash
 for f in *.php
 do
 echo "Converting $f"
 sed '#s:<?php:<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php#’ $f > $f.tmp && mv $f.tmp $f
 done

保存文件zbblock-string-insertion.bash,使其可执行,然后运行它!

Kenavoz, 它有效,谢谢!你的天才!不要让你的姻亲告诉你任何不同。

要递归目录,请将Kenavox提供的命令行修改为:

find -name '*.php' -type f -exec sed -I.........

现在。该命令执行递归替换。

1 个答案:

答案 0 :(得分:0)

希望这可以提供帮助:

find . -name *.php -type f -exec sed -i "1 s~<?php~<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?>&~" {} \;

它找到当前目录中或之下的所有php文件,并将sed命令应用于每个。

sed命令将php require命令添加到文件第一行中的第一个匹配项。