2012-03-27 111 views
-2

我有一些网站已遭到攻击并感染了恶意软件。Linux使用字符串查找文件并替换

有800多个文件需要更新,并且每个文件中的字符串完全相同。

我想要做的是找到所有具有恶意软件的文件,然后从文件中删除有问题的字符串。

我已经发现了一些当上基本字符串测试其做工精细的命令行脚本:

perl -pi -w -e 's/string_to_find//g;' test-file.php 

,当组合成find命令:

发现。 -type f | xargs grep'string_to_find'-sl | xargs perl -pi -w -e's/string_to_find // g;'

现在,我的问题就是如何让这对这是一个非常漫长而复杂的字符串,字符串工作:

<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir = "random_string_7365_characters_long";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYidokBoVSjr = "string_of_encoded_characters";$eva1tYldokBcVSjr=$eva1tYldakBcVSir($eva1tYldakBoVS1r);$eva1tYldakBcVSjr=$eva1tYldakBcVSir($eva1tYlbakBcVSir);$eva1tYidakBcVSjr = $eva1tYldakBcVSjr(chr(2687.5*0.016), $eva1fYlbakBcVSir);$eva1tYXdakAcVSjr = $eva1tYidakBcVSjr[0.031*0.061];$eva1tYidokBcVSjr = $eva1tYldakBcVSjr(chr(3625*0.016), $eva1tYidokBoVSjr);$eva1tYldokBcVSjr($eva1tYidokBcVSjr[0.016*(7812.5*0.016)],$eva1tYidokBcVSjr[62.5*0.016],$eva1tYldakBcVSir($eva1tYidokBcVSjr[0.061*0.031]));$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;} ?> 

现在,当我尝试搜索,并与完整的字符串替换(转义所有的特殊字符)我得到这样的结果:

Possible unintended interpolation of @error_reporting in string at -e line 1. 
Name "main::error_reporting" used only once: possible typo at -e line 1. 

是否有可能做什么,我试图做的或者说是不可能的字符串来捕捉?我需要以不同的方式转义@符号吗? (我逃过了\和没有工作)

任何帮助 - 我使用bash和Perl

+0

FAQ http://learn.perl.org/faq/perlfaq6.html#How-can-I-quote-a-variable-to-use-in-a-regex- – daxim 2012-03-27 22:21:04

+0

感谢daxim - 我没有想学perl – 2012-03-28 01:17:05

回答

0

我想通了。声明是正确的,我刚刚错过了一些角色的转义。

所以在回答我的问题,答案是:

是 - 所采用的方法是正确的,在实现理想的结果 是工程 - @符号也必须进行转义

转义字符串正确和声明正常工作。

0

你可能想打退堂鼓的命令行和使用sed新手。它正是为这种类型的问题而建立的。这里是一个很好的地方开始: IBM Developerworks SED by example

+0

试过sed - 它说这个字符串太长了 – 2012-03-28 01:44:21

1

\@应该工作,但是你有其他问题太:<?相匹配的可选<,例如,不是序列<?。据man perlre,下面应该工作:

perl -pi -w -e 's/\Q<?php \[email protected]\Qerror_reporting...//g' 

\Q关闭所有特殊的正则表达式的含义,让您精确搜索一个字符串,而不引用的每个元字符。 \ E暂时恢复特殊含义,但由于@被隔离,因此它不会被解释为数组名称的开始。您必须以相同方式围绕每个@$。然后,当然,请检查它是否正常工作!祝你好运。

编辑:事实上,我会建议用一个简单的脚本替换你的一行。定义要搜索的字符串,确保不会发生不需要的变量替换(将其打印出来以确保);禁用所有特殊字符quotemeta()以禁用其正则表达式含义;并应用于输入。这就是如果字符串真的是完全相同的;如果“random_string ...”因地而异,则需要更仔细地构建您的RE。无论如何,如果你编写一行5行perl脚本,让它在一个文件上工作,然后使用find/xargs方法将它应用到任何地方,它会让你的生活更轻松。

+0

所以我可以用\ Q ... \ E来包围整个字符串吗?除了@ – 2012-03-27 22:30:58

+0

的一次发生,不,你不能。 '$'也需要被转义。请参阅联机帮助页。 – alexis 2012-03-28 07:42:05

0

正则表达式具有可以使此任务更容易的其他功能。如果你没有用与$evalfYl开始变量任何有效的代码,那么你可以使用更简单的正则表达式用更少的逃脱

perl -pi -w -e \ 
's/<\?php \@error_reporting\(0\);if \(!isset(\$evalYl.*?} \?>//g' \ 
test-file.php 

其中.*?将匹配任何字符最多的“下一次出现}?>“在字符串中。

+0

好的,但是如果我这样做了也没有关系,因为它需要在@error_reporting(0)之前...反正不是吗?此外,你已经逃脱了@所以我需要在perl中逃避这一点? – 2012-03-28 01:12:01