2017-05-17 52 views
-3

我的一位朋友(他不喜歡強密碼......)讓他的服務器遭到黑客攻擊,我試圖幫助他。服務器的php被黑了。有沒有一種方法來定位特定的字符串+標籤?

基本上,服務器上的很多php文件都在第一行添加了兩個php標籤之間的東西。

事情是這樣的:

1. <?php lots-Of-Stuff-I-Can-Target-Easily-With-Grep ?><?php 
 
2. Line 2 and beyond, the file is unchanged.

所以我的問題是:是否有通過grep的辦法 - 或者別的東西 - 只是瞄準的第一個PHP變量與兩者之間的一切刪除它?在上面的例子中,上線1:全部爲,但是第二次打開php標籤。

我知道我可以定位第1行,只是用開放的php標籤替換,但爲了避免任何問題,我更喜歡目標並刪除我想要的確切東西。

有太多的文件需要手動完成。有任何想法嗎?

+2

大多數PHP IDE的應該是能夠做到這一點。只需搜索並替換與該標籤匹配的所有內容。確保你有一個備份,以防IDE過熱。關於備份的問題:也許你應該向你的朋友講述爲什麼他應該有一個人。 –

+0

嘿,本,我去了Scheff解決方案,但仍然謝謝你! – Gamlus

回答

1

我完全同意Ben Hillier的評論。 (我的意思尤其是備份,因爲我有大約只有PHP小知識的一部分。)但是...

sed的命令可以使用以下:

sed 's/^<?php .* ?>\(<?php.*\)$/\1/' 

或者,它可以與AWK完成:

awk '/<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 

或與附加條件NR==1到確保了測試/替換僅第一行完成:

awk 'NR==1 && /<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 

其中一個命令(巧妙地與find結合)應該能夠完成這項工作。

請注意不同escapings這是必要的,sed的AWK

而且,由於Ben Hillier已經推薦:以前不要忘記備份。

示範:

$ echo '<?php lots-Of-Stuff-I-Can-Target-Easily-With-Grep ?><?php' \ 
> | sed 's/^<?php .* ?>\(<?php.*\)$/\1/' 
<?php 

$ echo '<?php' | sed 's/^<?php .* ?>\(<?php.*\)$/\1/' 
<?php 

$ echo '<?php lots-Of-Stuff-I-Can-Target-Easily-With-Grep ?><?php' | awk '/<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 

$ echo '<?php' | awk '/<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 

$ echo '<?php lots-Of-Stuff-I-Can-Target-Easily-With-Grep ?><?php' | awk 'NR==1 && /<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 

$ echo '<?php' | awk 'NR==1 && /<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 

$ cat >test.txt <<EOF 
> <?php lots-Of-Stuff-I-Can-Target-Easily-With-Grep ?><?php 
> // contents 
> // contents 
> // contents 
> ?> 
> EOF 

$ cat test.txt | sed 's/^<?php .* ?>\(<?php.*\)$/\1/' 
<?php 
// contents 
// contents 
// contents 
?> 

$ cat test.txt | awk '/<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 
// contents 
// contents 
// contents 
?> 

$ cat test.txt | awk 'NR==1 && /<\?php .* \?><\?php/ { $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) }{ print }' 
<?php 
// contents 
// contents 
// contents 
?> 

$ 

最後但並非最不重要的人讀者awk腳本:

# catch 1st line with a duplicated "<?php" 
NR==1 && /<\?php .* \?><\?php/ { 
    # replace the line by everything including and after 2nd "<?php" 
    $0 = gensub(/^<\?php.*\?>(<\?php.*)$/, "\\1", 1, $0) 
} 
{ print } # print any line 
+0

嘿謝謝謝謝你! 花了我一會兒去了解一切,並安全地嘗試,現在我準備好了 - 有很多備份! 經過幾次嘗試和錯誤,這個工作完美: 'grep -rl matchstring。 | xargs sed -i's/^ <?php $ pfnbjwxh。*?> \(<?php。* \)$/<?php/g'' _ $ pfnbjwxh_這裏允許我瞄準這種特殊的惡性和平碼。 再次,謝謝! – Gamlus

相關問題