2012-03-27 106 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

相關問題