如何在多个文件中删除恶意代码行并使用正则表达式替换为开放的php标记?

时间:2017-04-21 19:03:25

标签: regex sed

我在我的服务器中使用域用于开发网站,我将它们全部作为子域放在同一个域中,如client1.mydomain.com,client2.mydomain.com等。好吧,所有这些网站都是恶意代码的目标,似乎它始终是文件中的第一行 - 它们似乎是网站中的所有文件。

我正在寻找一种方法来删除这种恶意代码行,但是用开放的php标记替换它 - 或者只删除恶意代码的东西,而不是我打开的php标记。

这是恶意行的样子:

<?php $vhilmjpo = 'x53 105 x53 137 ........ (it goes like this with random strings and numbers for a long while) .... (and it finishes with the ending php tag) ... ?>

问题在于,有时我的文件以php开头标记开头,有时它只是简单的html,所以我不能删除完整的行并替换为<?php

因此,有时,文件的开头如下:

<?php $vhilmjpo = 'x53 .......?><?php

有时它是这样的:

<?php $vhilmjpo = 'x53 .......?><div class="whatever">

我过去曾使用过sed,它证明有很大的帮助,但我不知道如何为这个特殊情况做这件事。

如果我的所有文件都有自己的恶意行,那么像这样的东西可以工作,但事实并非如此:

sed -i '/vhilmjpo/d'

知道如何做到这一点?我想的可能只是一个正则表达式,只匹配php标签,如<?php $vhilmjpo[.+?]\?>,并用空字符串替换所有这些。

1 个答案:

答案 0 :(得分:1)

你可以尝试这个:

sed '1{s/<?php \$vhilmjpo\([^?]\|??*[^?>]\)*?>//}' file

如果按预期工作,则添加-i开关。

细节:

1   # if the first line is processed then: 
{
    s/<?php \$vhilmjpo\([^?]\|??*[^?>]\)*?>// # replace from the opening tag followed
                                # by "$vhilmjpo" until the next closing tag
}