2017-02-16 64 views
1

我的一个网站受到了一些恶意代码的感染。该代码只添加到所有PHP文件的第一行,如下所示:删除sed中的长字符串

<?php $ulhmjwklj = '#-#O#-#N# .......xqxe-1; ?> /*BEGIN LEGIT CODE HERE*/ <?php.... 

恶意代码是成千上万个字符长,有很多的特殊字符和空格,所以我试图创建一个脚本来删除它:而在第一线留下合法的代码

for i in $(find . -name \*.php); do 
    sed -i -E "s/<\?php\s$ulhmjwklj.*\?>//" $i; 
    echo $i; 
done; 

sed命令将正确地删除恶意代码,但随后在随后的所有线路将其删除所有<?php ... ?>标签。所以,我想改变sed命令只查找/替换在第一行:

for i in $(find . -name \*.php); do 
    sed -i -E "1s/<\?php\s$ulhmjwklj.*\?>//" $i; 
done; 

现在sed命令只能在每个文件的第一行上运行,但同时也除去了附加任何合法的PHP代码到恶意代码后直接到第一行。

有人可以请解释我哪里错了吗?

+0

固定在所有文件中的恶意代码的长度是多少?或者它是不同的文件? – anacron

+0

另外,你总共有多少个PHP文件?他们都受到影响? – anacron

+0

'。*'是贪婪的... – jm666

回答

0

The results of find should not be put through a loop。而且,正如我在评论中提到的,$是Bash和正则表达式的特殊字符,因此必须适当处理。

最后,由于jm666在评论中提到,.*是贪婪的,所以.*?限制搜索尽可能小。但是this won't work in sed所以我们需要使用perl代替:

find . -name '*.php' -print -exec perl -p -i -e 's/<\?php \$ulhmjwklj.*?\?>//' {} \; 
+0

非常感谢您的回复。不幸的是,这并没有诀窍,首先,我必须单独添加sed“-i -E”参数,而不是象您所建议的那样组合,否则每个PHP文件都在文件名末尾添加一个“E”。一旦我解决了这个问题,上面的查找/替换查询会导致与之前一样的问题,即合法PHP标记和第1行结尾处的任何内容也会被删除。 : - /太奇怪了.. – blazebro

+0

看到我更新的答案。与'sed'一样,'peri'的'-i'选项可以进行内联文件编辑,并且可以在不更改文件的情况下将其删除以执行“空运行”。 – miken32

+0

SUCCESS !!!非常感谢。我希望sed能给我回复一些迹象。*?将无法工作。 – blazebro